ruby - 使用 Ruby 解密在命令行上生成的加盐 AES 文件

标签 ruby encryption cryptography openssl

我想解密 ruby​​ 2.1 脚本中的文本文件,该脚本之前使用 OpenSSL 的命令行工具加密: openssl enc -aes-256-cbc -a -salt -in my_file

如在命令中所见,该文件经过 AES-256-CBC 加密、加盐和 base64 编码。

密码是已知的,但 IV 和 key 都不知道,这需要遵循此代码段,取自 ruby documentation :

decipher = OpenSSL::Cipher::AES.new 256, :CBC
decipher.decrypt
decipher.key = key
decipher.iv = iv

plain = decipher.update(encrypted_text) + decipher.final

在寻找答案时,我找到了 gem AESCrypt gem 据说可以简化加密和解密,但当前发布的版本与 ruby​​ 2.1 不兼容。 查看它的源代码,我发现关键是 retrieved by digesting the password , 和 IV is just left as nil .

所以我尝试运行以下程序:

encoded_and_encrypted_text = File.read my_file_path
encrypted_text = Base64.decode64 encoded_and_encrypted_text.to_s.strip

decipher = OpenSSL::Cipher::AES.new 256, :CBC
decipher.decrypt

decipher.key = OpenSSL::Digest::SHA256.new(my_password).digest

plain_text = decipher.update(encrypted_text) + decipher.final

但这会导致 OpenSSL::Cipher::CipherError: bad decrypt

我是否需要以某种方式专门处理文件已加盐?我读过 OpenSSL documentation for the enc function如果在加密文件时未指定 IV,则 IV 是从密码生成的。我是否需要以某种方式手动重建 IV?

任何建议将不胜感激:)

最佳答案

OpenSSL 使用自定义 header 和 key 派生例程。 Security.SE has a good description of the headerdocs for EVP_BytesToKey描述 key 推导。

我们可以修改您的代码以使用这种奇怪且有些损坏的 key 派生,如下所示:

encoded_and_encrypted_text = File.read my_file_path
encrypted_text = Base64.decode64 encoded_and_encrypted_text.to_s.strip

header = encrypted_text[0,8]
salt = encrypted_text[8,8]
payload = encrypted_text[16..-1]

decipher = OpenSSL::Cipher::AES.new 256, :CBC
decipher.decrypt

D_1 = OpenSSL::Digest::MD5.new(my_password + salt).digest
D_2 = OpenSSL::Digest::MD5.new(D_1 + my_password + salt).digest
D_3 = OpenSSL::Digest::MD5.new(D_2 + my_password + salt).digest

decipher.key = (D_1 + D_2)
decipher.iv = D_3

plain_text = decipher.update(payload) + decipher.final

关于ruby - 使用 Ruby 解密在命令行上生成的加盐 AES 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26144068/

相关文章:

ruby-on-rails - Rails update_attributes 没有保存?

ruby-on-rails - 在 Ruby Rspec 自动化中集成数据库清洁器 gem 的问题

php - 将电子邮件密码存储在共享服务器数据库中

ruby-on-rails - 安装mysql gem时出错

encryption - 将单行RSA私钥SSH key 转换为多行

java - BouncyCaSTLe 的 AES 引擎是否有硬件加速?

java - 从 PEM BASE64 编码的私钥文件获取 RSA 私钥

java - KeyPairGenerator 无法解析

c++ - MSDN HMAC-SHA1 示例不工作

ruby-on-rails - 如何一次为所有类变量制作 'attr_reader' 或 'attr_writer'?