我尝试保存密钥,但收到异常 "Invalid Key AES"

I try to save a Key and I recieve that exception "Invalid Key AES"

我尝试将一个密钥保存在一个文件中,它保存了一些东西,但是当我尝试加载它以解密文本时,我遇到了这个异常:

"Invalid Key:Invalid AES key length: 59 bytes".

我的代码是下一个:

SecretKey key;
key = KeyGenerator.getInstance("AES").generateKey();
byte[] encoded = key.getEncoded(); 
String newKey = new String(encoded, "UTF-8");
out.write(newKey);

然后我写了密文。然后我尝试加载密钥并使用该密钥解密保存的文本,但出现错误 "Invalid Key:Invalid AES key length: 59 bytes"。代码是下一个:

byte[] encoded = String.valueOf(fileIn.nextLine()).getBytes();//Key data
key = new SecretKeySpec(encoded, "AES");
dcipher = Cipher.getInstance("AES");
dcipher.init(Cipher.DECRYPT_MODE, key);

我需要保存密钥,因为我认为这是几天后解密文本的唯一方法。我保存了一个加密的文本,然后我需要加载解密的文本,例如,几天后。

谁能帮帮我?谢谢!

加密密钥不是文本。它是一串可以取任何值的字节,它们极不可能形成有效的 UTF-8 编码。

不要从您的密钥创建 String。只需将字节保存到文件中。转换通过用默认替换字符 � 的编码替换在 UTF-8 下无效的字节序列来破坏密钥。

如果您必须以文本格式保存您的密钥,请使用 base-64 或其他一些非文本数据编码对其进行编码。


这是一个示例,遵循问题中代码的模式:

SecretKey key = KeyGenerator.getInstance("AES").generateKey();
String encoded = Base64.getEncoder().encodeToString(key.getEncoded()); 
out.write(encoded);

byte[] raw = Base64.getDecoder().decode(fileIn.nextLine());
key = new SecretKeySpec(raw, "AES");
Cipher dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, key);

请注意,在解密时,指定了一个完整的转换(包括模式和填充)。您可以选择不同的模式,但您应该明确选择什么,包括加密和解密。否则,如果您切换提供商,可能会选择不同的默认值,并且您将无法解密您的数据。

我可以这样解决:

byte[] data = Files.readAllBytes(Paths.get(fileName.replaceAll("myPath")));
key = new SecretKeySpec(data, "AES");