首页 > 开发 > PHP > 正文

php迁移Mcrypt至OpenSSL加密算法的详细介绍(代码示例)

2024-05-04 22:01:56
字体:大 中 小
来源:转载
供稿:网友
本篇文章给大家带来的内容是关于php迁移Mcrypt至OpenSSL加密算法的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于 AES 加密算法的函数簇:Mcrypt 和 OpenSSL。

其中 Mcrypt 在 PHP 7.1.0 中被 Deprecated,在 PHP 7.2.0 中被移除,所以即可起你应该使用 OpenSSL 来实现 AES 的数据加解密。

在一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法,可能 siteA 使用了最新的 OpenSSL 来实现了 AES 加密,但作为第三方服务的 siteB 可能仍在使用 Mcrypt 算法,这就要求我们必须清楚 Mcrypt 同 OpenSSL 之间的差异,以便保证数据加解密的一致性。

下文中我们将分别使用 Mcrypt 和 OpenSSL 来实现 AES-128/192/256-CBC 加解密,二者同步加解密的要点为:

1、使用何种填充算法。Mcrypt 自动使用 NUL("//0"),OpenSSL 自动使用 PKCS7。

2、否对数据做了base64编码处理。Mcrypt 默认不使用 base64 编码(虽然我们很建议使用),OpenSSL 默认使用 base64编码。

协同好以上两点,就可以让 Mcrypt 和 OpenSSL 之间一致性的对数据进行加解密。

AES 概述

AES 是当前最为常用的安全对称加密算法,关于对称加密这里就不在阐述了。

AES 有三种算法,主要是对数据块的大小存在区别:

AES-128:需要提供 16 位的密钥 key

AES-192:需要提供 24 位的密钥 key

AES-256:需要提供 32 位的密钥 key

填充算法

AES 是按数据块大小(128/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景,这时就需要填充数据长度到加密算法对应的数据块大小。

主要的填充算法有填充 NUL("0") 和 PKCS7,Mcrypt 默认使用的 NUL("0") 填充算法,当前已不被推荐,OpenSSL 则默认模式使用 PKCS7 对数据进行填充并对加密后的数据进行了 base64encode 编码,所以建议开发中使用 PKCS7 对待加密数据进行填充,已保证通用性(alipay sdk 中虽然使用了 Mcrypt 加密簇,但使用 PKCS7 算法对数据进行了填充,这样在一定程度上亲和了 OpenSSL 加密算法)。

NUL("/0") 填充算法

Mcrypt 的默认填充算法。NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 "/0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 "/0" 手动拼接也是可以的。

  1. /**
  2.  
  3.  * NUL("/0")填充算法
  4.  
  5.  * @param string $source
  6.  
  7.  * @return string
  8.  
  9.  */
  10.  
  11. function addZeroPadding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC) 
  12.  
  13. { 
  14.  
  15.     $source = trim($source); 
  16.  
  17.     // openssl 并没有提供加密cipher对应的数据块大小的api这点比较坑
  18.  
  19.     $block = mcrypt_get_block_size($cipher, $mode); 
  20.  
  21.     $pad   = $block - (strlen($source) % $block); 
  22.  
  23.     if ($pad <= $block) { 
  24.  
  25.         // $source .= str_repeat("/0", $pad);//KISS写法
  26.  
  27.         // pack 方法 a 模式使用 NUL("/0") 对内容进行填充  A 模式则使用空白字符填充
  28.  
  29.         $source .= pack("a{$pad}", ""); //高端写法
  30.  
  31.     } 
  32.  
  33.     return $source; 
  34.  
  35. } 
  36.  
  37.  
  38.  
  39. /**
  40.  
  41.  * NUL("/0")填充算法移除
  42.  
  43.  * @param string $source
  44.  
  45.  * @return string
  46.  
  47.  */
  48.  
  49. function stripZeroPadding($source) 
  50.  
  51. { 
  52.  
  53.     return rtrim($source, "/0"); 
  54.  
  55. } 

PKCS7 填充算法

