[ PHP ] mcrypt_encrypt 和 openssl_encrypt 加密结果不一致

2018-05-20 16:10:39 +08:00
 captain7

最近在对接 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 填充。

因为对加密知识一无所知,到了这里无法下手了,请高手解疑: 如何才能顺利获得一致的加密结果,并且解密的时候需要注意什么?

(不太会排版,逃)

3380 次点击
所在节点    程序员
8 条回复
lslqtz
2018-05-20 18:01:41 +08:00
lslqtz
2018-05-20 18:02:14 +08:00
可能可供参考。。。
sgq1128
2018-05-20 21:50:03 +08:00
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 的
Seanfuck
2018-05-21 09:13:09 +08:00
我记得方法参数不是这样对应的,试试 aes-128-cbc*
openssl_get_cipher_methods 可以列出来
hhacker
2018-05-21 09:23:44 +08:00
```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;
}
}
```
captain7
2018-05-21 09:43:31 +08:00
captain7
2018-05-21 09:51:41 +08:00
captain7
2018-05-21 09:52:47 +08:00
感谢大佬们提供了参考资料,大开眼界,尚在尝试解决,有结果再回来终结此贴

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/456297

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX