AES 128 で暗号化された文字列に対して復号化できる JavaScript ライブラリを探しました。私はいくつか見つけました:
- http://www.movable-type.co.uk/scripts/aes.html
- http://www.hanewin.net/encrypt/aes/aes-test.htm : ソースを確認する必要があります
- https://code.google.com/p/crypto-js/
私の問題は、これらのアルゴリズムが文字列または HexString のいずれかを入力として受け取ることです。私の入力はバイト配列であるため、私のケースは少し特殊です。Javaでテスト ケースをコーディングしました。
String key = "MrSShZqHM6dtVNdX";
String message = "NzZiNGM3ZjIyNjM5ZWM3M2YxMGM5NjgzZDQzZDA3ZTQ=";
String charsetName = "UTF-8";
String algo = "AES";
// decode message
byte[] decodeBase64 = Base64.decodeBase64(message.getBytes(charsetName));
System.out.println("decoded message: " + new String(decodeBase64));
// prepare the key
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(charsetName), algo);
// aes 128 decipher
Cipher cipher = Cipher.getInstance(algo);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] doFinal = cipher.doFinal(Hex.decodeHex(new String(decodeBase64).toCharArray()));
System.out.println("done with: " + new String(doFinal));
出力は次のとおりです。
decoded message: 76b4c7f22639ec73f10c9683d43d07e4
done with: 390902
しかし、これはJavaですよね?このorg.apache.commons.codec.binary.Hex.decodeHex
メソッドは、16 進値を表す文字配列を同じ値のバイト配列に変換します。返される配列は、指定されたバイトを表すのに 2 文字かかるため、渡された配列の長さの半分になります。渡された char 配列の要素数が奇数の場合、例外がスローされます。
10 進数表現では、Hex.decodeHex
メソッドは次のバイト配列を提供します。[118, -76, -57, -14, 38, 57, -20, 115, -15, 12, -106, -125, -44, 61, 7, -28];
Java AES デシファーはバイト配列を入力として受け取りますが、Javascript ではそれを行う lib はありません。私はここにあるものを少し調整しようとしましたが、それはハードコアなコードです. これは本当に私の分野ではありません...
私が行った中で最も近いのは、このオンラインツールでした。私のキーはMrSShZqHM6dtVNdX
、apache commons Hex.encodeHex を使用すると、4d725353685a71484d366474564e6458 を取得して、3339303930320a0a0a0a0a0a0a0a0a0a の出力を得ることができます。