OpenSSL的默认填充算法。下面我们给出 PKCS7 填充算法 PHP 的实现:

  1. /**
  2.  
  3.  * PKCS7填充算法
  4.  
  5.  * @param string $source
  6.  
  7.  * @return string
  8.  
  9.  */
  10.  
  11. function addPKCS7Padding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC) 
  12.  
  13. { 
  14.  
  15.     $source = trim($source); 
  16.  
  17.     $block  = mcrypt_get_block_size($cipher, $mode); 
  18.  
  19.     $pad    = $block - (strlen($source) % $block); 
  20.  
  21.     if ($pad <= $block) { 
  22.  
  23.         $char = chr($pad); 
  24.  
  25.         $source .= str_repeat($char, $pad); 
  26.  
  27.     } 
  28.  
  29.     return $source; 
  30.  
  31. } 
  32.  
  33.  
  34.  
  35. /**
  36.  
  37.  * 移去PKCS7填充算法
  38.  
  39.  * @param string $source
  40.  
  41.  * @return string
  42.  
  43.  */
  44.  
  45. function stripPKSC7Padding($source) 
  46.  
  47. { 
  48.  
  49.     $source = trim($source); 
  50.  
  51.     $char   = substr($source, -1); 
  52.  
  53.     $num    = ord($char); 
  54.  
  55.     if ($num == 62) { 
  56.  
  57.         return $source; 
  58.  
  59.     } 
  60.  
  61.  
  62.  
  63.     $source = substr($source, 0, -$num); 
  64.  
  65.     return $source; 
  66.  
  67. } 

Mcrypt

默认使用 NUL("/0") 自动对待加密数据进行填充以对齐加密算法数据块长度。

获取 mcrypt 支持的算法,这里我们只关注 AES 算法。

  1. $cipher_list = mcrypt_list_algorithms(); 
  2.  
  3. print_r($cipher_list); 
  4.  
  5. //  加密算法名称  对应的 常量标识
  6.  
  7. // 'rijndael-128' == MCRYPT_RIJNDAEL_128
  8.  
  9. // 'rijndael-192' == MCRYPT_RIJNDAEL_192
  10.  
  11. // 'rijndael-256' == MCRYPT_RIJNDAEL_256

注意:mcrypt 虽然支持 AES 三种算法,但除 MCRYPT_RIJNDAEL_128 外,MCRYPT_RIJNDAEL_192/256 并未遵循 AES-192/256 标准进行加解密的算法,即如果你同其他系统通信(java/.net),使用 MCRYPT_RIJNDAEL_192/256 可能无法被其他严格按照 AES-192/256 标准的系统正确的数据解密。官方文档页面中也有人在 User Contributed Notes 中提及。这里给出如何使用 mcrpyt 做标注的 AES-128/192/256 加解密

AES-128-CBC = mcrpyt(cipher MCRYPT_RIJNDAEL_128 + key 16位 + iv 16 位 + mode MCRYPT_MODE_CBC)

AES-192-CBC = mcrpyt(cipher MCRYPT_RIJNDAEL_128 + key 24位 + iv 16 位 + mode MCRYPT_MODE_CBC)

AES-256-CBC = mcrpyt(cipher MCRYPT_RIJNDAEL_128 + key 32位 + iv 16 位 + mode MCRYPT_MODE_CBC)

即算法统一使用 MCRYPT_RIJNDAEL_128,并通过 key 的位数 来选定是以何种 AES 标准做的加密,iv 是建议添加且建议固定为16位(OpenSSL的 AES加密 iv 始终为 16 位,便于统一对齐),mode 选用的 CBC 模式。

mcrypt 在对数据进行加密处理时,如果发现数据长度与使用的加密算法的数据块长度未对齐,则会自动使用 "/0" 对待加密数据进行填充,但 "/0" 填充模式已不再被推荐,为了与其他系统有更好的兼容性,建议大家手动对数据进行 PKCS7 填充。

OpenSSL

openssl 簇加密方法更为简单明确,mcrypt 还要将加密算法分为 cipher + mode 去指定,openssl 则只需要直接指定 method 为 AES-128-CBC,AES-192-CBC,AES-256-CBC 即可。且提供了三种数据处理模式,即 默认模式 0 / OPENSSL_RAW_DATA/ OPENSSL_ZERO_PADDING。

