php - 用 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 而不是命令行解密文件?
解决方案
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)通常是不安全的。
推荐阅读
- sqlite - 如何使用别名在 JavaFX 中填充 TableView
- python - 从 gridsearchcv 中提取结果
- django - handling duplicate objects with custom slugs via mixins
- html - 如何向屏幕阅读器指示 span 元素?
- java - 无法读取 azure 上应用程序资源文件夹中的 json 文件
- jquery - Kendo UI DataSource/Grid 更改客户端过滤器参数
- visual-studio - Visual Studio 中 TFS 警报的电子邮件替代方案?
- windows - Windows 应用程序将什么交给 Windows 子系统进行打印作业?是文字吗?
- python - Match a 2-digit with separated comma (float digits not included)
- git - 如何使用 Jenkins Pipeline SCM 脚本支持多分支发布?