我需要使用 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==
如何在两个工具之间生成兼容的密码?
答案 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