Java と JavaScript 言語間の暗合文や鍵の渡し方はいろんな方法あるので
ここでは書きません。
相互での暗合復号の実際の実行を書いてます。
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); } }
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);