私はActionScript3で機能する復号化を行っていますが、Javaで復号化するときに同じ結果を取得したいと思います。(OFBモードとNullPaddingはおそらく好ましくないことは知っていますが、それは当時私が使用していたものであり、今は復号化する必要があります...)
(非常に古い)AdobeActionScript 3コード:
static public function decryptTest(): Boolean {
var iv: String = "0df1eff724d50157ab048d9ff214b73c";
var cryptext: String = "2743be20314cdc768065b794904a0724e64e339ea6b4f13c510e2d2e8c95dd7409aa0aefd20daae80956dd2978c98d6e914d1d7b5b5be47b491d91e7e4f16f7f30d991ba80a81bafd8f0d7d83755ba0ca66d6b208424529c7111bc9cd6d11786f3f604a0715f";
var kkey: String = "375f22c03371803ca6d36ec42ae1f97541961f7359cf5611bbed399b42c7c0be";
var kdata: ByteArray = Hex.toArray(kkey);
var data: ByteArray = Hex.toArray(cryptext);
var name: String = 'aes-256-ofb';
var pad:IPad = new NullPad();
var mode: ICipher = Crypto.getCipher(name, kdata, pad);
pad.setBlockSize(mode.getBlockSize());
trace("mode block size: " + mode.getBlockSize());
if (mode is IVMode) {
var ivmode:IVMode = mode as IVMode;
ivmode.IV = Hex.toArray(iv);
}
mode.decrypt(data);
var res: String = data.toString();
trace("result: " + res);
return res == "01020506080b10131c22292d313536393b464c535466696d6e7d7f808a8e9899a2adb1b8babcbebfc1c6c7c8cecfd8e0e4e8ef";
}
trace("decryption test: " + netplay.decryptTest());
フラッシュ出力は次のとおりです。
mode block size: 16
result: 01020506080b10131c22292d313536393b464c535466696d6e7d7f808a8e9899a2adb1b8babcbebfc1c6c7c8cecfd8e0e4e8ef
decryption test: true
私は何を試しましたか?
私はJavaで2つの異なるアプローチを試しました。1つは組み込みCipher
クラスを使用し、もう1つはこのコード/クラスを使用します。ただし、最初のアプローチではIllegalKeyExceptionが発生し、もう1つのアプローチではガベージが発生します。また、2番目のアプローチでは、復号化のためにIVデータを入力する方法を明確に指定していません。また、OFBモードまたはパディングを指定することもできません。
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1023)
at javax.crypto.Cipher.implInit(Cipher.java:789)
at javax.crypto.Cipher.chooseProvider(Cipher.java:848)
at javax.crypto.Cipher.init(Cipher.java:1347)
at javax.crypto.Cipher.init(Cipher.java:1281)
at test.net.zomis.ZomisTest.decryptCipher(ZomisTest.java:112)
@Test
public void decryptCipher() throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
String iv = "0df1eff724d50157ab048d9ff214b73c";
String cryptext = "2743be20314cdc768065b794904a0724e64e339ea6b4f13c510e2d2e8c95dd7409aa0aefd20daae80956dd2978c98d6e914d1d7b5b5be47b491d91e7e4f16f7f30d991ba80a81bafd8f0d7d83755ba0ca66d6b208424529c7111bc9cd6d11786f3f604a0715f";
String key = "375f22c03371803ca6d36ec42ae1f97541961f7359cf5611bbed399b42c7c0be"; // Hexadecimal String, will be converted to non-hexadecimal String
String expectedResult = "01020506080b10131c22292d313536393b464c535466696d6e7d7f808a8e9899a2adb1b8babcbebfc1c6c7c8cecfd8e0e4e8ef";
byte[] kdata = Util.hex2byte(key);
Assert.assertEquals(32, kdata.length); // 32 bytes = 256-bit key
String result;
Cipher cipher;
cipher = Cipher.getInstance("AES/OFB/NoPadding");
// Below line is 112, which is causing exception
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(kdata, "AES"), new IvParameterSpec(iv.getBytes("UTF-8")));
byte[] cryptData = Util.hex2byte(cryptext);
byte[] ciphertext = cipher.doFinal(cryptData);
result = new String(ciphertext);
Assert.assertEquals(expectedResult, result);
}
@Test
public void decryptAES() {
String iv = "0df1eff724d50157ab048d9ff214b73c";
// Problem: Where should I specify the IV ???? Currently it is an unused variable...
String cryptext = "2743be20314cdc768065b794904a0724e64e339ea6b4f13c510e2d2e8c95dd7409aa0aefd20daae80956dd2978c98d6e914d1d7b5b5be47b491d91e7e4f16f7f30d991ba80a81bafd8f0d7d83755ba0ca66d6b208424529c7111bc9cd6d11786f3f604a0715f";
String key = "375f22c03371803ca6d36ec42ae1f97541961f7359cf5611bbed399b42c7c0be"; // Hexadecimal String, will be converted to non-hexadecimal String
String expectedResult = "01020506080b10131c22292d313536393b464c535466696d6e7d7f808a8e9899a2adb1b8babcbebfc1c6c7c8cecfd8e0e4e8ef";
Assert.assertEquals(64, key.length());
AES aes = new AES();
aes.setKey(Util.hex2byte(key));
byte[] byteCryptedData = Util.hex2byte(cryptext);
String byteCryptedString = new String(byteCryptedData);
while (byteCryptedString.length() % 16 != 0) byteCryptedString += " ";
String result = aes.Decrypt(byteCryptedString);
Assert.assertEquals(expectedResult, result); // Assertion Failed
}
質問: ActionScript 3と同じ方法でJava復号化を行うにはどうすればよいですか?もちろん、両方で同じ結果を得たいと思います。