javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是8的倍数

时间:2015-12-23 10:18:32

标签: java db2 des ecb pkcs#5

我使用以下算法在Java中加密/解密 -

cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

加密/解密方法如下 -

    public String encryptString(String originalString) {
        String encryptedString = null;
        try {
            cipher.init(Cipher.ENCRYPT_MODE, secKey);
            byte[] encryptedBytes = cipher.doFinal(originalString.getBytes("UTF8"));
            encryptedString = new String(encryptedBytes,"UTF8");
        } catch (Exception ex) {
            LOGGER.error("Could not encrypt String {}", originalString, ex);
            ex.printStackTrace();
        }
        return encryptedString;
    }

    public String decryptString(String encryptedString) {
        String decryptedString = null;
        try {
            cipher.init(Cipher.DECRYPT_MODE, secKey);
            byte[] encryptedBytes = cipher.doFinal(encryptedString.getBytes("UTF8"));
            decryptedString = new String(encryptedBytes,"UTF8");
        } catch (Exception ex) {
            LOGGER.error("Could not decrypt String {}", encryptedString, ex);
            ex.printStackTrace();
        }
        return decryptedString;
    }

但它给了我以下错误

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)

如果我删除字符串中的所有UTF-8并且getBytes()在我的本地Windows 7计算机上正常工作但在我的linux框(部署tomcat)上不起作用,并且具有与上面相同的错误。任何帮助或建议表示赞赏。

它可能没有关系,但我正在保存并从DB2数据库中检索值。

由于现有的数据设置,我无法在base64编码后用于在DB2中存储String。我需要使用上面的alogo来解密现有数据。它适用于Windows机器,但不适用于Linux(全部没有utf格式)。

经过一些调试后,看起来new String()getBytes()正在使用默认的平台特定区域设置。新的String()中的UTF-8也会将编码的字节(根据DES的8个字节的倍数)更改为8的非倍数,因为解密失败。 使用base64不是一种选择。

0 个答案:

没有答案