と同じ暗号文を解読することができます。Nodejs createDecipherは、Nodejs createDecipherを使用している間、私は一見二つの異なるキーを使用して、エラーなしで同じ暗号文データペイロードを復号化することができる午前二つの異なるキー
var ciphertext = '31c655f86b39fc9ac1dd96d7ae5e9d905e7c977df9ea70e6b87d3504caf03760';
var key1 = 'asdf';
var key2 = '8bc94f258d9aaf509061b5ff52bfeb019ce802959c41eaa188beacd5e33f21db';
function decrypt(data, key) {
var decipher = crypto.createDecipher('aes-256-cbc', key);
var decrypted = decipher.update(data, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// 890736.159999999
console.log(decrypt(ciphertext, key1));
// ������F������쭳����M2�����C�<
console.log(decrypt(ciphertext, key2));
2番目のキーを使用して復号化すると、EVP_DecryptFinal_ex:bad decrypt
エラーが発生すると予想されます。エラーがスローされないが、2番目のキーによって生成復号化された値ではない8bc94f258d9aaf509061b5ff52bfeb019ce802959c41eaa188beacd5e33f21dd
:2番目のキーを使用して
crypto.js:153
var ret = this._handle.final();
^
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Error (native)
at Decipher.Cipher.final (crypto.js:153:26)
at decrypt (/Users/user/decrypt.js:8:27)
at Object.<anonymous> (/Users/user/decrypt.js:13:13)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:148:18)
:私は、エラーが生成され、第2の鍵で単一の文字を変更すると、実際には正しい、890736.159999999が必要です。
私は、Mac上でノード6.10.3、4.4.6および5.10を使用して試してみました。 amazon linuxを実行しているドッカーコンテナでノード6.10.3を使用しようとしました。
docs:The implementation of crypto.createDecipher() derives keys using the OpenSSL function EVP_BytesToKey with the digest algorithm set to MD5, one iteration, and no salt.
によると、おそらくmd5の衝突がありますか?第2復号データが誤っているので
[docs](https://nodejs.org/dist/latest-v6.x/docs/api/crypto.html#crypto_crypto_createdecipher_algorithm_password)によると、それは?'crypto.createDecipher()の実装では、OpenSSL関数EVP_BytesToKeyを使用してダイジェストアルゴリズムをMD5に設定し、1回の反復でsaltを使用してキーを生成します。 'キーの長さはエラーなしで変更できます。 md5の派生から来た古いバージョンの128bitキーを使用していると仮定しています。私は絶対に問題を提出することができます。 – andrsnn
さて、Node.js [Crypto API](https://nodejs.org/api/crypto.html)を見て、あなたは 'crypto.createDecipher(algorithm、password)'を使っています。私はそれがそれを説明すると思います。 – jww
Hmmので、md5の導出が同じキーを生成して衝突していますか?もしそうなら、これは非常に大きなセキュリティ上の脆弱性のようです。 createDecipherメソッドはdeprecated(およびその全面的なインターネット上)には表示されませんが、使用しないことをお勧めします。 – andrsnn