web-dev-qa-db-ja.com

opensslを使用して、キーと初期化ベクトルを使用してAES暗号化データを復号化するにはどうすればよいですか?

この質問の例を実行しようとしています: OpenSSL AES暗号化のソルトはどこですか? ですが、キーと初期化ベクトルを使用した復号化に問題があります。

次のように暗号化すると、パスフレーズとして「abc」が使用されます。

$ echo -n Polaco | openssl enc -aes-256-cbc -a -p
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
salt=0EEC20170C1B2A76
key=33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8
iv =0C4CAA4A27FE3BFB05399AF217D24357
U2FsdGVkX18O7CAXDBsqdsqiOcaoPpa2OcFAtk2jQGY=

同じパスフレーズを使用して、結果のテキストを復号化できます。

$ echo U2FsdGVkX18O7CAXDBsqdsqiOcaoPpa2OcFAtk2jQGY= |  openssl enc -d -a -aes-256-cbc -p
enter aes-256-cbc decryption password:
salt=0EEC20170C1B2A76
key=33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8
iv =0C4CAA4A27FE3BFB05399AF217D24357
Polaco

しかし、パスフレーズの代わりにキーと初期化ベクトルを使用して復号化しようとすると、失敗します。

$ echo U2FsdGVkX18O7CAXDBsqdsqiOcaoPpa2OcFAtk2jQGY= |  openssl enc -d -a -aes-256-cbc -p -K 33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8 -iv 0C4CAA4A27FE3BFB05399AF217D24357
salt=1250FC9CF97F0000
key=33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8
iv =0C4CAA4A27FE3BFB05399AF217D24357
bad decrypt
4294956672:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:531:

暗号化されたテキストから抽出されたソルトが間違っていることに注意してください。

必要に応じて、x86_64マシンを使用して、Windows 10でCygwinを実行しています。

$ openssl version
OpenSSL 1.0.2n  7 Dec 2017

基本的なものが欠けているような気がします。

解決策@mvy問題は、ソルトがデフォルトでランダムに生成されることですが、復号化にキーとivを指定する場合、ソルトがあってはなりません。 -nosaltオプションを使用してソルトを抑制する必要があります。

$ echo -n Polaco | openssl enc -aes-256-cbc -nosalt -p -out /tmp/pol1
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
key=900150983CD24FB0D6963F7D28E17F72EA0B31E1087A22BC5394A6636E6ED34B
iv =2EFFA65AF1C5EB20572E2F9896B90FEB

$ openssl enc -d -aes-256-cbc -nosalt -p -in /tmp/pol1 -K 900150983CD24FB0D6963F7D28E17F72EA0B31E1087A22BC5394A6636E6ED34B -iv 2EFFA65AF1C5EB20572E2F9896B90FEB
key=900150983CD24FB0D6963F7D28E17F72EA0B31E1087A22BC5394A6636E6ED34B
iv =2EFFA65AF1C5EB20572E2F9896B90FEB
Polaco
1
echawkes

コマンドのパスワード形式を使用する場合、ソルトはデータストリームの先頭に出力されます。 -aを使用する場合、ソルトをbase64データにエンコードします。

Key + IVメソッドはソルトを必要とせず、opensslはそれをデコードされたbase64文字列から削除しません。

エンコードコマンドの先頭に-nosaltを使用してエンコードして、もう一度お試しください。

編集:コメントで@forestが言ったように、-nosaltでパスワードオプションを使用しないでください。これは安全ではなく、Key/IVメソッドはペアが安全に保護されていると想定します。

最初にパスワード方式を使用する必要がある場合は、データストリームの開始時にソルトデータを挿入する方法について読んでから削除することをお勧めします。 base64出力と互換性がない可能性があります。

2
M'vy