【问题标题】:I try to save a Key and I recieve that exception "Invalid Key AES"我尝试保存密钥,但收到异常“无效密钥 AES”
【发布时间】:2015-03-16 16:50:15
【问题描述】:

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

“无效密钥:无效的 AES 密钥长度:59 字节”。

我的代码是下一个:

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

然后我写了加密的文本。然后我尝试加载密钥并使用该密钥对保存的文本进行解密,但出现错误“无效密钥:无效的 AES 密钥长度:59 字节”。代码如下:

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

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

谁能帮帮我?谢谢!

【问题讨论】:

    标签: java encryption key aes


    【解决方案1】:

    加密密钥不是文本。它是一串可以取任何值的字节,它们极不可能形成有效的 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);
    

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

    【讨论】:

    • 你能给我举个例子吗?如果无法将字节转换为字符串放在txt上,我不知道如何保存。
    • @Imrik 我看到你有一个解决方案,但我提供了一个适合你原始代码的示例,并演示了Base64 的用法,你应该熟悉它。
    【解决方案2】:

    我可以解决它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 2012-06-05
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多