使用php进行对称AES加密会产生与openssl cmd不同的结果

时间:2018-03-08 19:53:19

标签: php encryption openssl aes php-openssl

我需要使用 AES 128 ECB模式进行简单的基本加密。

我们的想法是生成一个密码,在base64中对其进行编码,然后从php中的Web服务中解密该文本以处理其内容。稍后我们将使用256键和CBC模式增加加密的稳健性。

问题是从openssl工具(默认安装在MacOX中)生成的加密文本生成的结果与php 7中 openssl_encrypt 函数生成的结果完全不同。

echo -n 'Sergio Sánchez' | openssl12n enc -aes-128-ecb  -a

结果

U2FsdGVkX1+wrLjaCTSM9T3WMV1YcD9Cwzj0mKBoa7M=

无盐

echo -n 'Sergio Sánchez' | openssl12n enc -aes-128-ecb -nosalt -a

结果

stpJKCaUQ/Q1GLzDvqaYRg==

PHP 7

echo base64_encode(openssl_encrypt('Sergio Sánchez', 'AES-128-ECB', 'password', OPENSSL_RAW_DATA));

结果

dum7MBJOzIi9jvMTvEYnug==

如何在两个工具之间生成兼容的密码?

1 个答案:

答案 0 :(得分:1)

以下是使用相同加密示例的命令行OpenSSL和基于Web的加密的示例:

更改测试数据和密钥以减少长度问题:
key:'testkey1testkey1 hex:746573746b657931746573746b657931
数据:'54657374446174615465737444617461'十六进制:746573746b657931746573746b657931

测试OpenSSL加密:
echo -n' TestDataTestData' | openssl enc -aes-128-ecb -a -K 746573746b657931746573746b657931
输出:'AdLbg3zhQ2/hei0QxAdvnVZaYCTUjgmjheMmWi8Js5A='
十六进制:01D2DB837CE1436FE17A2D10C4076F9D565A6024D48E09A385E3265A2F09B390
前16个字节是加密数据,后16个字节是填充,请参阅注释。

测试基于Web的加密(是的,它是ECB模式):
http://extranet.cryptomathic.com/aescalc?key=746573746b657931746573746b657931&iv=00000000000000000000000000000000&input=54657374446174615465737444617461&mode=ecb&action=Encrypt&output=
输出:01D2DB837CE1436FE17A2D10C4076F9D

比较两个输出(丢弃填充):
AESCalc:01D2DB837CE1436FE17A2D10C4076F9D
OpenSSL:01D2DB837CE1436FE17A2D10C4076F9D

从这里,您可以根据需要逐一进行更改。

有用的链接:
OpenSSL enc man page
AES Calculator
Base64 to hex decoder
Text to Hex Converter
PKCS#7 padding

注1:PKCS#7填充总是添加填充,因此当与块大小的倍数一起使用时,必须(必须)添加完整的填充块。如果没有添加填充,即使在这种情况下,也不可能在所有情况下都确定没有添加填充。

注2:明确添加填充的AESCalc:
http://extranet.cryptomathic.com/aescalc?key=746573746B657931746573746B657931&iv=00000000000000000000000000000000&input=5465737444617461546573744461746110101010101010101010101010101010&mode=ecb&action=Encrypt&output=01D2DB837CE1436FE17A2D10C4076F9D
输出:01D2DB837CE1436FE17A2D10C4076F9D565A6024D48E09A385E3265A2F09B390