首页 > 技术文章 > PHP 3DES 加解密(CBC模式,pkcs5padding填充)

yimingwang 2017-11-09 09:38 原文

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

 

推荐阅读