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)