Java通过字符串加密/解密由于填充而不起作用

Java通过字符串加密/解密由于填充而不起作用,java,encryption,cryptography,Java,Encryption,Cryptography,我必须使用AES/ECB/PKCS5P对字符串进行编码。然后将加密结果(新字符串(encryptedResult),因为它们不需要字节)发送给合作伙伴。然后,我的合作伙伴使用getBytes()解密字符串 以下是解密方法: public static String decrypter(final String donnees) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyExcept

我必须使用AES/ECB/PKCS5P对字符串进行编码。然后将加密结果(新字符串(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()不松散填充?还是其他解决方案


我无法更改加密算法,同样可以对发送给合作伙伴的字符串而不是字节进行更改

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

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


此代码不正确:
新字符串(cipher.doFinal(donnees.getBytes())

你不能把字节变成那样的字符串。至少您需要使用8位编码,或者最好使用Base64之类的编码。多亏了你们,问题解决了。我对字节是如何工作的有一个非常错误的理解。不要在新工作中使用ECB模式,并尽快更新旧工作,这是不安全的,请看,向下滚动到Penguin。取而代之的是使用随机IV的CBC模式,只需在加密数据前加上IV的前缀即可用于解密,它不需要保密。