- Der Schlüssel und die IV werden mithilfe eines OpenSSL-spezifischen Algorithmus, auf den das OpenSSL-Team nicht stolz ist, aus dem von Ihnen angegebenen Kennwort abgeleitet. Sie behalten es aus Gründen der Abwärtskompatibilität bei, empfehlen jedoch die Verwendung besserer kennwortbasierter Funktionen zur Schlüsselableitung, z. B. PBKDF2 von PKCS.
OpenSSLs maßgeschneiderter Algorithmus zur Schlüsselableitung ist in der Funktion EVP_BytesToKey (3) enthalten .
Schlüssel:
-K key der tatsächlich zu verwendende Schlüssel: Dies muss als Zeichenfolge dargestellt werden, die nur aus Hexadezimalziffern besteht.
IV:
In der Kryptographie ist ein Initialisierungsvektor (IV) oder eine Startvariable (SV) [1] eine Eingabe mit fester Größe in ein kryptografisches Grundelement, das typischerweise zufällig oder pseudozufällig sein muss.
Das IV ist also eine zusätzliche Eingabe, die zum Verschlüsseln der Datei verwendet wird. Es ist nicht der Schlüssel (ich denke, es ist nur Terminologie).
2 Ein Salt ist ein Zusatz (Präfix) zu dem von Ihnen angegebenen Schlüssel. (Siehe Wikipedia . Es ist unmöglich, Regenbogentabellen oder vorberechnete Hash-Tabellen für Ihren Schlüssel zu verwenden. Das Salz wird normalerweise unverschlüsselt gespeichert.
3 Die Ausgabe ist binär und enthält höchstwahrscheinlich nicht druckbare Zeichen. Ihr Terminal-Emulator wird versuchen, diese Bytewerte als druckbare Zeichen in der Standard-Zeichencodierung und -Schrift darzustellen, aber sie sehen wahrscheinlich wie "Garbage Text" aus und sind nicht sicher für Kopieren / Einfügen, FTP oder E-Mail.
4 Um einen verschlüsselten Text zu entschlüsseln, benötigen Sie den Schlüssel und IV. Wenn Sie keinen oder beide haben und die fehlenden aus dem Passwort abgeleitet wurden, können Sie den fehlenden Schlüssel und / oder IV aus dem Passwort ableiten, wenn Sie das Passwort haben. Sie brauchen das Salz nicht, weil Sie es bereits haben; Es wird an den Anfang des verschlüsselten Textes angehängt. Das Salt ist kein Geheimnis, es ist nur eine Möglichkeit, vorberechnete Hash-Tabellen und Regenbogentabellen zu vereiteln.
5 Wie in EVP_BytesToKey (3) definiert, lauten--nosalt
die ersten 16 Bytes Ihres Schlüssels , wenn Sie ein Kennwort von "1" und "1" verwenden :
md5( D_0 || password || salt)
(Beachten Sie, dass in diesem Zusammenhang ||
Verkettung bedeutet, nicht logisch or
)
das ist äquivalent zu
md5 ( `null` || "1" || `null`)
das ist äquivalent zu
md5("1")
Was sich herausstellt
0xc4ca4238a0b923820dcc509a6f75849b
Dieser Wert wird von der Manpage aufgerufen D_1
.
Die verbleibenden benötigten Bytes von Key und IV werden folgendermaßen generiert:
md5( D_1 || password || salt)
das ist äquivalent zu
md5( 0xC4CA4238A0B923820DCC509A6F75849B || "1" || `null` )
das ist äquivalent zu
md5( 0xC4CA4238A0B923820DCC509A6F75849B31 )
(Beachten Sie, dass die ASCII "1" am Ende des D_1
Werts 0x31 verkettet wird.)
was sich herausstellt:
0x7976c7161415c830816dd4068a1d9a52
Das ist, was diese Manpage D_2 nennt.
Der Schlüssel benötigt nur 8 Bytes mehr als D_1
bereits bewiesen, also nimmt er die ersten 8 Bytes von D_2 und wird:
Key: C4CA4238A0B923820DCC509A6F75849B7976c7161415c830
Die IV benötigt nur 8 Bytes und da es 8 unbenutzte Bytes von D_2 gibt, werden sie zur IV:
IV: 816dd4068a1d9a52
Hier ist eine Befehlszeile zum Generieren von D_1, den ersten 16 Bytes des Schlüssels (am Beispiel des Passworts "1" und --nosalt
):
echo -n "1" | openssl md5
Hier ist eine Befehlszeile zum Generieren von D_2, den verbleibenden 8 Bytes des Schlüssels sowie allen 8 Bytes des IV (auch hier, wenn Sie die Beispieleingaben verwenden):
echo -n "$(echo -n "1" | openssl md5 -binary)1" | md5
Dies funktioniert, indem die Ausgabe von D_1 (indem sichergestellt wird, dass sie binär bleibt, anstatt in ASCII-codierte Hexadezimalziffern übersetzt zu werden), "1" (0x31) angehängt und die Ausgabe daraus entnommen wird md5
.