最近在对接 api,给到的文档代码示例用了 mcrypt_encrypt,但我本机环境是 php7.2,因为 mcrypt_encrypt 在 7.1 后被废除了,那么我尝试这样进行替换:
把
mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $json, MCRYPT_MODE_CBC, $iv);
替换成
openssl_encrypt($json, "aes-128-cbc", $privateKey, OPENSSL_RAW_DATA, $iv);
最后得出的加密结果不一致。 google 一番发现是 pkcs5 和 pkcs7 的区别造成的,openssl_encrypt 默认使用了 pkcs7 填充。
因为对加密知识一无所知,到了这里无法下手了,请高手解疑: 如何才能顺利获得一致的加密结果,并且解密的时候需要注意什么?
(不太会排版,逃)
1
lslqtz 2018-05-20 18:01:41 +08:00
|
2
lslqtz 2018-05-20 18:02:14 +08:00 1
可能可供参考。。。
|
3
sgq1128 2018-05-20 21:50:03 +08:00 via Android 2
https://www.health666.club/2018/04/12/PHP%E4%B8%80%E4%BA%9B%E5%8A%A0%E8%A7%A3%E5%AF%86DEMO/ 有个 des pkcs5 的
|
4
Seanfuck 2018-05-21 09:13:09 +08:00 1
我记得方法参数不是这样对应的,试试 aes-128-cbc*
openssl_get_cipher_methods 可以列出来 |
5
hhacker 2018-05-21 09:23:44 +08:00 2
```php
function aes_encrypt($val,$key) { $pad_value = 16-(strlen($val) % 16); $val = str_pad($val, (16*(floor(strlen($val) / 16)+1)), chr($pad_value)); if (version_compare(PHP_VERSION, '7.0.0') >= 0) { return openssl_encrypt($val, 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING); }else{ return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $val, MCRYPT_MODE_ECB, mcrypt_create_iv( mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_URANDOM)); } } function aes_decrypt($val,$key) { if (version_compare(PHP_VERSION, '7.0.0') >= 0) { $decode = openssl_decrypt($val, 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING); $len = strlen($decode); return substr($decode, 0, $len - ord($decode[$len-1])); }else{ $decode = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $val, MCRYPT_MODE_ECB, mcrypt_create_iv( mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_URANDOM)); return $decode; } } ``` |
8
captain7 OP 感谢大佬们提供了参考资料,大开眼界,尚在尝试解决,有结果再回来终结此贴
|