【问题标题】:Java encrypt / decrypt via String not working because of padding由于填充,Java通过String加密/解密不起作用
【发布时间】:2017-11-29 23:14:41
【问题描述】:

我必须使用 AES/ECB/PKCS5Padding 对字符串进行编码。然后将加密结果( new String(encryptedResult) 因为他们不想要字节)发送给合作伙伴。然后我的搭档使用 getBytes() 解密字符串。

解密方法如下:

    public static String decrypter(final String donnees) throws NoSuchAlgorithmException, NoSuchPaddingException,
        InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key);

    return new String(cipher.doFinal(donnees.getBytes()));
}

我的问题是我在尝试解密时收到此错误: 使用填充密码解密时,输入长度必须是 16 的倍数。

当我直接解码字节时,它工作得很好。如何使 string.getBytes() 不松散填充?或任何其他解决方案?

我无法更改加密算法,对于发送给合作伙伴的字符串而不是字节也可以这样说。

【问题讨论】:

  • 您不能像那样将字节转换为字符串。至少您需要使用 8 位编码,或者最好使用 Base64 之类的编码。
  • 多谢两位,问题解决了。我对字节的工作原理有一个非常错误的理解。
  • 不要在新作品中使用 ECB 模式并尽快更新旧作品,它不安全,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密即可,它不需要保密。

标签: java encryption cryptography


【解决方案1】:

填充错误通常意味着解密失败,失败可能包括不正确的密钥、数据和编码。不正确的解密也会产生不正确的填充。

在这种情况下,它是加密数据的错误编码。如果您需要加密数据作为字符串,一般的方法是使用 Base64 或十六进制编码。

此代码不正确:new String(cipher.doFinal(donnees.getBytes()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2013-09-25
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多