概念性的东西:
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 Encrypt3des { var $key = '20C86125F86DB932D0139D32D9208CEF52BAEC98F1E9BA2A'; var $iv ='0102030405060708'; function pad($text) { $text_add = strlen($text) % 8; for($i = $text_add; $i < 8; $i++) { $text .= chr(8 - $text_add); } return $text; } function 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); } function encrypt($key, $iv, $text) { $key_add = 24 - strlen($key); $key .= substr($key, 0, $key_add); $text = $this -> pad($text); $td = mcrypt_module_open (MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init ($td, $key, $iv); $encrypt_text = mcrypt_generic ($td, $text); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $encrypt_text; } function decrypt($key, $iv, $text) { $key_add = 24 - strlen($key); $key .= substr($key, 0, $key_add); $td = mcrypt_module_open (MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init ($td, $key, $iv); $text = mdecrypt_generic ($td, $text); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $this -> unpad($text); } function encode($text){ $key = pack('H*',$this->key); $iv = pack('H*',$this->iv); return $this->encrypt($key, $iv, $text); } function decode($text){ $key = pack('H*',$this->key); $iv = pack('H*',$this->iv); return $this->decrypt($key, $iv, $text); } } $text = 'helloworld'; $crypt = new Encrypt3des(); print base64_encode($crypt -> encode($text)); print "<br>"; print $crypt -> decode($crypt -> encode($text)); ?>