我能够加密文件,但是当我尝试解密它们时,我收到“读取输入文件时出错”。我使用公钥/私钥对来加密用于加密文件的密码。这样只有私钥的所有者才能解密文件。
我的加密方法使用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
我也试过使用salt,加密/解密它和密码一样,我也得到了同样的错误。
我在这里做错了什么?
由于
答案 0 :(得分:0)
不完全是一个解决方案,但这有效。我只是使用系统命令而不是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")
然后使用与问题中相同的解密方法。
答案 1 :(得分:0)
您的加密文件是base64编码的。如果行超过64个字符,则openssl在撤消base64编码时出现问题,并打印错误读取输入文件。我不确定所有版本的openssl是否存在问题。
我想到了两个解决方案:
markdown
命令而不使用-a开关