16

私は次の暗号化されたデータを持っています:

U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o

それを復号化するためのパスは次のとおりです。password

(これはgibberish-aesの例です)

opensslを使用したコマンドラインで:

echo "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o" | openssl enc -d -aes-256-cbc -a -k password

出力は次のとおりです。

Made with Gibberish\n

私のNodeJSアプリケーションで:

  var decipher = crypto.createDecipher('aes-256-cbc', "password");
  var dec = decipher.update("U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o",
     'base64', 'utf8');
  dec += decipher.final('utf8');

TypeError: DecipherFinal failその行で次のエラーが発生しましたdecipher.final

私は何かが足りないのですか?ありがとう。

4

1 に答える 1

17

暗号化されたデータは、ソルト(のASCIIエンコーディング)があることを示す8バイトの「魔法」で始まります"Salted__"。次に、次の8バイトがソルトです。悪いニュースです。Node.jsはEVP_BytesToKeyメソッドにソルトを使用していないようです。

int key_len = EVP_BytesToKey(cipher, EVP_md5(), NULL,
  (unsigned char*) key_buf, key_buf_len, 1, key, iv);

それNULLが塩です。

これは、Javaテストアプリケーションを使用して(適切なソルトを使用して)検証されています-結果の文字列が返されました。

OpenSSL-nosaltスイッチを使用してソルトを除外し、再試行してください。

[例]

OpenSSL CLI:

openssl enc -aes-256-cbc -nosalt -a -k password
owlstead
Mh5yxIyZH+fSMTkSgkLa5w==

NodeJS暗号:

var crypto=require('crypto')
var cipher=crypto.createDecipher('aes-256-cbc', "password")
var enc = cipher.update("Mh5yxIyZH+fSMTkSgkLa5w==", 'base64', 'utf8')
enc += cipher.final('utf8')

[後期編集]ソルトと大きな作業要素で秘密鍵導出を使用することは、セキュリティにとって最も重要である可能性があることに注意してください。非常に一意でエントロピーの高いパスワードを使用することをお勧めします。そうしないと、暗号化されたデータが危険にさらされる可能性があります。


[本当に遅い編集] OpenSSL1.1.0cは、一部の内部コンポーネントで使用されるダイジェストアルゴリズムを変更しました。以前は、MD5が使用され、1.1.0はSHA256に切り替えられました。EVP_BytesToKey変更がとの両方のコマンドに影響を与えないように注意してくださいopenssl enc

于 2012-09-11T22:10:54.750 に答える