Java と JavaScript 間の AES暗合 - Oboe吹きプログラマの黙示録
に書いたように、PBKDF2WithHmacSHA1 で実行する AES暗合も一計ですが、
単純に、SHA-256 ハッシュ&初期ベクトルを単純にハッシュ値から持ってくる方法も、
CryptoJS で書こうと思えば書けます。
Java の以下のキーの生成に対応した CryptoJS の方法を考えます。
private SecretKeySpec key; private IvParameterSpec iv;
byte[] keydata = password.getBytes(); MessageDigest sha = MessageDigest.getInstance("SHA-256"); keydata = sha.digest(keydata); keydata = Arrays.copyOf(keydata, 32); key = new SecretKeySpec(keydata, "AES"); iv = new IvParameterSpec(Arrays.copyOf(key.getEncoded(), 16));
これに対応する JavaScript のコードを書けば良いわけです。
code.google.com
からは、以下を使います。
sha256.js
aes.js
テキスト入力パスワード→ SHA256
var passwd = $('#planetext').val(); var key = CryptoJS.SHA256(passwd);
SHA256キー→16bute の Hex表現
var ivhex = CryptoJS.enc.Hex.stringify(key).substring(0, 32);
平文 planetext,→ 暗合化
var encrypted = CryptoJS.AES.encrypt(planetext, key, { iv: CryptoJS.enc.Hex.parse(ivhex), mode: CryptoJS.mode.CBC, keySize: 256 / 32, padding: CryptoJS.pad.Pkcs7 });
暗合文 encrypted,→ 復号 message
var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: CryptoJS.enc.Hex.parse(ivhex), mode: CryptoJS.mode.CBC, keySize: 256 / 32, padding: CryptoJS.pad.Pkcs7 }); var message_code = hexStrToURICode(decrypted); var message = decodeURIComponent(message_code);
CryptoJS の機能で、覚えておくと便利そうなメソッド
var key256base64 = CryptoJS.SHA256(key).toString(CryptoJS.enc.Base64);
→ key の SHA256 を求めて Base64エンコードした文字列を取得します。
続けて、CryptoJS.enc.Hex.stringify で、CryptoJS.SHA256の結果を渡せば、
CryptoJS.SHA256 は、byte配列を返すものを 16進数で文字列として読み込むことで同じ結果になります。
var k = CryptoJS.enc.Hex.stringify( CryptoJS.SHA256(key) );
→ CryptoJS.enc.Hex.stringify で、16進→文字列、
→ CryptoJS.enc.Hex.parseで、16進文字列→byte array