
暗号化メカニズムを使用するシェル スクリプトと Tcl スクリプトがあり、両方のスクリプトから同じ暗号出力を取得したいと考えています。
たとえば、tcl スクリプトとシェル スクリプトの出力暗号は同じである必要があります。使用したい暗号化メカニズムは、AES または DES のいずれかです。(実際のところ、どの暗号化メカニズムでも使用できます)
問題は、両方のスクリプトが異なる暗号テキストを生成していることです。
tcl では次のコマンドを使用しています:
[aes::aes -mode cbc -dir encrypt -key 1234567891012345 hi]
シェルスクリプトでは次のようになります:
echo -n "hi" | openssl enc -aes-128-cbc -nosalt -pass pass:1234567891012345
両方のコマンドの結果は同じになると想定していましたが、そうではありませんでした。コマンドが 2 回実行された場合、シェル スクリプトから同じ暗号が生成されるように、ソルト オプションは使用していません。
異なるスクリプトを使用して同じ暗号テキストを実現する方法はありますか?
答え1
パスフレーズを使用するように指示した場合openssl enc
、パスフレーズは常に KDF を介して入力され、キーとして直接使用されることはありません。 を使用すると、-nosalt
これが無効になることはありません。(openssl enc -p
実際に使用されているキーと IV を確認するには、オプションを使用できます。)生のキーを指定するには、-K
オプションが必要です。
(openssl enc -K
値は16進数では、一方、aes::aes -key
生のバイナリデータとして解釈されます。
もう一つの問題はパディングです。AESはブロック暗号なので、すべての入力データはパディングする必要がある16 バイト (AES ブロック サイズ) の倍数に拡張され、セキュリティ プロパティが異なる複数のパディング方法があります。Tclaes
モジュールは単純なゼロ パディングを使用し、データを 0x00 バイトで拡張します。
一方、OpenSSL は PKCS#7 パディングを使用し、パッド サイズに一致する値でブロックを埋めます。たとえば、入力が 2 バイトしかない場合は 14 バイトのパディングが必要なので、PKCS#7 に従って、すべてのパディング バイトの値も 14 (0x0E) になります。
(man enc
PKCS#5について言及しているが、これは8バイトブロックのみのパディング方式を定義した古い文書である。PKCS#7は後に全く同じ方式を定義した。任意のブロックサイズ。
CBCモードでは、IVを指定する(16 バイト、AES ブロック サイズと同じ)。Tcl モジュールは、デフォルトですべてゼロの IV を使用します。ただし、CBC は 2 番目以降のブロックにのみ IV を使用するため、短いテキストの出力には影響しません。
結論として、これらは同じ結果をもたらします (ゼロパディングを使用)。
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
これらも同様です (PKCS#7 パディングを使用):
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
パディングを実装するには:
set data "hi"
set pad [expr {16 - ([string length $data] % 16)}]
append data [string repeat [format %c $pad] $pad]
aes::aes -mode cbc -dir encrypt -key 1234567891012345 -hex $data