问题描述
我在ActionScript 3工作解密,现在我想在Java中解密时,得到同样的结果。 (我知道,OFB模式和NullPadding可能不是preferred,但是这就是我用当时,这就是我现在需要解密...)
I have a working decryption in ActionScript 3, now I want to get the same result when decrypting in Java. (I know that the OFB-mode and NullPadding is probably not preferred, but that's what I used back then and that is what I need to decrypt now...)
(很老)的Adobe ActionScript 3的code:
(very old) Adobe ActionScript 3 code:
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());
闪光输出是:
Flash output is:
mode block size: 16
result: 01020506080b10131c22292d313536393b464c535466696d6e7d7f808a8e9899a2adb1b8babcbebfc1c6c7c8cecfd8e0e4e8ef
decryption test: true
我有什么企图?
我已经尝试了两种不同的方法在Java中,一个使用内置的密码
类,以及一个使用的。然而,第一种方法给了我一个IllegalKeyException,另一个是给我的垃圾。此外,第二种方法并没有明确规定如何进入IV-数据解密,也没有让我指定OFB模式或填充。
I have tried two different approaches in Java, one using the built-in Cipher
class, and one using this code/class. However, the first approach gives me an IllegalKeyException and the other is giving me garbage. Also, the second approach doesn't clearly specify how to enter the IV-data for the decryption, nor does it let me specify the OFB-mode or the padding.
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
}
的问题:我怎样才能让Java解密同样的方式,ActionScript 3的呢?当然,我想获得在两个相同的结果。
The question:How can I make Java decrypt in the same way that ActionScript 3 does? Of course, I'd like to get the same result on both.
推荐答案
第一种方法是给你一个非法密钥大小
错误消息,因为你没有不受限制安装策略文件。 Java将拒绝与强的密钥长度(如256位AES),而在这些地方工作。
The first approach is giving you an Illegal key size
error message because you don't have the unrestricted policy files installed. Java will refuse to work with "strong" key lengths (e.g. 256-bit AES) without these in place.
如果是合法的,这样做在你的管辖范围,谷歌的无限强度权限策略文件的适用版本下载到您的Java安装。你最终将两个文件转储到您的JRE lib / security中
。
If it is legal to do so in your jurisdiction, Google for "Unlimited Strength Jurisdiction Policy Files" and download the version applicable to your Java installation. You will end up with two files to dump into lib/security
in your JRE.
这篇关于Java的AES-256解密 - 从ActionScript 3的平移code的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!