2

给定以下脚本

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 操作、块大小处理等?我找不到任何不简单地调用更新函数并传递应该解密的字符串的示例。我已经尝试将 .dup 添加到所有字符串分配以防止就地编辑问题。这里发生了什么?

环境:ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-linux]

4

1 回答 1

4

IV 的目的是通过分析包含相同数据的多条消息来防止发现密钥。如果您有密钥,它不会掩盖信息。如果没有正确的 IV,密文的第一个块将不正确,但正如您所发现的,后续块将正确解密。IV 保护密钥,而不是数据。

如果您通过 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?
于 2012-12-14T00:29:04.757 回答