我正在尝试解密一个文件,我可以使用以下字符串在终端中使用 OpenSSL 对其进行解密。
openssl -enc -d -aes-192-ecb -in file.crypt -out file -K 0123456789abcdef -iv 0
但是,我想用 PHP 解密这个文件。我有以下代码:
$file = file_get_contents('file.crypt');
$key = 0123456789abcdef;
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_192, $key, $file, MCRYPT_MODE_ECB);
print_r($data);
显然我遗漏了一些东西,因为 PHP 脚本正在返回数据,而不是纯文本。
我尝试过使用 MCRYPT_RIJNDAEL_128 但没有成功。如果您能看到我做错了什么,请告诉我。提前致谢。
更新
我已使用以下命令成功解密了我的文件:
$key = pack('H*', '0123456789abcdef'); //In >= PHP 5.4 you can use hex2bin() I think.
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $file, MCRYPT_MODE_ECB);
最佳答案
openssl
中的键和 IV 是十六进制的(因此太短),而 PHP 中的键和 IV 用作字符值。请在 openssl 中为 AES key 指定 32、48 或 64 个十六进制数字,并在 PHP 中为 16、24 或 32 字节指定相同的值。 IV 应始终为 32 个十六进制数字或 16 个字节,因为这是 AES 的 block 大小。
您应该始终使用 MCRYPT_RIJNDAEL_128
,因为其中的 128 是算法的 block 大小(而不是 key 大小)、MCRYPT_RIJNDAEL_192
和 MCRYPT_RIJNDAEL_256
code> 算法不实现 AES。
此外,openssl 默认使用 PKCS#7 填充,请检查 mcrypt_encrypt
注释部分以了解 PHP 的 PKCS 填充的实现 - 默认情况下不提供它。
关于php - 使用 OpenSSL 解密字符串在终端中有效,但在 PHP 脚本中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21069658/