2017-06-22 1 views
1

と同じ暗号文を解読することができます。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を使用しようとしました。

docsThe 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復号データが誤っているので

+0

[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

+0

さて、Node.js [Crypto API](https://nodejs.org/api/crypto.html)を見て、あなたは 'crypto.createDecipher(algorithm、password)'を使っています。私はそれがそれを説明すると思います。 – jww

+0

Hmmので、md5の導出が同じキーを生成して衝突していますか?もしそうなら、これは非常に大きなセキュリティ上の脆弱性のようです。 createDecipherメソッドはdeprecated(およびその全面的なインターネット上)には表示されませんが、使用しないことをお勧めします。 – andrsnn

答えて

2

それは正しく復号ないを持っています。

平文は16バイトです 16バイトのパディングが追加されるため、32バイトの暗号化データ 暗号化されたデータは64桁の16進数または32バイトです。

これはすべて意味があります。

今エラーのために、私はあなたがパディングが一貫していないで間違ったキー、パディングエラーを取得している疑いがあります。 PKCS#7 paddingを参照してください。

パディングエラーは、ではありません。正しい暗号化キーの有効なチェックです。正常に暗号化されているかどうかを確認する必要がある場合は、認証を追加する必要があります。

1

これはnode.js.にデフォルトでPKCS#7 paddingでパディングを行うためにMD5の衝突、すべてとは何の関係もありません

すべての値が同じ最後のバイトを削除することで、この手順を無効にすることができます。最後のバイトの値は、削除する必要のあるバイト数を直接決定します。値が0x02の場合、2バイトが削除されます。パディング内の他のバイトは、最後のバイトと同じ値を持つかどうかチェックされます。このチェックが失敗すると、エラーが発生します。

間違ったキー(またはこの場合のように、パスワード)で復号化する場合は、アンパディングの前に任意のランダムに見えるバイトを生成します。その後、アンパインドプロシージャはパディングを削除しようとし、失敗する可能性があります。しかし、失敗しない場合があります。最後のバイトは0x01の値にすることができ、これは既に有効なパディングであることを意味します。これは、256の確率で1になる可能性があります。

キーが正しいかどうかを確認する方法としてパディング手順を使用しないでください。代わりに、GCMまたはEAXのような認証モード、またはHMAC-SHA256のようなメッセージ認証コード(MAC)を通じて認証を使用する必要があります。

関連する問題