1
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

4

2 回答 2

3

您应该尝试使用十六进制解码器来解码您的密钥,而不是调用getBytes().

于 2013-01-16T21:54:15.880 回答
3

当您调用String.getBytes()JDK 文档)时,您使用平台的默认字符集将给定字符串的字符编码为字节序列。

您实际需要做的是将每个十六进制(也是以 16 为基数)数字(由0to9Ato两个字符表示,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空的)。

如果要在内部使用该方法,则该表单是可以接受的,但是如果您将其作为库的一部分对其他人可见,那么最好进行一些检查并在无效输入上抛出异常。

于 2013-01-17T12:35:40.753 回答