Java 密钥大小或默认参数非法

Java 密钥大小或默认参数非法,java,encryption,Java,Encryption,基本上,我正在尝试将用户指定的字符串散列到256位字节数组中,以便在使用Java的AES256实现加密数据时用作密钥。我不断收到此运行时异常: java.security.InvalidKeyException: Illegal key size or default parameters 我怀疑这是因为一些字节的长度不是8位,所以整个密钥大小不是256位。我想知道如何在左边用0填充它们,以确保键的长度 编辑: 这是从值到消息摘要的转换: MessageDigest hasher = Mess

基本上,我正在尝试将用户指定的字符串散列到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.
这是加密,使用“hasher”的输出


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

下面的函数将获取一个字符串并从中生成一个32字节的数组

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

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

您可以确保Java.Okey-doke中的所有字节都是8位长。那么,你能想出另一个原因,为什么我可能会得到一个无效的SHA256哈希结果密钥异常?你能提供你的代码吗?这可能有助于我们识别问题。您的密钥很可能不是256位(32字节)。这只是JRE中没有安装无限加密文件的效果。当然,这也会在依赖于平台的编码中生成字符串的前256字节,这可能不是互操作性的最佳方案。当你从字符串中导出密钥时,你可能需要使用固定编码和Unicode规范化。我使用的方法是字符串哈希算法。加上字符串不会是256个字符,因为它是256位,在ASCII中是256/8个字符。谢谢你的建议,但是比起立即满足于效率较低的东西,采用更好的方法肯定更有意义。OP给出的异常消息不是由于密钥大小错误造成的。这看起来像:
java.security.InvalidKeyException:Invalid AES密钥长度:xx字节
String to32Bytes(String s) {
   return Arrays.copyOf(s.getBytes(), 32);
}