首页 > 解决方案 > 用 iv = 0 解密 aes-256-cbc 编码文件

问题描述

我有一个input.DAT用方法加密的文件aes-256-cbd。我想使用 php 解密文件。当我从命令行执行以下命令时,文件已成功解密。

aes-256-cbc -d -in input.DAT -out output.TXT -K 00478c54c432b3ca9a98d4a750ea874eba07410ae61834cd5aaac7505f1f5ad4 -iv 0

但是当我尝试使用 php 使用该方法解密文件时

openssl_decrypt($data, AES_256_CBC, $encryption_key, 0, 0);

它给了我这个错误:openssl_decrypt(): IV passed is only 1 bytes long, cipher expects an IV of precisely 16 bytes, padding with \0

如何使用 php 而不是命令行解密文件?

标签: phpencryptionopensslaes

解决方案


OpenSSL 语句从input.DAT加载密文。由于既没有设置-a也没有设置-base64选项,因此会读取原始二进制数据。读取的数据在 CBC 模式下使用 AES-256 进行解密。
的十六进制解码00478c54c432b3ca9a98d4a750ea874eba07410ae61834cd5aaac7505f1f5ad4用作密钥,零 IV(所有 16 个字节都是0x00)用作 IV。

使用 PHP 进行解密的一种可能实现openssl_decrypt()是:

// Load ciphertext
$file = '<input.DAT path>';
$data = file_get_contents($file);

// Decrypt
$key = hex2bin('00478c54c432b3ca9a98d4a750ea874eba07410ae61834cd5aaac7505f1f5ad4');
$iv = hex2bin('00000000000000000000000000000000');
$decrypted = openssl_decrypt($data, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
print($decrypted . PHP_EOL);

请注意,openssl_encrypt()默认情况下会生成一个 Base64 编码的密文,并openssl_decrypt()相应地期望一个 Base64 编码的密文。由于这里读取的密文是原始的,即不是 Base64 编码的,因此OPENSSL_RAW_DATA必须设置该标志。此外,双方默认使用 PKCS7 作为填充。

请记住,静态 IV(如零 IV)通常是不安全的。


推荐阅读