OpenSSL-Hash-Funktion zum Generieren des AES-Schlüssels

8

Welche Hash-Funktion verwendet OpenSSL, um einen Schlüssel für AES-256 zu generieren? Ich kann es nirgendwo in ihrer Dokumentation finden.

$ touch file
$ openssl aes-256-cbc -nosalt -P -in file

enter aes-256-cbc encryption password: (I type "a" and hit enter)
Verifying - enter aes-256-cbc encryption password: (I type "a" and hit enter)

key=0CC175B9C0F1B6A831C399E269772661CEC520EA51EA0A47E87295FA3245A605
iv =4FA92C5873672E20FB163A0BCB2BB4A4

Welcher Hash-Algorithmus generiert den ungesalzenen Hash key=in der vorletzten Zeile für die Eingabe "a"?

mk12
quelle

Antworten:

9

Ziemlich sicher, dass es sich um einen SHA1-Digest-Algorithmus handelt, aber ehrlich gesagt kann ich das nicht mit 100% iger Sicherheit sagen.

Und wer hätte gedacht, dass etwas, das die Stumpfheit erhöhen soll, stumpfe Anweisungen hätte;)

EDIT: Dies mag unter Ihren Umständen nicht hilfreich sein, aber ich denke, Sie könnten es immer wissen, wenn Sie es tun

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 
Snesticle
quelle
Ich habe festgestellt, dass standardmäßig MD5 verwendet wird. Wenn ich Ihren Befehl verwende (Nebenbemerkung: Keine dieser Optionen ist auf der Magierseite dokumentiert ...) , erhalte ich md5stattdessen sha1die gleichen Ergebnisse wie ursprünglich. Die Frage ist, wie es 256 Bit von MD5 (einem 128-Bit-Hashing-Algorithmus) erhält.
mk12
Eine Möglichkeit besteht darin, zwei unterschiedliche MD5 in binärer Form zu verketten, was zu einem echten 256-Bit-Schlüssel führt. Es gibt auch einige andere Methoden dafür. Sie können das PHP-Paket "md5_base64" auschecken. Auch wenn Sie kein PHP-Typ sind, sind die Dokumente ziemlich informativ.
Snesticle
4

Es ist eine Verkettung von zwei MD5-Hashes.

Es ist so abgeleitet:

128bit_Key = MD5(Passphrase + Salt)
256bit_Key = 128bit_Key + MD5(128bit_Key + Passphrase + Salt)

Sie können dies überprüfen, indem Sie Folgendes tun:

$ echo Testing > file
$ openssl enc -aes-256-cbc -p -in file -out file.aes -salt
: enter aes-256-cbc encryption password: abc
: Verifying - enter aes-256-cbc encryption password: abc
: salt=3025373CA0530C93
: key=E165475C6D8B9DD0B696EE2A37D7176DFDF4D7B510406648E70BAE8E80493E5E
: iv =B030394C16C76C7A94DC22FDDB6B0744
$ perl -e 'print pack "H*", "3025373CA0530C93"' > salt
$ echo -n abc > passphrase
$ cat passphrase > key.128.tmp
$ cat salt >> key.128.tmp
$ md5sum key.128.tmp 
: e165475c6d8b9dd0b696ee2a37d7176d  key.128.tmp
$ perl -e 'print pack "H*", "e165475c6d8b9dd0b696ee2a37d7176d"' > key.128
$ cat key.128 > key.256.tmp
$ cat passphrase >> key.256.tmp
$ cat salt >> key.256.tmp
$ md5sum key.256.tmp 
: fdf4d7b510406648e70bae8e80493e5e  key.256.tmp

Beachten Sie, dass beide MD5 von 'key.128.tmp' und 'key.256.tmp' zusammen den gleichen Schlüssel bilden wie die Ausgabe beim ersten Befehl.

user3281907
quelle
Und wenn Sie eine dritte Iteration durchführen, erhalten Sie die IV. Dieser Fall ist praktisch, da der Schlüssel und die Daten = IV-Größen (256 und 128 Bit) exakte Vielfache der Hash-Ausgabe sind. Im Allgemeinen verketten Sie die Hash-Ausgänge und nehmen die ersten K Bits für den Schlüssel und die nächsten D Bits für die IV.
Dave_thompson_085
Update: Die Standardeinstellung war md5, aber ab 1.1.0 im Jahr 2016 ist es sha256. Ausführliche Informationen unter crypto.stackexchange.com/questions/3298/…
dave_thompson_085
2

OpenSSL verwendet AES mit SHA1.

Wenn Sie eine besser geschriebene Quelle als OpenSSL untersuchen möchten, lesen Sie den Artikel
C ++ - Klasse, der mit OpenSSL-Chiffren verbunden ist .

Der Artikel enthält sehr einfachen Quellcode, der:

Ermöglicht das Ver- und Entschlüsseln von Dateien oder Zeichenfolgen mithilfe der OpenSSL AES-256-CBC-Verschlüsselungs- und SHA1-Digest-Algorithmen. Es ist mit dem Befehlszeilentool openssl kompatibel, was es zu einer guten Einführung in die Verwendung von OpenSSL für Chiffren macht.

harrymc
quelle
1

Ich kenne die Antwort nicht, aber Sie könnten sie wahrscheinlich leicht genug im OpenSSL-Quellcode finden .

Fran
quelle
2
"Leicht genug" - Die mainFunktion (in der sich die Funktion zum Abfragen von Passwörtern befindet) ist ca. 500 Zeilen lang und mit gotos übersät .
mk12
5
Beeindruckend. Ich habe mir nur den Quellcode angesehen. Es ist praktisch unlesbar. Keine Kommentare. Ein-Buchstaben-Variablennamen. Pfui. Es tut mir leid, dass ich das vorgeschlagen habe.
Fran