PHP 3DES 加解密(CBC模式,pkcs5padding填充)
1、前言:项目中接入第三方支付遇到3DES加密,以前也没用过,搜了好多,都不适用,各种不对,后来自己结合搜到的终于弄正确了,检测地址:http://tool.chacuo.net/crypt3des。
2、下面是类 适用(CBC加密模式,pkcs5padding填充)
代码:
1 /** 2 * @des 3DES加密算法,cbc模式,pkcs5Padding字符填充方式 3 */ 4 5 class TDEA 6 { 7 /** 8 * @param string $crypt 需要加密的字符串 9 * @param string $key 加密使用的密钥 10 * @param string $vi 加密使用的向量 11 * @return string $crypt 加密后的字符串 12 * @des 3DES加密 13 */ 14 final static public function encrypt($input, $key, $iv, $base64 = true) { 15 $size = 8; 16 $input = self::pkcs5_pad($input, $size); 17 $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', ''); 18 mcrypt_generic_init($encryption_descriptor, $key, $iv); 19 $data = mcrypt_generic($encryption_descriptor, $input); 20 mcrypt_generic_deinit($encryption_descriptor); 21 mcrypt_module_close($encryption_descriptor); 22 return base64_encode($data); 23 } 24 /** 25 * @param string $crypt 需要解密的字符串 26 * @param string $key 加密使用的密钥 27 * @param string $vi 加密使用的向量 28 * @return string $input 解密后的字符串 29 * @des 3DES解密 30 */ 31 final static public function decrypt($crypt, $key, $iv, $base64 = true) { 32 $crypt = base64_decode($crypt); 33 $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', ''); 34 mcrypt_generic_init($encryption_descriptor, $key, $iv); 35 $decrypted_data = mdecrypt_generic($encryption_descriptor, $crypt); 36 mcrypt_generic_deinit($encryption_descriptor); 37 mcrypt_module_close($encryption_descriptor); 38 $decrypted_data = self::pkcs5_unpad($decrypted_data); 39 return rtrim($decrypted_data); 40 } 41 42 final static private function pkcs5_pad($text, $blocksize) { 43 $pad = $blocksize - (strlen($text) % $blocksize); 44 return $text . str_repeat(chr($pad), $pad); 45 } 46 final static private function pkcs5_unpad($text) { 47 $pad = ord($text{strlen($text) - 1}); 48 if ($pad > strlen($text)){ 49 return false; 50 } 51 return substr($text, 0, -1 * $pad); 52 } 53 } 54 55 56 调用测试 57 58 $plaintext = "3DES加密测试"; 59 $key = "r0uScmDuH5FLO37AJV2FN72J";// 加密所需的密钥 60 $iv = "1eX24DCe";// 初始化向量 61 $ciphertext = TDEA::encrypt($plaintext, $key, $iv);//加密 62 $plaintext2 = TDEA::decrypt($ciphertext, $key, $iv);//解密 63 64 65 echo "<b>String:</b> $plaintext <br><br>"; 66 echo "<b>Encrypted:</b>"; 67 echo $ciphertext; 68 echo"<br><br><b>Decrypt:</b> "; 69 echo $plaintext2;
检测地址:http://tool.chacuo.net/crypt3des