Ruby's OpenSSL ist eine dünne Hülle um OpenSSL selbst und bietet fast alle Funktionen, die OpenSSL selbst hat, also ja, es gibt eine Eins-zu-Eins-Zuordnung für alle Ihre Beispiele:
openssl rand -base64 2048 > secret_key
Das ist eigentlich übertrieben, Sie verwenden AES-256, also brauchen Sie nur einen 256-Bit-Schlüssel, Sie verwenden hier nicht RSA. Ruby OpenSSL nimmt Ihnen diese Entscheidung ab, da es automatisch die richtige Schlüsselgröße für den gewünschten Algorithmus ermittelt.
Sie machen auch den Fehler, bei der Verschlüsselung eine deterministische IV zu verwenden. Warum? Weil Sie überhaupt keinen IV angeben, OpenSSL selbst wird standardmäßig einen IV von null Bytes verwenden. Das ist nicht gut, deshalb zeige ich Ihnen den korrekten Weg, weitere Informationen finden Sie in der Dokumentation zur Chiffre .
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
Wie Sie sehen können, sind Verschlüsselung und Entschlüsselung ziemlich ähnlich, so dass Sie wahrscheinlich das Streaming-Lesen/Schreiben in einer gemeinsamen Methode kombinieren können und ihr einfach eine richtig konfigurierte Cipher
sowie die entsprechenden Dateinamen, ich habe sie nur der Klarheit halber explizit angegeben.
Wenn Sie den Schlüssel (und wahrscheinlich auch die IV) in Base64 kodieren möchten, können Sie die Base64 Modul:
base64_key = Base64.encode64(key)