Java と JavaScript 間の AES暗合

JavaJavaScript 言語間の暗合文や鍵の渡し方はいろんな方法あるので
ここでは書きません。
相互での暗合復号の実際の実行を書いてます。
CBCモードで、PBKDF2WithHmacSHA1 です。
Java

JavaScript は、crypto-js を使います。
https://code.google.com/archive/p/crypto-js/

private SecretKeySpec key;
private IvParameterSpec iv;
private byte[] ivary;
byte[] keydata = password.getBytes();
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), keydata, 100, 256);
SecretKey secretKey = factory.generateSecret(spec);
key = new SecretKeySpec(secretKey.getEncoded(), "AES");
ivary = Arrays.copyOf(key.getEncoded(), 16);
iv = new IvParameterSpec(ivary);
/* 暗合化 */
public byte[] encrypt(String message){
   try{
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, key, iv);
      return cipher.doFinal(message.getBytes());
   }catch(Exception e){
      throw new RuntimeException(e);
   }
}
/* 復号 */
public byte[] decrypt(byte[] encbytes){
   try{
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
      cipher.init(Cipher.DECRYPT_MODE, key, iv);
      return cipher.doFinal(encbytes);
   }catch(Exception e){
      throw new RuntimeException(e);
   }
}

JavaScript

HTML で必要なJSソースの読込みは、jQuery の他に、、
aes.js
md5.js
pbkdf2.js

<script src="../cryptojs3.1.2/rollups/aes.js" type="text/javascript"></script>
<script src="../cryptojs3.1.2/rollups/md5.js" type="text/javascript"></script>
<script src="../cryptojs3.1.2/rollups/pbkdf2.js" type="text/javascript"></script>


CryptoJS復号

準備、共通鍵 password をUTF-8で読込み、Saltをランダム生成する

var secret_passphrase = CryptoJS.enc.Utf8.parse(password);
var salt = CryptoJS.lib.WordArray.random(256/32);

ブロック長と同じ PBKDF2 を生成
初期化ベクトル iv は、Java暗合実行で生成した iv を持ってくる。
この時16進数HEX表現から変換する

var keyBitsIterations = CryptoJS.PBKDF2(secret_passphrase, secret_passphrase, { keySize: 256/32, iterations: 100 });
var iv = CryptoJS.enc.Hex.parse($('#ivkey').val());
// 暗号化オプション(IV:初期化ベクトル, CBCモード, パディングモード:PKCS7
var options = {iv: iv, mode: CryptoJS.mode.CBC, keySize: 256 / 32, padding: CryptoJS.pad.Pkcs7};

暗合文 encedtext → 複合実行

var decrypted = CryptoJS.AES.decrypt(encedtext, keyBitsIterations, options);

decrypt 実行した byte から、
Hex文字列→decodeURI 可能にする。'%' 付与してデコードして復元する

var message_code = hexStrToURICode(decrypted);
var message = decodeURIComponent(message_code);

CryptoJS暗合

準備として、salt 、PBKDF2 を生成、オプション作成までは複合の手順と同じ。

暗号化実行

var encrypted = CryptoJS.AES.encrypt(planetxt, keyBitsIterations, options);

暗合化した結果の encrypted は、Base64 エンコードした文字列になる。