CryptoJSはクライアントサイドで暗号化や復号化ができる。
AESの鍵長は128bit以上だが、128bitより短いパスフレーズでもCryptoJSなら暗号化できる。
正確にはパスフレーズとsaltから鍵を内部で生成している。
var encrypted = CryptoJS.AES.encrypt('message', 'pass');
console.log(encrypted.salt.toString()); // 467c08b2364309e8
console.log(encrypted.key.toString()); // 6e475a9672994638c4231bd750ab7aceeb9004229f0a26c3622a2045deb789e9
上記のスクリプトのencrypted.key
が実際に使用される鍵である。
AESで暗号化したデータを復号化するときに進捗状況を確認したいのでCryptoJS.algo.AES.createDecryptor
を使用しようとしたときに問題がおこった。
サンプルは以下のように書いてあったが、salt
とpass
しかわからない状況では使用することができない。(key
には実際の鍵を入れる必要がある)
var aesDecryptor = CryptoJS.algo.AES.createDecryptor(key, { iv: iv });
var plaintextPart1 = aesDecryptor.process(ciphertextPart1);
var plaintextPart2 = aesDecryptor.process(ciphertextPart2);
var plaintextPart3 = aesDecryptor.process(ciphertextPart3);
var plaintextPart4 = aesDecryptor.process(ciphertextPart4);
var plaintextPart5 = aesDecryptor.finalize();
公式のトップを見ても解決方法がわからなかったのでソースをのぞいてみると以下の式で鍵を生成できることがわかった。
var key = CryptoJS.kdf.OpenSSL.execute(pass, 8, 4, salt).key;
もっといい方法があるかもしれない。