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

symmetric AES encryption with php produces different result than openssl cmd

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

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

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

中的函数
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==

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

这里是命令行 OpenSSL 和基于 Web 的加密示例,具有相同的加密示例:

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

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

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

比较两个输出(删除填充):
AES计算器:01D2DB837CE1436FE17A2D10C4076F9D
OpenSSL: 01D2DB837CE1436FE17A2D10C4076F9D

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

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

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

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