首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP的mcrypt_encrypt和openssl (AES)输出不同

PHP的mcrypt_encrypt和openssl (AES)输出不同
EN

Stack Overflow用户
提问于 2018-03-09 20:59:18
回答 1查看 717关注 0票数 1

我想从mcrypt_encrypt()转移到openssl_encrypt()进行AES 256加密

但是加密的数据是不同的!

例如,mcrypt_encrypt()输出:

代码语言:javascript
复制
Od2i8FHmWvMeXt+HwCy7k93koPVClK1erHsZwoB6sUE=

和openssl_encrypt()输出:

代码语言:javascript
复制
Od2i8FHmWvMeXt+HwCy7kyCt0nvHTaO4IdjdiF15LAc= 

我的代码:

代码语言:javascript
复制
<?php
$encryption_key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(16);
$data = "Here's some data to encrypt!";
$encrypted = openssl_encrypt($data, "aes-256-cbc", $encryption_key, 0, $iv);
echo "encrypted: $encrypted\n\n";
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryption_key, $data, MCRYPT_MODE_CBC, $iv));
echo "encrypted: $encrypted\n\n";
?>

有什么问题吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-09 21:29:36

最有可能是填充物。注意,第一个块对于每个块都是相同的,最后一个块是不同的。

正在加密的文本是28个字节,所以最后一个块将有4个字节的填充: 16-( 28 %16) = 4。

PHP不支持标准PKCS#7 (née PKCS#5)填充,只支持非标准的空填充。

因此,PHP mcrypt将指定4字节的0x00和openssl 4字节的0x04。见PKCS#7填充

因此,如果您想用openssl_encrypt创建相同的加密输出,您也需要指定零填充选项(OPENSSL_ZERO_PADDING) 自己添加空填充。注意:空填充不健壮,因为它不能正确处理所有二进制数据。

示例:openssl_encrypt($data, "aes-256-cbc", $encryption_key, OPENSSL_ZERO_PADDING, $iv);

mcrypt_encrypt():

Base64:Od2i8FHmWvMeXt+HwCy7k93koPVClK1erHsZwoB6sUE=

十六进制:39DDA2F051E65AF31E5EDF87C02CBB93 DDE4A0F54294AD5EAC7B19C2807AB141

openssl_encrypt:

Base64:Od2i8FHmWvMeXt+HwCy7kyCt0nvHTaO4IdjdiF15LAc=

十六进制:39DDA2F051E65AF31E5EDF87C02CBB93 20ADD27BC74DA3B821D8DD885D792C07

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49202056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档