我正面临着一个问题,我无法在我的Mac上解密用Ruby加密的文件.

使用以下Ruby代码,我使用了AES加密对一个压缩文件进行了加密:

require 'openssl'

key = OpenSSL::Cipher.new('AES-256-CBC').random_key
iv = OpenSSL::Cipher.new('AES-256-CBC').random_iv

key_hex = key.unpack('H*').first
iv_hex = iv.unpack('H*').first

puts OpenSSL::OPENSSL_LIBRARY_VERSION # OpenSSL 1.1.1t  7 Feb 2023
puts "Key: #{key_hex}"
puts "IV:  #{iv_hex}"

cipher = OpenSSL::Cipher.new('AES-256-CBC').encrypt
cipher.key = key
cipher.iv = iv
binary = cipher.update(data) + cipher.final
binary.unpack1('H*')

随后,我try 使用Mac OS终端解密创建的二进制文件:

$ openssl version
OpenSSL 1.1.1s  1 Nov 2022
$ openssl enc -aes-256-cbc -d -K <key_hex> -iv <iv_hex> -in encrypted > decrypted.zip

但是,出现了一个"错误解密"错误,我无法解密它:

bad decrypt
4705359360:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:612:

请告诉我解决方案!

推荐答案

您需要确保使用openssl命令所需的正确数据表示形式.它需要原始形式的加密数据,而不是十六进制编码的数据.

看起来您已经将十六进制编码版本的加密数据放入了您的编码文件中(即,上一条ruby语句的结果).相反,您需要将binary变量的内容放入encrypted文件中(即前一条ruby语句的结果).

Ruby相关问答推荐

有没有办法保存 ruby​​ 代码的执行,以便稍后使用逐步重播对其进行调试?

Ruby - 使用索引值识别和更新数组中的重复项

Homebrew 的 ruby​​ 和Homebrew Ruby有什么区别?

如何解密在 sjcl.js 中使用 ruby​​ 创建的 AES-256-GCM

仅在模块中列出方法?

将数组转换为哈希,其中键是索引

Simple_form:删除带有标签的内联复选框的外部标签

Integer(value) 和 value.to_i 之间的区别

如何按长度对 Ruby 字符串数组进行排序?

截断、事务和删除数据库策略的区别

如何期望 RSpec should_receive 的一些(但不是全部)参数?

Coffeescript 中等效的 Ruby .times

如何使用 yardoc 列出未记录的模块/类/常量/方法?

用零填充数字

在Ruby中第一个=符号之后获取子字符串

如何通过匹配文本来 Select node

如何打破Ruby中的外循环?

获取当前 ruby​​ 进程内存使用情况

如何从Ruby中的哈希表中获取第一个键值对

如何使用器重新安装 gem