Ruby openssl lib - 为什么 AES-256-CBC 解密在没有正确 IV 的情况下提供可读数据?

标签 ruby openssl aes

给定以下脚本

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/

相关文章:

ruby - 您喜欢哪种风格的 Ruby 字符串引用?

ruby-on-rails - 您的 Ruby 版本是 2.3.1,但您的 Gemfile 指定为 2.3.1(相同版本)

c++ - winldap 无法使用 ssl 连接到 openldap

c - 如何在 C++ 中使用 openssl/md5 来散列字符串?

android - 使用 NDK 构建 Android openssl 无法正确生成 arm4 程序集文件

java - 什么密码可以加密 UDP 数据包?

ruby - Rails 3 + regex - 替换字符串的一部分,出现 1 次

ruby-on-rails - Rails (4.2.0) 服务器对浏览器请求无响应

java - (AES加密)代码缺陷,应该注意什么? [提供代码][Java]

java - 有 Java ECB 提供商吗?