【问题标题】:Ruby OpenSSL unable to decryptRuby OpenSSL 无法解密
【发布时间】:2013-04-12 01:06:45
【问题描述】:

我可以加密文件,但是当我尝试解密它们时,我收到“读取输入文件时出错”。我正在使用公钥/私钥对来加密用于加密文件的密码。这样只有私钥的所有者才能解密文件。

我的加密方法使用 Ruby OpenSSL 模块,看起来像:

file = params[:submission][:report].path
filename = params[:submission][:report].original_filename.gsub(" ", "_")

pubkey = OpenSSL::PKey::RSA.new File.read "#{Rails.root.to_s}/key/pubkey.pem"
cipher = OpenSSL::Cipher.new("aes-256-cbc")
cipher.encrypt
cipher.key = key = (0...50).map{ ('a'..'z').to_a[rand(26)] }.join

buf = ""
File.open("#{Rails.root.to_s}/evidence/#{filename}.enc", "wb") do |outf|
  File.open(file, "rb") do |inf|
    while inf.read(4096, buf)
      outf << cipher.update(buf)
    end
    outf << cipher.final
  end
end

encrypted_key = pubkey.public_encrypt key
File.open("#{Rails.root.to_s}/evidence/#{filename}_passphrase.bin", 'wb') {|f| f.write(encrypted_key) }

然后我在Linux环境中使用openssl来处理解密

openssl rsautl -in file_passphrase.bin -out passphrase.txt -inkey privkey.pem -decrypt
openssl enc -a -d -aes-256-cbc -in file.enc -out file.pdf -pass file:passphrase.txt

我也尝试过使用盐,加密/解密它与密码相同,我得到了同样的错误。

我在这里做错了什么?

谢谢

【问题讨论】:

    标签: ruby openssl public-key-encryption


    【解决方案1】:

    不完全是一个解决方案,但这有效。而不是 OpenSSL 模块,我只是使用系统命令:

    file = params[:submission][:report].path
    filename = params[:submission][:report].original_filename.gsub(" ", "_")
    passphrase = (0...50).map{ ('a'..'z').to_a[rand(26)] }.join
    system("openssl enc -a -e -aes-256-cbc -in #{file} -out #{Rails.root.to_s}/evidence/#{filename}.asc -pass pass:#{passphrase}")
    system("echo #{passphrase} | openssl rsautl -out #{Rails.root.to_s}/evidence/#{filename}_password.bin -pubin -inkey #{Rails.root.to_s}/key/pubkey.pem -encrypt")
    

    然后使用与问题中相同的解密方法。

    【讨论】:

      【解决方案2】:

      您的加密文件是 base64 编码的。如果行长于 64 个字符,则 openssl 在撤消 base64 编码时会出现问题,并打印 error reading input file。我不确定是否所有版本的 openssl 都存在问题。

      想到两个解决方案:

      • base64 首先使用另一个实用程序对文件进行解码,然后在没有 -a 开关的情况下运行 openssl enc 命令
      • 在加密和 base64 编码文件(在您的示例中为 file.enc)中每 64 个字符后插入一个换行符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-24
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-09
        • 2018-12-05
        • 1970-01-01
        相关资源
        最近更新 更多