public static byte[] decryptByte(byte[] blahh, byte[] keyExample) throws Exception
{
Cipher cipher = null;
try
{
cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(Base64.decodeBase64(blah));
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
String keyExample = "99112277445566778899AABBCCDDEEFF0123456789ABCDEF0123456789ABCDEF";
byte[] key = keyExample.getBytes();
byte[] barrayMessage = {123,45,55,23,64,21,65};
byte[] result = decryptByte(barrayMessage, key);
抛出异常:java.security.InvalidKeyException: Invalid AES key length: 64 bytes
答案 0 :(得分:3)
您应该尝试使用十六进制解码器解码密钥,而不是调用getBytes()
。
答案 1 :(得分:3)
当您调用String.getBytes()
(JDK documentation)时,您使用平台的默认字符集将给定字符串的字符编码为字节序列。
您实际需要做的是转换每个十六进制(也是基数为16)的数字(由0
到9
和A
两个字符表示为F
例如,1A
,99
等)到其对应的数字(byte
)值中"FF"
- > -1
字节。
示例代码如下:
import static java.lang.Character.digit;
...
private static byte[] stringToBytes(String input) {
int length = input.length();
byte[] output = new byte[length / 2];
for (int i = 0; i < length; i += 2) {
output[i / 2] = (byte) ((digit(input.charAt(i), 16) << 4) | digit(input.charAt(i+1), 16));
}
return output;
}
...
String keyExample = "99112277445566778899AABBCCDDEEFF0123456789ABCDEF0123456789ABCDEF";
byte[] key = stringToBytes(keyExample);
byte[] barrayMessage = {123,45,55,23,64,21,65};
byte[] result = decryptByte(barrayMessage, key);
请记住,因为我们将每两个字符转换为单个字节,所以建议的方法假定您的输入将具有偶数个字符(输入也不是null
并且为空)。
如果该方法将在内部使用,那么表单是可以接受的,但是如果你将它作为其他人可见的库的一部分,那么最好放一些检查并在无效输入上抛出异常。