【问题标题】:Decrypt aes-256-cbc encoded file with iv = 0用 iv = 0 解密 aes-256-cbc 编码文件
【发布时间】:2021-06-17 10:35:00
【问题描述】:

我有一个使用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 \0

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

【问题讨论】:

  • @Topaco 你能写出所有参数的整个函数吗?我尝试了几种方法,但都没有成功。

标签: php encryption openssl aes


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多