0

我正在使用以下算法在 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*..)

如果我删除 String 中的所有 UTF-8 并且getBytes()in 在我的本地 Windows 7 机器上可以正常工作,但在我的 linux 机器(部署了 tomcat 的地方)上无法正常工作,并且出现与上述相同的错误。任何帮助或建议表示赞赏。

它可能不相关,但我正在从 DB2 数据库中保存和检索值。


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


经过一些调试后,它看起来像new String()并且getBytes()正在使用默认的平台特定语言环境。同样UTF-8在 new String() 中,将编码字节(根据 DES 为 8 字节的倍数)更改为非 8 的倍数,因此解密失败。使用 base64 不是一种选择。

4

0 回答 0