単純な暗号文を使用するopensslの正しいオプション

単純な暗号文を使用するopensslの正しいオプション

先週末にパスワードの問題があり、暗号文は次の16進数でした。

FC 89 BF C2 B0 5F 1C 2E 64 B8 78 43 92 78 3A C9

私はこれがREDRYDERキーでAES / Rijndael 128ビットECBを使用して暗号化されていると確信しており、これを確認するためのソリューションが公開されました。プレーンテキストはFLAG = DAISYです。私はソルトやIV文字列なしで解読する単純なPHP mcryptスクリプトを書いて、正しく解読しました。ただし、opensslを使用しようとするとプレーンテキストは表示されません。

echo "0: FC 89 BF C2 B0 5F 1C 2E 64 B8 78 43 92 78 3A C9" | xxd -r | openssl aes-128-ecb -d -k REDRYDER -nosalt -nopad ; echo

これはほんの一部のバイナリデータを出力します。また、バイト交換を行うためにdd conv = swabを介して入力を渡してみました。

私は何が間違っていましたか?

答え1

このopensslコマンドラインツールはOpenSSLライブラリのデモです。やや不規則なインターフェースと悪い文書があります。 OpenSSLライブラリをテストする以外の目的には使用しないことをお勧めします。 (はい、CAを管理するのに慣れている人がいます。openssl彼らの精神が心配です。)

AESパスワードの代わりにキーを使用してください。 AES-128キーは正確に16バイトです。

このオプションは-kキーを入力として許可せず、パスワードを許可します。パスワードはキーを派生させるためにハッシュされます。デフォルトはMD5で、コマンドラインオプションを使用して上書きできます-md。私が知る限り、この内容はマニュアルに文書化されていません。ソースコード(apps/enc.c、呼び出しEVP_BytesToKey)のみを読むだけです。 MD5ダイジェストはすべての文字列で16バイトの値を生成しますが、ここではその値は使用されません。この場合、キーは実際にはヌルバイトがあるREDRYDER\0\0\0\0\0\0\0\0場所にあります\0

このオプションを使用すると、-Kキーを16進数で渡すことができます。キーサイズより少ないバイトを渡すと、OpenSSLはnullバイトで完了します。したがって、キーを渡すにはをREDRYDER\0\0\0\0\0\0\0\0渡すことができます。$(echo REDRYDER | od -An -tx1 | tr -d ' ')5245445259444552

52454452594445520000000000000000 키를 사용하여 암호문 블록 FC89BFC2B05F1C2E64B8784392783AC9에서 AES-128-ECB 암호 해독 작업을 수행하고 464c41473d444149535900000000000을 얻습니다. 0(16進バイトシーケンスとして表示)。それはFLAG=DAISY\0\0\0\0\0\0

このような小規模な暗号化タスクでは、Pythonのトップレベルを使用するのが好きです。暗号通貨図書館。

>>> from binascii import hexlify, unhexlify
>>> from Crypto.Cipher import AES
>>> ciphertext = unhexlify('FC 89 BF C2 B0 5F 1C 2E 64 B8 78 43 92 78 3A C9'.replace(' ', ''))
>>> key = 'REDRYDER'.ljust(16, '\0')
>>> AES.new(key, AES.MODE_ECB).decrypt(ciphertext)
'FLAG=DAISY\x00\x00\x00\x00\x00\x00'

答え2

これは働きます:

echo '0: FC89BFC2B05F1C2E64B8784392783AC9' | xxd -r | openssl enc -aes-128-ecb -d -nopad -nosalt -K 5245445259444552

-kオプションへの入力はわかりませんが、プレーンテキストキーを16進数(正しいバイト順)に変換し、代わりに-Kを使用すると機能します。

opensslは桟橋です!

関連情報