Verschlüsselungskompatibilität zwischen TCL und openssl

508
Aditya Mayank Shankar

Ich habe ein Shell-Skript und ein Tcl-Skript, das einen Verschlüsselungsmechanismus verwendet, und möchte eine gleiche Verschlüsselungsausgabe von beiden Skripts haben.

Zum Beispiel sollte die Ausgabechiffrierung von Tcl-Skript und Shell-Skript dieselbe sein. Der Verschlüsselungsmechanismus, den ich verwenden möchte, ist entweder AES oder DES. (und ich bin offen für die Verwendung aller Verschlüsselungsmechanismen in der Tat)

Das Problem ist, dass beide Skripte unterschiedliche Chiffretexte erzeugen.

In tcl verwende ich den folgenden Befehl:

[aes::aes -mode cbc -dir encrypt -key 1234567891012345 hi] 

und in Shell-Skript:

echo -n "hi" | openssl enc -aes-128-cbc -nosalt -pass pass:1234567891012345 

Ich nahm an, dass das Ergebnis beider Befehle dasselbe sein wird, ist es aber nicht. Ich verklage keine Salt-Option, so dass die gleiche Chiffre aus dem Shell-Skript generiert wird, wenn der Befehl zweimal ausgeführt wird.

Gibt es eine Möglichkeit, mit verschiedenen Skripten denselben Chiffretext zu erreichen?

1

1 Antwort auf die Frage

2
grawity

Wenn Sie openssl enceine Passphrase verwenden, wird sie immer über eine KDF geleitet und niemals direkt als Schlüssel verwendet. using -nosaltdeaktiviert dies nicht. (Sie können die openssl enc -pOption verwenden, um zu sehen, welcher Schlüssel und IV tatsächlich verwendet werden.) Um einen Rohschlüssel anzugeben, benötigen Sie die -KOption.

(Beachten Sie, dass openssl enc -KWert erwartet wird, werden in hexadezimal, mittlerweile aes::aes -keyals unformatierte Binärdaten interpretiert.)

Das andere Problem ist das Auffüllen. Da AES eine Blockverschlüsselung ist, müssen alle Eingabedaten auf ein Vielfaches von 16 Bytes aufgefüllt werden (AES-Blockgröße), und es gibt mehrere Auffüllmethoden mit unterschiedlichen Sicherheitseigenschaften. Das Tcl- aesModul verwendet einfaches Auffüllen mit Nullen, wodurch die Daten um 0x00 Byte erweitert werden.

Inzwischen verwendet OpenSSL die PKCS # 7-Auffüllung und füllt den Block mit einem Wert, der der Pad-Größe entspricht. Wenn Ihre Eingabe beispielsweise nur aus 2 Bytes besteht, werden 14 Bytes aufgefüllt, so dass laut PKCS # 7 jedes Pad-Byte ebenfalls den Wert 14 (0x0E) hat.

( man encspricht von PKCS # 5, einem älteren Dokument, das das Füllschema nur für 8-Byte-Blöcke definiert. PKCS # 7 definierte später dasselbe Schema für jede Blockgröße .)

Für den CBC-Modus müssen Sie auch eine IV angeben (16 Byte, entsprechend der AES-Blockgröße). Das Tcl-Modul verwendet standardmäßig ein All-Zero-IV. Obwohl CBC die IV nur für 2. und spätere Blöcke verwendet, hat dies keinen Einfluss auf die Ausgabe für Kurztext.

Zusammenfassend erhalten Sie also identische Ergebnisse (mit Nullabstand):

aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex "hi"  printf 'hi\0\0\0\0\0\0\0\0\0\0\0\0\0\0' \ | openssl enc -aes-128-cbc -nopad \ -K 31323334353637383931303132333435 \ -iv 00000000000000000000000000000000 \ | hexdump -C 

Auch diese (mit PKCS # 7-Padding):

aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex \ "hi\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e"  printf 'hi' \ | openssl enc -aes-128-cbc \ -K 31323334353637383931303132333435 \ -iv 00000000000000000000000000000000 \ | hexdump -C 

So implementieren Sie die Auffüllung:

set data "hi" set pad [expr ] append data [string repeat [format %c $pad] $pad] aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex $data 
PKCS5 / 7-Padding wird immer hinzugefügt, auch wenn es ein voller Block ist (hier 16). Undokumentierte lustige Tatsache: `-iv 00` fügt Nullbytes ein und ist einfacher zu tippen. Gleiches gilt für `-K`, falls erforderlich (nicht hier). dave_thompson_085 vor 6 Jahren 0
Vielen Dank für die Erklärung und es hat eine Menge meiner Zweifel geklärt. Ich schätze Ihre Hilfe @grawity. Ich habe jedoch eine Frage. Wie konvertiert man den Schlüssel 1234567891012345 in 31323334353637383931303132333435? Aditya Mayank Shankar vor 6 Jahren 0
Fand es! es ist ein Hexadezimalwert! Vielen Dank Aditya Mayank Shankar vor 6 Jahren 1