openssl 默认的数据填充方式是 PKCS7,为兼容 mcrpty 也提供处理 "0" 填充的数据的模式,具体为下:

  1. //我们只看部分参数 还有一些默认参数没列出 
  2.  
  3. // 加密 
  4.  
  5. openssl_encrypt(string $data, string $method, string $key, int $options = 0, string $iv = "") 
  6.  
  7. // 解密 
  8.  
  9. openssl_decrypt(string $data, string $method, string $key, int $options = 0, string $iv = "") 

options 参数即为重要,它是兼容 mcrpty 算法的关键:

options = 0: 默认模式,自动对明文进行 pkcs7 padding,且数据做 base64 编码处理。

options = 1: OPENSSL_RAW_DATA,自动对明文进行 pkcs7 padding, 且数据未经 base64 编码处理。

options = 2: OPENSSL_ZERO_PADDING,要求待加密的数据长度已按 "0" 填充与加密算法数据块长度对齐,即同 mcrpty 默认填充的方式一致,且对数据做 base64 编码处理。注意,此模式下 openssl 要求待加密数据已按 "0" 填充好,其并不会自动帮你填充数据,如果未填充对齐,则会报错。

故可以得出 mcrpty簇 与 openssl簇 的兼容条件如下:

1、如果 A 系统使用了 mcrypt 的默认的 "/0" 自动填充算法进行了数据加密,那 B 系统使用 openssl 进行解密时,需要选择 OPENSSL_ZERO_PADDING 模式。这里同时要特别注意,OPENSSL_ZERO_PADDING 模式是认为数据是做了 base64 编码处理的,如果 A 系统 mcrpty 没有对数据做 base64_encode 处理,则 B 解密数据时还需要将数据 base64_encode 后再传递给 openssl_decrypt。

2、如果 A 系统手动使用了 PKCS7 对待加密数据做了处理,那 B 系统只需根据 A 系统是否对数据做了 base64 编码处理选择 0或 OPENSSL_ZERO_PADDING 模式即可。如果对 A 使用了 base64 编码,则 B 使用 0 模式;如果 A 没有使用 base64 编码,则使用 OPENSSL_RAW_DATA 模式。

加解密实例

