2

ファイルを暗号化することはできますが、それらを復号化しようとすると、「入力ファイルの読み取りエラー」が発生します。ファイルの暗号化に使用されるパスフレーズを暗号化するために、公開鍵と秘密鍵のペアを使用しています。これは、秘密鍵の所有者だけがファイルを復号化できるようにするためです。

私の暗号化方法は 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

また、ソルトを使用して、パスフレーズと同じように暗号化/復号化しようとしましたが、同じエラーが発生します。

ここで何が間違っていますか?

ありがとう

4

2 に答える 2

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")

次に、質問と同じ復号化方法を使用します。

于 2013-04-13T18:43:10.997 に答える
0

暗号化されたファイルは base64 でエンコードされています。行が 64 文字よりも長い場合、openssl は base64 エンコーディングを元に戻す際に問題が発生し、 error reading input file を出力します。openssl のすべてのバージョンで問題が発生するかどうかはわかりません。

2 つの解決策が思い浮かびます。

  • 最初に別のユーティリティでファイルをbase64デコードしてからopenssl enc、-aスイッチなしでコマンドを実行します
  • 暗号化された base64 エンコード ファイル (この例では file.enc) の 64 文字ごとに改行を挿入します。
于 2016-06-24T23:21:00.963 に答える