15 Stimmen

Wie verschlüsselt man Dateien mit Ruby?

Ich muss ein einfaches Tool schreiben, das Dateien verschlüsselt/entschlüsselt.

Der beste Weg ist wohl die Verwendung von OpenSSL:

Erzeugen Sie einen Schlüssel:

openssl rand -base64 2048 > secret_key

Verschlüsseln Sie eine Datei:

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

Entschlüsseln einer Datei:

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

Gibt es eine einfache Möglichkeit, dies in Ruby zu implementieren? Gibt es einen besseren Weg, das zu tun? Vielleicht mit PGP?

26voto

emboss Punkte 37771

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)

4voto

sczizzo Punkte 3156

Ruby hat eine OpenSSL-Bibliothek Das sollte die Schwerstarbeit erledigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X