Mac终端解密Ruby AES-256-CBC加密文件遇bad decrypt错误求解
解决Ruby AES-256-CBC加密文件无法用OpenSSL终端解密的问题
问题根源
你的Ruby代码最后将加密后的二进制数据通过binary.unpack1('H*')转换为十六进制字符串,但你直接将该字符串保存为文件后使用OpenSSL命令解密。而OpenSSL的enc命令默认处理的是原始二进制加密数据,并非十六进制格式,这直接导致了"bad decrypt"错误。
解决方法
方法1:修改Ruby代码,直接保存二进制加密数据
修改代码最后一行,跳过十六进制转换步骤,直接将加密后的二进制数据写入文件:
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}" # 确保data是二进制读取的zip文件内容 data = File.binread('your_source.zip') cipher = OpenSSL::Cipher.new('AES-256-CBC').encrypt cipher.key = key cipher.iv = iv binary = cipher.update(data) + cipher.final # 直接保存二进制加密数据,替换原来的unpack操作 File.write('encrypted', binary)
生成的encrypted文件可直接用你原有的OpenSSL命令解密:
openssl enc -aes-256-cbc -d -K <key_hex> -iv <iv_hex> -in encrypted > decrypted.zip
方法2:针对已生成的十六进制加密文件,先转二进制再解密
如果已经保存了十六进制格式的加密文件,先用xxd工具将其还原为二进制数据,再执行解密:
# 将十六进制文件转成二进制 xxd -r -p your_hex_encrypted_file > encrypted_binary # 解密二进制文件 openssl enc -aes-256-cbc -d -K <key_hex> -iv <iv_hex> -in encrypted_binary > decrypted.zip
额外验证点
确保Ruby代码中读取原始zip文件时使用File.binread()而非File.read(),避免文本模式读取导致的二进制数据损坏。
内容的提问来源于stack exchange,提问作者bluecat
相关产品推荐
相关产品推荐

