给定以下脚本
require "openssl"
require "securerandom"
key = SecureRandom.random_bytes(32)
iv = SecureRandom.random_bytes(16)
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.encrypt
aes.key = key
aes.iv = iv
crypted = aes.update("a"*50)+aes.final
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
aes.iv = iv
puts aes.update(crypted)+aes.final
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
puts aes.update(crypted)+aes.final
我得到以下输出(例如):
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
���y��f{�K~:y��aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
我需要自己执行这些 CBC 风格的 XOR 操作、 block 大小处理等吗?我找不到任何不简单地调用更新函数并传递应解密的字符串的示例。我已经尝试将 .dup 添加到所有字符串分配中,以防止就地编辑问题。这是怎么回事?
环境:ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-linux]
最佳答案
IV 的目的是通过分析包含相同数据的多个消息来防止发现 key 。如果您有 key ,则无意掩盖信息。如果没有正确的 IV,密文的第一个 block 将不正确,但后续 block 将正确解密,正如您所发现的。 IV 保护 key ,而不是数据。
如果您通过 openssl 命令行工具执行类似的加密,您会得到同样的结果(这里我将加密密文中嵌入的 8 字节 IV 替换为 8 个空格字符):
echo "Ruby openssl lib - Why does AES-256-CBC decrypting gives readable data without the correct IV?" | \
openssl enc -aes-256-cbc -salt -pass pass:password | \
perl -pi -e "s/^(.{8})(.{8})/\1 /" | \
openssl enc -d -aes-256-cbc -salt -pass pass:password
▒▒▒▒▒▒t▒8q▒g] -▒▒▒▒▒▒7<s AES-256-CBC decrypting gives readable data without the correct IV?
关于Ruby openssl lib - 为什么 AES-256-CBC 解密在没有正确 IV 的情况下提供可读数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13869585/