解密 iv = 0 的 aes-256-cbc 编码文件

Decrypt aes-256-cbc encoded file with iv = 0

我有一个用 aes-256-cbd 方法加密的 input.DAT 文件。我想使用 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 [=14=]

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

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

使用 openssl_decrypt() 使用 PHP 解密的可能实现是:

// 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)通常是不安全的。