php 3des加密算法以及与java,.net,c#的交互的一致性

概念性的东西:

3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。   

3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,   3DES加密过程为:C=Ek3(Dk2(Ek1(P)))   

3DES解密过程为:P=Dk1((EK2(Dk3(C)))

3DES加密算法:密钥长度不足24字节时,右补ASCII字符“0”;内容采用PKCS5Padding方式填充,即长度以8字节切分,不能被8整除的末尾部分,根据长度不足8字节的部分,填充“0x01”—“0x08”,如不足1字节,则填充1个“0x01”,如不足2字节,则填充2个“0x02”,以此类推,如整除,则填充8个“0x08”

PHP内置的mcrypt库支持多种块状加密算法,包括DES,3DES和Blowfish(默认算法)等。由于是块状加密(Block Ciper),mcrypt支持以下模式对输入字符串进行操作:CBC, OFB, CFB和ECB。

php

3des key的长度为24字节,iv为8字节.

如果提供的key为48位,可以用pack("H48", $key) , 同理iv也可以用pack("H16", $iv);

如果提供的key为32位,可以用base64_decode解码,正好也是24位.

附简单的例子以及pkcs5填充

function pkcs5_pad($text, $blocksize)
{
  $pad = $blocksize - (strlen($text) % $blocksize);
  return $text . str_repeat(chr($pad), $pad);
}

function pkcs5_unpad($text)
{
  $pad = ord($text{strlen($text)-1});
  if ($pad > strlen($text)) 
  {
    return false;
  }
  if( strspn($text, chr($pad), strlen($text) - $pad) != $pad)
  {
    return false;
  }
  return substr($text, 0, -1 * $pad);
}

$key = "20C86125F86DB932D0139D32D9208CEF52BAEC98F1E9BA2A";
$key = pack("H48", $key);
$iv = "0102030405060708";
$iv = pack("H16", $iv);

$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $key, $iv);

$str = base64_encode(mcrypt_generic($td,pkcs5_pad("helloworld",8)));
echo $str ."";
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $key, $iv);
$ttt  = pkcs5_unpad(mdecrypt_generic($td, base64_decode($str)));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo $ttt;

附网上加解密的类

<?php
Class&nbsp;Encrypt3des {
&nbsp;&nbsp;var&nbsp;$key&nbsp;=&nbsp;'20C86125F86DB932D0139D32D9208CEF52BAEC98F1E9BA2A';
&nbsp;&nbsp;var&nbsp;$iv&nbsp;='0102030405060708';

    function&nbsp;pad($text) {
        $text_add&nbsp;=&nbsp;strlen($text)&nbsp;%&nbsp;8;

        for($i&nbsp;=&nbsp;$text_add;&nbsp;$i&nbsp;<&nbsp;8;&nbsp;$i++) {
            $text&nbsp;.=&nbsp;chr(8&nbsp;- $text_add);
        } 
        return $text;
    } 

    function&nbsp;unpad($text) {

        $pad&nbsp;=&nbsp;ord($text{strlen($text)-1});

        if&nbsp;($pad&nbsp;>&nbsp;strlen($text)) {
            return&nbsp;false;
        } 
        if&nbsp;(strspn($text,&nbsp;chr($pad),&nbsp;strlen($text)&nbsp;-&nbsp;$pad)&nbsp;!=&nbsp;$pad) {
            return&nbsp;false;
        } 
        return&nbsp;substr($text,&nbsp;0,&nbsp;-1&nbsp;* $pad);
    } 

    function&nbsp;encrypt($key,&nbsp;$iv,&nbsp;$text) {

        $key_add&nbsp;=&nbsp;24&nbsp;- strlen($key);
        $key&nbsp;.=&nbsp;substr($key,&nbsp;0, $key_add);

        $text&nbsp;=&nbsp;$this&nbsp;-> pad($text);
        $td&nbsp;=&nbsp;mcrypt_module_open&nbsp;(MCRYPT_3DES,&nbsp;'',&nbsp;MCRYPT_MODE_CBC,&nbsp;'');

        mcrypt_generic_init&nbsp;($td,&nbsp;$key, $iv);

        $encrypt_text&nbsp;=&nbsp;mcrypt_generic&nbsp;($td, $text);

        mcrypt_generic_deinit($td);

        mcrypt_module_close($td);

        return $encrypt_text;
    } 

    function&nbsp;decrypt($key,&nbsp;$iv,&nbsp;$text) {
        $key_add&nbsp;=&nbsp;24&nbsp;- strlen($key);

        $key&nbsp;.=&nbsp;substr($key,&nbsp;0, $key_add);

        $td&nbsp;=&nbsp;mcrypt_module_open&nbsp;(MCRYPT_3DES,&nbsp;'',&nbsp;MCRYPT_MODE_CBC,&nbsp;'');

        mcrypt_generic_init&nbsp;($td,&nbsp;$key, $iv);

        $text&nbsp;=&nbsp;mdecrypt_generic&nbsp;($td, $text);

        mcrypt_generic_deinit($td);

        mcrypt_module_close($td);

        return&nbsp;$this&nbsp;-> unpad($text);
    } 

&nbsp;&nbsp;&nbsp;&nbsp;function encode($text){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;pack('H*',$this->key);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$iv&nbsp;&nbsp;=&nbsp;pack('H*',$this->iv);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this->encrypt($key,&nbsp;$iv, $text);

&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;function decode($text){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;pack('H*',$this->key);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$iv&nbsp;&nbsp;=&nbsp;pack('H*',$this->iv);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this->decrypt($key,&nbsp;$iv, $text);
&nbsp;&nbsp;&nbsp; }
} 


$text&nbsp;=&nbsp;'helloworld';

$crypt&nbsp;=&nbsp;new Encrypt3des();
print&nbsp;base64_encode($crypt&nbsp;-> encode($text));
print&nbsp;"<br>";
print&nbsp;$crypt&nbsp;->&nbsp;decode($crypt&nbsp;-> encode($text));
?>

来自:http://blog.sevenight.com/index.php?m=blog&a=show&id=150