【问题标题】:Java AES decryption - can't decrypt string [duplicate]Java AES解密-无法解密字符串[重复]
【发布时间】:2015-10-03 00:14:43
【问题描述】:

可能重复:
Java AES Encrypt Entire String

我遇到了一个小问题。出于某种原因,我无法使用与加密它们相同的方法来解密某些字符串。例如,我正在使用此代码进行解密:

        SecretKeySpec key = new SecretKeySpec(salt.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
    cipher.init(Cipher.DECRYPT_MODE, key);
    String result = new String(cipher.doFinal(message));

    System.out.println("Decrypted:" + result);

无论如何,当盐是“1231231231231231”并且我试图解密的消息是“读取”时。我收到此错误:

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded

但是加密器(工作方式相同)说加密的值是

I¡?Þd↨Ú#à, 7êLO* 

如何解决此问题或避免用户输入此类字符串?谢谢

【问题讨论】:

  • “请忽略乱七八糟”没问题,我就忽略你的帖子。
  • 这必须作为“本周的哑剧”而下降。我推荐阅读How To s The Smart Way,特别是On Not Reacting Like A Loser。祝你好运!
  • "...要加密的消息是'read'":你不是要解密吗?您需要将具有相同填充的加密操作的输出传递给上述函数。
  • 抱歉,我就是这么想的。加密“读取”后,输出为“I¡?Þd↨Ú#à, 7êLO*”,但是当我尝试使用相同的密钥对其进行解密时,我收到了我发布的错误。我编辑了最初的帖子。
  • 您是否还使用 PKCS#5 填充进行加密?在任何情况下,您都可以在没有填充的情况下解密,并查看解密的数据以了解 JCE 认为填充不是 PKCS#5 的原因。

标签: java string encryption aes


【解决方案1】:

解决方案:不要将其存储在字符串中。

您对Cipher.doFinal 的调用应存储在byte 数组(byte[]) 中,您对解密的输入同样应为byte 数组。如果您使用String 输入,请使用.getBytes();当您为输出创建String 时,请使用new String(myArray)

【讨论】:

  • 是的,我知道,这就是我的程序的工作方式:字符串被加密(输出为字节)。输出被转换为字符串并存储在单独的文本文件中。然后从文本文件中读取并转换回字节。解密器解密字节。但显然byte[] result = cipher.doFinal(message.getBytes()); String stringResult = new String(result); stringResult.getBytes() 并没有完全扭转这个过程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多