【问题标题】:symmetric AES encryption with php produces different result than openssl cmd使用 php 的对称 AES 加密产生与 openssl cmd 不同的结果
【发布时间】:2018-08-17 07:05:53
【问题描述】:

我需要使用 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==

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

【问题讨论】:

  • 欧洲央行不安全。
  • openssl12n 是什么...我所知道的 OSX 版本都不知道那是什么。但是,当我仅使用 openssl ... 执行命令并使用 openssl_decrypt(same args) 复制/粘贴到 php 脚本时...我可以确认 php 版本不会解密 osx 版本吐出的内容。我什至尝试过是否解码base64,并更改选项。这里有奇怪的问题。
  • 对不起,我忘了评论它不是默认版本。它是另一个已安装版本的别名。别名 openssl12n='/usr/local/Cellar/openssl/1.0.2n/bin/openssl'
  • 我正在测试它...(需要更多编码,因为需要 IV)
  • CBC 模式和 256 位密钥无济于事,问题出在其他地方。 1. AES是基于块的,输入数据必须是块大小的倍数:16字节。如果数据较短,则必须将其填充到长度。这可以在填充选项中指定,例如 PKCS#7 或 née PKCS#5,没有标准默认值,每个实现都可以选择如何处理短数据。

标签: php encryption openssl aes php-openssl


【解决方案1】:

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

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

测试 OpenSSL 加密:
echo -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

比较两个输出(删除填充):
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

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2012-10-14
    • 2012-06-06
    相关资源
    最近更新 更多