Wenn Sie openssl enc
eine Passphrase verwenden, wird sie immer über eine KDF geleitet und niemals direkt als Schlüssel verwendet. using -nosalt
deaktiviert dies nicht. (Sie können die openssl enc -p
Option verwenden, um zu sehen, welcher Schlüssel und IV tatsächlich verwendet werden.) Um einen Rohschlüssel anzugeben, benötigen Sie die -K
Option.
(Beachten Sie, dass openssl enc -K
Wert erwartet wird, werden in hexadezimal, mittlerweile aes::aes -key
als 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- aes
Modul 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 enc
spricht 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