建议将源码复制到本地运行,根据运行结果更好理解。

  1. <?php 
  2.  
  3. /** 
  4.  
  5.  * MCRYPT_RIJNDAEL_128 & CBC + 16位Key + 16位iv = openssl_encrypt(AES-128-CBC, 16位Key, 16位iv) = AES-128 
  6.  
  7.  * MCRYPT_RIJNDAEL_128 & CBC + 24位Key + 16位iv = openssl_encrypt(AES-192-CBC, 24位Key, 16位iv) = AES-192 
  8.  
  9.  * MCRYPT_RIJNDAEL_128 & CBC + 32位Key + 16位iv = openssl_encrypt(AES-256-CBC, 32位Key, 16位iv) = AES-256 
  10.  
  11.  * ------------------------------------------------------------------------------------------------------ 
  12.  
  13.  * openssl_簇 options 
  14.  
  15.  * 0 : 默认模式,自动对数据做 pkcs7 填充, 且返回的加密数据经过 base64 编码 
  16.  
  17.  * 1 : OPENSSL_RAW_DATA, 自动对数据做 pkcs7 填充, 且返回的加密数据未经过 base64 编码 
  18.  
  19.  * 2 : OPENSSL_ZERO_PADDING, 处理使用 NUL("/0") 的数据,故需手动使用 NUL("/0") 填充好数据再做加密处理,如未做则会报错 
  20.  
  21.  * -------------------------------------------------------------------------------------------------------- 
  22.  
  23.  * 加密工具类 
  24.  
  25.  */ 
  26.  
  27.  
  28.  
  29. // mcrypt AES 固定使用 MCRYPT_RIJNDAEL_128 通过 key 的长度来决定具体使用的具体何种 AES 
  30.  
  31. $mcrypt_cipher = MCRYPT_RIJNDAEL_128; 
  32.  
  33. $mcrypt_mode   = MCRYPT_MODE_CBC; 
  34.  
  35.  
  36.  
  37. // aes-128=16 aes-192=24 aes-256=32 
  38.  
  39. $key_size = 16; 
  40.  
  41. $key      = get_random_str($key_size); 
  42.  
  43. // openssl AES 向量长度固定 16 位 这里为兼容建议固定长度为 16 位 
  44.  
  45. $iv_size = 16; 
  46.  
  47. $iv      = get_random_str($iv_size); 
  48.  
  49.  
  50.  
  51. // 随机字符串 
  52.  
  53. function get_random_str($length = 16) 
  54.  
  55. { 
  56.  
  57.     $char_set = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9')); 
  58.  
  59.     shuffle($char_set); 
  60.  
  61.     return implode('', array_slice($char_set, 0, $length)); 
  62.  
  63. } 
  64.  
  65.  
  66.  
  67. /** 
  68.  
  69.  * 加密算法 
  70.  
  71.  * @param  string $content 待加密数据 
  72.  
  73.  * @param  string $key     加密key 注意 key 长度要求 
  74.  
  75.  * @param  string $iv      加密向量 固定为16位可以保证与openssl的兼容性 
  76.  
  77.  * @param  string $cipher  加密算法 
  78.  
  79.  * @param  string $mode    加密模式 
  80.  
  81.  * @param  bool $pkcs7     是否使用pkcs7填充 否则使用 mcrypt 自带的 NUL("/0") 填充 
  82.  
  83.  * @param  bool $base64    是否对数据做 base64 处理 因加密后数据会有非打印字符 所以推荐做 base64 处理 
  84.  
  85.  * @return string          加密后的内容 
  86.  
  87.  */ 
  88.  
  89. function user_mcrypt_encrypt($content, $key, $iv, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC, $pkcs7 = true, $base64 = true) 
  90.  
  91. { 
  92.  
  93.     //AES, 128 模式加密数据 CBC 
  94.  
  95.     $content           = $pkcs7 ? addPKCS7Padding($content) : $content; 
  96.  
  97.     $content_encrypted = mcrypt_encrypt($cipher, $key, $content, $mode, $iv); 
  98.  
  99.     return $base64 ? base64_encode($content_encrypted) : $content_encrypted; 
  100.  
  101. } 
  102.  
  103.  
  104.  
  105. /** 
  106.  
  107.  * 解密算法 
  108.  
  109.  * @param  [type] $content_encrypted 待解密的内容 
  110.  
  111.  * @param  [type] $key     加密key 注意 key 长度要求 
  112.  
  113.  * @param  [type] $iv      加密向量 固定为16位可以保证与openssl的兼容性 
  114.  
  115.  * @param  [type] $cipher  加密算法 
  116.  
  117.  * @param  [type] $mode    加密模式 
  118.  
  119.  * @param  bool $pkcs7     带解密内容是否使用了pkcs7填充 如果没使用则 mcrypt 会自动移除填充的 NUL("/0") 
  120.  
  121.  * @param  bool $base64    是否对数据做 base64 处理 
  122.  
  123.  * @return [type]          [description] 
  124.  
  125.  */ 
  126.  
  127. function user_mcrypt_decrypt($content_encrypted, $key, $iv, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC, $pkcs7 = true, $base64 = true) 
  128.  
  129. { 
  130.  
  131.     //AES, 128 模式加密数据 CBC 
  132.  
  133.     $content_encrypted = $base64 ? base64_decode($content_encrypted) : $content_encrypted; 
  134.  
  135.     $content           = mcrypt_decrypt($cipher, $key, $content_encrypted, $mode, $iv); 
  136.  
  137.     // 解密后的内容 要根据填充算法来相应的移除填充数 
  138.  
  139.     $content = $pkcs7 ? stripPKSC7Padding($content) : rtrim($content, "/0"); 
  140.  
  141.     return $content; 
  142.  
  143. } 
  144.  
  145.  
  146.  
  147. /** 
  148.  
  149.  * PKCS7填充算法 
  150.  
  151.  * @param string $source 
  152.  
  153.  * @return string 
  154.  
  155.  */ 
  156.  
  157. function addPKCS7Padding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC) 
  158.  
  159. { 
  160.  
  161.     $source = trim($source); 
  162.  
  163.     $block  = mcrypt_get_block_size($cipher, $mode); 
  164.  
  165.     $pad    = $block - (strlen($source) % $block); 
  166.  
  167.     if ($pad <= $block) { 
  168.  
  169.         $char = chr($pad); 
  170.  
  171.         $source .= str_repeat($char, $pad); 
  172.  
  173.     } 
  174.  
  175.     return $source; 
  176.  
  177. } 
  178.  
  179. /** 
  180.  
  181.  * 移去PKCS7填充算法 
  182.  
  183.  * @param string $source 
  184.  
  185.  * @return string 
  186.  
  187.  */ 
  188.  
  189. function stripPKSC7Padding($source) 
  190.  
  191. { 
  192.  
  193.     $source = trim($source); 
  194.  
  195.     $char   = substr($source, -1); 
  196.  
  197.     $num    = ord($char); 
  198.  
  199.     if ($num == 62) { 
  200.  
  201.         return $source; 
  202.  
  203.     } 
  204.  
  205.  
  206.  
  207.     $source = substr($source, 0, -$num); 
  208.  
  209.     return $source; 
  210.  
  211. } 
  212.  
  213.  
  214.  
  215. /** 
  216.  
  217.  * NUL("/0")填充算法 
  218.  
  219.  * @param string $source 
  220.  
  221.  * @return string 
  222.  
  223.  */ 
  224.  
  225. function addZeroPadding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC) 
  226.  
  227. { 
  228.  
  229.     $source = trim($source); 
  230.  
  231.     // openssl 并没有提供加密cipher对应的数据块大小的api这点比较坑 
  232.  
  233.     $block = mcrypt_get_block_size($cipher, $mode); 
  234.  
  235.     $pad   = $block - (strlen($source) % $block); 
  236.  
  237.     if ($pad <= $block) { 
  238.  
  239.         // $source .= str_repeat("/0", $pad);//KISS写法 
  240.  
  241.         // pack 方法 a 模式使用 NUL("/0") 对内容进行填充  A 模式则使用空白字符填充 
  242.  
  243.         $source .= pack("a{$pad}", ""); //高端写法 
  244.  
  245.     } 
  246.  
  247.     return $source; 
  248.  
  249. } 
  250.  
  251.  
  252.  
  253. /** 
  254.  
  255.  * NUL("/0")填充算法移除 
  256.  
  257.  * @param string $source 
  258.  
  259.  * @return string 
  260.  
  261.  */ 
  262.  
  263. function stripZeroPadding($source) 
  264.  
  265. { 
  266.  
  267.     return rtrim($source, "/0"); 
  268.  
  269. } 
  270.  
  271.  
  272.  
  273. // 待加密内容 
  274.  
  275. $content = "hello world"; 
  276.  
  277.  
  278.  
  279. echo '使用 NUL("/0") 填充算法 不对结果做 base64 处理:' . PHP_EOL; 
  280.  
  281. echo 'mcrypt 加密:' . PHP_EOL; 
  282.  
  283. var_dump($data = user_mcrypt_encrypt($content, $key, $iv, $mcrypt_cipher, $mcrypt_mode, false, false)); 
  284.  
  285. echo 'openssl 解密:' . PHP_EOL; 
  286.  
  287. // 需经过 NUL("/0") 填充加密后被 base64_encode 的数据 解密后续手动移除 NUL("/0") 
  288.  
  289. var_dump(stripZeroPadding(openssl_decrypt(base64_encode($data), "AES-128-CBC", $key, OPENSSL_ZERO_PADDING, $iv))); 
  290.  
  291. echo 'openssl 加密:' . PHP_EOL; 
  292.  
  293. // 需对待处理的数据做 NUL("/0") 填充,且返回的数据被 base64_encode 编码了 
  294.  
  295. var_dump($data = base64_decode(openssl_encrypt(addZeroPadding($content), "AES-128-CBC", $key, OPENSSL_ZERO_PADDING, $iv))); 
  296.  
  297. echo 'mcrypt 解密:' . PHP_EOL; 
  298.  
  299. var_dump(user_mcrypt_decrypt($data, $key, $iv, $mcrypt_cipher, $mcrypt_mode, false, false)); 
  300.  
  301. echo PHP_EOL; 
  302.  
  303.  
  304.  
  305. echo '使用 NUL("/0") 填充算法 对结果做 base64 处理:' . PHP_EOL; 
  306.  
  307. echo 'mcrypt 加密:' . PHP_EOL; 
  308.  
  309. var_dump($data = user_mcrypt_encrypt($content, $key, $iv, $mcrypt_cipher, $mcrypt_mode, false, true)); 
  310.  
  311. echo 'openssl 解密:' . PHP_EOL; 
  312.  
  313. var_dump(stripZeroPadding(openssl_decrypt($data, "AES-128-CBC", $key, OPENSSL_ZERO_PADDING, $iv))); 
  314.  
  315. echo 'openssl 加密:' . PHP_EOL; 
  316.  
  317. var_dump($data = openssl_encrypt(addZeroPadding($content), "AES-128-CBC", $key, OPENSSL_ZERO_PADDING, $iv)); 
  318.  
  319. echo 'mcrypt 解密:' . PHP_EOL; 
  320.  
  321. var_dump(user_mcrypt_decrypt($data, $key, $iv, $mcrypt_cipher, $mcrypt_mode, false, true)); 
  322.  
  323. echo PHP_EOL; 
  324.  
  325.  
  326.  
  327. echo "使用 pkcs7 填充算法 不对结果做 base64 处理" . PHP_EOL; 
  328.  
  329. echo 'mcrypt 加密:' . PHP_EOL; 
  330.  
  331. var_dump($data = user_mcrypt_encrypt($content, $key, $iv, $mcrypt_cipher, $mcrypt_mode, true, false)); 
  332.  
  333. echo 'openssl 解密:' . PHP_EOL; 
  334.  
  335. var_dump(openssl_decrypt($data, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv)); 
  336.  
  337. echo 'openssl 加密:' . PHP_EOL; 
  338.  
  339. var_dump($data = openssl_encrypt($content, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv)); 
  340.  
  341. echo 'mcrypt 解密:' . PHP_EOL; 
  342.  
  343. var_dump(user_mcrypt_decrypt($data, $key, $iv, $mcrypt_cipher, $mcrypt_mode, true, false)); 
  344.  
  345. echo PHP_EOL; 
  346.  
  347.  
  348.  
  349. echo "使用 pkcs7 填充算法 对结果做 base64 处理(推荐):" . PHP_EOL; 
  350.  
  351. echo 'mcrypt 加密:' . PHP_EOL; 
  352.  
  353. var_dump($data = user_mcrypt_encrypt($content, $key, $iv, $mcrypt_cipher, $mcrypt_mode, true, true)); 
  354.  
  355. echo 'openssl 解密:' . PHP_EOL; 
  356.  
  357. var_dump(openssl_decrypt($data, "AES-128-CBC", $key, 0, $iv)); 
  358.  
  359. echo 'openssl 加密:' . PHP_EOL; 
  360.  
  361. var_dump($data = openssl_encrypt($content, "AES-128-CBC", $key, 0, $iv)); 
  362.  
  363. echo 'mcrypt 解密:' . PHP_EOL; 
  364.  
  365. var_dump(user_mcrypt_decrypt($data, $key, $iv, $mcrypt_cipher, $mcrypt_mode, true, true)); 

总结要点

1、二者使用的何种填充算法。

2、二者对数据是否有 base64 编码要求。

3、mcrypt 需固定使用 MCRYPT_RIJNDAEL_128,并通过调整 key 的长度 16, 24,32 来实现 ase-128/192/256 加密算法。同时二者 IV 长度都应该是。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表