14

ファイルを暗号化/復号化する簡単なツールを作成する必要があります。

最善の方法は、OpenSSL を使用することだと思います。

キーを生成します。

openssl rand -base64 2048 > secret_key

ファイルを暗号化します。

openssl aes-256-cbc -a -e -in file -out file.enc -k secret_key

ファイルを復号化します。

openssl aes-256-cbc -d -in file.enc -out file -k secret_key

Rubyでこれを実装する簡単な方法はありますか? それを行うより良い方法はありますか?おそらくPGPを使用していますか?

4

2 に答える 2

26

RubyのOpenSSLは、OpenSSL自体の薄いラッパーであり、OpenSSL自体が行うほとんどすべての機能を提供します。したがって、すべての例に1対1のマッピングがあります。

openssl rand -base64 2048 > secret_key

これは実際には誇張されており、AES-256を使用しているため、必要なのは256ビットキーのみです。ここではRSAを使用していません。Ruby OpenSSLはこの決定を肩代わりし、使用するアルゴリズムを指定して正しいキーサイズを自動的に決定します。

また、暗号化中に決定論的IVを使用するという間違いを犯しています。なんで?IVをまったく指定しないため、OpenSSL自体はデフォルトですべてゼロバイトのIVになります。これは良いことではないので、正しい方法を紹介します。詳細については、Cipherのドキュメントを参照してください。

require 'openssl'

# encryption
cipher = OpenSSL::Cipher.new('aes-256-cbc')
cipher.encrypt
key = cipher.random_key
iv = cipher.random_iv

buf = ""
File.open("file.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

# decryption
cipher = OpenSSL::Cipher.new('aes-256-cbc')
cipher.decrypt
cipher.key = key
cipher.iv = iv # key and iv are the ones from above

buf = ""
File.open("file.dec", "wb") do |outf|
  File.open("file.enc", "rb") do |inf|
    while inf.read(4096, buf)
      outf << cipher.update(buf)
    end
    outf << cipher.final
  end
end

ご覧のとおり、暗号化と復号化はかなり似ているため、ストリーミングの読み取り/書き込みを1つの共有メソッドに組み合わせて、適切に構成されCipherたファイル名と対応するファイル名を渡すことができます。わかりやすくするために、明示的に説明しました。

キー(およびおそらくIVも)をBase64でエンコードする場合は、 Base64モジュールを使用できます。

base64_key = Base64.encode64(key)
于 2012-06-15T10:06:40.887 に答える
4

RubyにはOpenSSLライブラリがあり、手間のかかる作業を処理する必要があります。

于 2012-06-15T03:57:40.287 に答える