2013-02-14 66 views
-1

基本上,我试图将用户指定的字符串散列到256位字节数组中,以便在使用Java的AES256实现加密数据时用作密钥。我一直得到这个运行时异常:非法密钥大小或默认参数

java.security.InvalidKeyException: Illegal key size or default parameters 

我怀疑这是因为一些字节不是8位长,所以整体密钥大小不是256位。我想知道如何用左边的0填充它们,所以确保密钥的长度?

编辑:

这是从一个值到一个消息摘要的转化:

MessageDigest hasher = MessageDigest.getInstance("SHA-256"); 
// Use the factory method to get the SHA-256 instance of a MessageDigest object. 
hasher.update(input.getBytes()); 
// Update the message digest object with the bytes of the value to hash. 
return hasher.digest(); 
// Hash the value and return the string representation. 

这是加密,使用从“散列器”的输出。

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 
cryptoTool.init(Cipher.ENCRYPT_MODE, key); // This is where the error fires. 

return String.valueOf(cryptoTool.doFinal(plaintext.getBytes())); 
+1

您可以确定所有字节在Java中都是8位长。 – Axel 2013-02-14 22:42:46

+0

Okey doke。那么你能想到另一个原因,为什么我可能会得到SHA256散列结果的无效密钥异常? – christopher 2013-02-14 22:43:48

+0

你能提供你的代码吗?这可能会帮助我们确定问题。 – 2013-02-14 22:44:11

回答

-1

我猜可能字符串不是32个字符?或者你有一个可能包含非ASCII字符的字符串?

以下函数将接收一个字符串并生成一个32字节的数组。

String to32Bytes(String s) { 
    return Arrays.copyOf(s.getBytes(), 32); 
} 

注意,这不是一种很好的加密方式,因为字符串哈希算法通常会提供更安全的密钥。

+0

当然这也会产生平台相关编码中字符串的前256个字节,这可能不是互操作性的最佳想法。当您从字符串派生密钥时,您应该可能涉及固定编码和Unicode规范化。 – millimoose 2013-02-14 22:48:27

+0

那么我使用的方法是字符串散列算法。再加上字符串不会是256个字符,因为它是256位,这是ASCII码中的256/8个字符。谢谢你的建议,但当然,追求更好的方法比立即解决效率低的问题更有意义。 – christopher 2013-02-14 22:49:33

+0

由OP给出的异常消息是*不是*错误密钥大小的结果。这看起来像这样:'java.security.InvalidKeyException:无效的AES密钥长度:xx字节'。 – 2013-02-15 07:57:11