简体   繁体   English

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

[英]PHP's mcrypt_encrypt and openssl (AES) output are different

I want to move from mcrypt_encrypt() to openssl_encrypt() for AES 256 encryption 我想从mcrypt_encrypt()转到openssl_encrypt()以进行AES 256加密

But the encrypted data are different ! 但是加密的数据不一样!

For example mcrypt_encrypt() output: 例如mcrypt_encrypt()输出:

Od2i8FHmWvMeXt+HwCy7k93koPVClK1erHsZwoB6sUE=

and openssl_encrypt() output: 和openssl_encrypt()输出:

Od2i8FHmWvMeXt+HwCy7kyCt0nvHTaO4IdjdiF15LAc= 

My code: 我的代码:

<?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";
?>

What is the problem? 问题是什么? Thank you 谢谢

It is most likely the padding. 它很可能是填充。 Notice that the first block is the same for each and the last block is different. 请注意,每个块的第一个块都相同,而最后一个块则不同。

The text being encrypted is 28 bytes so the the last block will have 4 bytes of padding: 16-(28%16) = 4. 正在加密的文本为28个字节,因此最后一个块将具有4个填充字节:16-(28%16)= 4。

PHP mcrypt does not support standard PKCS#7 (née PKCS#5) padding, only non-standard null padding. PHP mcrypt不支持标准PKCS#7(néePKCS#5)填充,仅支持非标准的空填充。

So PHP mcrypt will appoint 4-bytes of 0x00 and openssl 4-bytes of 0x04. 因此,PHP mcrypt将指定4个字节的0x00和openssl 4个字节的0x04。 See PKCS#7 padding . 参见PKCS#7填充

So if you want to create the same encrypted output with openssl_encrypt you need too specify zero padding option ( OPENSSL_ZERO_PADDING ) and add the null padding yourself. 因此,如果要使用openssl_encrypt创建相同的加密输出, openssl_encrypt还需要指定零填充选项( OPENSSL_ZERO_PADDING自己添加空填充。 Note: null padding is not robust because it can not correctly handle all binary data. 注意:空填充不可靠,因为它不能正确处理所有二进制数据。

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


mcrypt_encrypt(): mcrypt_encrypt():
Base64: Od2i8FHmWvMeXt+HwCy7k93koPVClK1erHsZwoB6sUE= Base64: Od2i8FHmWvMeXt+HwCy7k93koPVClK1erHsZwoB6sUE=
Hex: 39DDA2F051E65AF31E5EDF87C02CBB93 DDE4A0F54294AD5EAC7B19C2807AB141 十六进制: 39DDA2F051E65AF31E5EDF87C02CBB93 DDE4A0F54294AD5EAC7B19C2807AB141

openssl_encrypt: openssl_encrypt:
Base64: Od2i8FHmWvMeXt+HwCy7kyCt0nvHTaO4IdjdiF15LAc= Base64: Od2i8FHmWvMeXt+HwCy7kyCt0nvHTaO4IdjdiF15LAc=
Hex: 39DDA2F051E65AF31E5EDF87C02CBB93 20ADD27BC74DA3B821D8DD885D792C07 十六进制: 39DDA2F051E65AF31E5EDF87C02CBB93 20ADD27BC74DA3B821D8DD885D792C07

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM