php - 使用 OpenSSL 解密字符串在终端中有效,但在 PHP 脚本中无效

标签 php encryption openssl

我正在尝试解密一个文件,我可以使用以下字符串在终端中使用 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_192MCRYPT_RIJNDAEL_256 code> 算法实现 AES。

此外,openssl 默认使用 PKCS#7 填充,请检查 mcrypt_encrypt 注释部分以了解 PHP 的 PKCS 填充的实现 - 默认情况下不提供它。

关于php - 使用 OpenSSL 解密字符串在终端中有效,但在 PHP 脚本中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21069658/

相关文章:

asp.net - 如果用户可以解密它,加密 web.config 有什么意义?

c - Helgrind 报告的 OpenSSL libcrypto.1.0.0 CRYPTO_malloc() 中可能的数据竞争条件

PHP类对象和内存使用

php - Hive Server 2的PHP旧版客户端挂起

php - PHPMetrics选项--excluded-dirs =“myfolder”:docker中不排除myfolder目录

php - 在 C 中循环 OpenSSL SHA512 会产生与 PHP 不同的结果

c - EVP_get_cipherbyname 始终返回 null

php - 对于公共(public)配置文件系统,查询 WHERE id ='. $something .' 时出现 Sql 错误

android - 如何为 android 应用程序加密 SQlite 数据库?

sql-server - 在部署到 docker/linux 的 ASP.NET Core 应用程序中使用 SQL Server Always Encrypted