8

AES 暗号化用に 256 ビットのパスワードを生成したいと考えています。暗号化後のパスワードを確認すると、初期パスワードと異なっています。私は何を間違っていますか?または、私が認識していないセキュリティメカニズムがありますか?

私のコード:

password=Generate_key();

var encrypted = CryptoJS.AES.encrypt("Message", password);

//Those two should be the same
document.write(password+"<br>");
document.write(encrypted.key);


function Generate_key() {
    var key = "";
    var hex = "0123456789abcdef";

    for (i = 0; i < 64; i++) {
        key += hex.charAt(Math.floor(Math.random() * 16));
        //Initially this was charAt(chance.integer({min: 0, max: 15}));
    }
    return key;
}

出力はつまり

0b05308c9a00f07044416bad7a51bacd282fc5c0c999551a4ff15c302b268b20 4df875993770411044fb35953166ee7833c32ca0741e9fec091dfa10138039e8

これは正常ですか、それともここで何か間違ったことをしていますか? 手伝ってくれてありがとう!

4

2 に答える 2

17

暗号化は、人間が読める文字列を意味するパスワードではなく、バイナリ ビットのセットであるキーを使用して行われます。

パスワードからキーに移行するには、PBKDF2 などのパスワードベースのキー派生関数を使用できます。Crypto-JS にはすでにPBKDF2関数が組み込まれています。

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
<script>
    var salt = CryptoJS.lib.WordArray.random(128/8);

    var key128Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 128/32 });
    var key256Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 });
    var key512Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32 });

    var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 });
</script>

一般に、できるだけ多くの反復回数を使用してください。

上記の例のように、Salt はランダムな値である必要があります。もちろん、同じパスフレーズで同じキーを取得するには、その値を繰り返し回数と共に保存する必要があります。

于 2014-04-05T03:32:11.040 に答える
2

解決策を見つけました。var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });を使用して独自のキーを定義できます 。

だから私のソースコードは次のとおりです。

key=CryptoJS.enc.Hex.parse(Generate_key());
iv=CryptoJS.enc.Hex.parse(Generate_key());
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });
于 2014-04-08T08:29:49.243 に答える