2016-02-18 20 views
5

CryptoJS.AES.encryptを使用する場合3番目の引数が関数に渡されないと、どのように初期化ベクトルが生成されますか?暗号化された文字列からそれを取得する方法はありますか?私はこれを必要と何も指定されていない場合、CryptoJSはどのようにIVを取得しますか?

理由は、私はLuaのを使用して返さCryptoJS.AES.encrypt何かの暗号化を解除する必要がありますが、私は提供されたキーを持っています。

+0

私には依然として不明で、答えを見つける方法がわかりません。まだ助けを探しています:( – warspyking

+0

Crypto-jsはオープンソースなので、ソースコードを簡単に調べることができます。関連するものにも答えました([1](http://stackoverflow.com/a/27971983/) 1816580)及び[2](http://stackoverflow.com/a/33942660/1816580)及び[3](http://stackoverflow.com/a/28361216/1816580))。これは、基本的にOpenSSLのEVP_BytesToKey関数です。 –

+0

@私は、例えばLuaの、言うにEVP_BytesToKeyをリメイク場合Artjom B.は、だから、はい – warspyking

答えて

6

CryptoJS」CryptoJS.<BlockCipher>.encryptは、暗号化の2つのモードがあります。

  1. あなたはが文字列ではなく、WordArray(バイナリデータ用CryptoJSの内部表現形式)ではないことをキーに渡すと、キーはそのままで取られています。このモードでは、IVを使用しないECB以外のすべての操作モードでIVが必要なので、指定する必要はありません。 IVが渡されない場合、(JavaScriptマジックによって)ゼロ充填IV(0x00バイトのフルブロックで構成される)にデフォルト設定されます。

  2. が文字列である「キー」を渡すと、「キー」はパスワードとみなされます。パスワードからキーを派生させるために、OpenSSL互換の導出関数EVP_BytesToKeyを使用します。このモードでは、新しい8バイトのランダムな塩が生成され、それをパスワードとともに使用してキーとIVを生成します。明示的にIVを渡しても、使用されません。 8バイトの塩と実際の暗号文に続く最初に文字列「Salted__」を含むBase64でエンコードされた暗号文で

    CryptoJS.AES.encrypt(msg, password).toString() 
    

    結果。

    var ct = CryptoJS.AES.encrypt(msg, password); 
    var saltHex = ct.salt.toString();  // random salt 
    var ctHex = ct.ciphertext.toString(); // actual ciphertext 
    var ivHex = ct.iv.toString();   // generated IV 
    

    同じキーの派生を再作成する必要がある場合は、明示的にこれを分割することができます。 the codethe specificationをご覧ください。

    キーが高いエントロピーを持ち、それらがブルート強制するのは難しい可能ランダムノイズ、区別できないはずです。上記のEVP_BytesToKeyは安全ではありません。なぜなら、MD5ハッシングは非常に高速で、攻撃者がパスワードをブルートフォースできるからです。非常に長いパスワード(20〜30文字)を使用するか、CryptoJSが提供するPBKDF2などの適切なキー導出関数を使用する必要があります。

+0

さて、ベース64を元に戻すことができるので、8バイトの塩はSalted__の後ろにあると言いますか?私はこのO_Oを解読する方法を知らない。私は何かを明らかにする、情報のおかげで、それは非常に便利だった。 – warspyking

+0

私はあなたが何を得たかまだ完全には分かっていません。私があなたを正しく理解しているなら、あなたはLuaアプリケーションから得たCryptoJSの暗号文を解読しようとしています。あなたがLuaコードにアクセスできるなら、暗号化がどのように行われたかを綿密に見てから、CryptoJSの対応する暗号化の仕方を決めることができます。また、 'CryptoJS.AES.decrypt'は' CryptoJS.AES.encrypt'とまったく同じメソッドをサポートしているので、復号化のためにEVP_BytesToKeyを複製する必要はありません。また、AESキーには特定の長さがありますが、パスワードには対応していません。あなたの鍵はどれくらいですか? –

+0

これは私がやっていることです:1. protectedtext.comで保護されたテキストを設定する2.パスワードを与える3.(私は信じています)サイトは私のパスワードを使ってそのハッシュを通ります。 5.ハッシュされた(そして基底64)状態から読みやすい人間の書式に戻すために、Luaコードを使用する必要があります。 – warspyking

関連する問題