解密返回,javax.crypto.BadPaddingException:给定最终块没有正确填充

时间:2018-03-09 03:40:16

标签: java encryption apache-commons-codec

我试图解密加密的xml文件。我把它作为输入流如下。我有正确的加密密钥。但每次我的程序返回空字符串。每次我输入正确的密钥。但每次它返回Badpadding Exception。

   try{
                InputStream is = new ByteArrayInputStream(decryption.getFileData().getBytes());
                String xmlEncryptedStr = getStringFromInputStream(is);
               String xmlStr = CipherUtils.decrypt(xmlEncryptedStr, new  Long(key));
               .......

这是我的CipherUtils.java类

.........

     public static String decrypt(String strToDecrypt,Long key)
        {
            String keyString=String.format("%016d", key);
            //System.out.println("decrypt keyString :"+keyString);
            return decrypt(strToDecrypt, keyString.getBytes());
        }


        public static String decrypt(String strToDecrypt,byte[] key)
        {
            if(strToDecrypt==null)
                return strToDecrypt;
            try
            {
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                final SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
                cipher.init(Cipher.DECRYPT_MODE, secretKey);

                final String decryptedString = new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt)));
                System.out.println("CipherUtils.decryptedString :"+decryptedString);
                return decryptedString;
            }
            catch (Exception e)
            {
                log.error("Ops!", e);
            }
            return null;
        }

.......

有关详细信息,请参阅我的加密代码

   public static String encrypt(String strToEncrypt,Long key)
        {
            String keyString=String.format("%016d", key);
            //System.out.println("encrypt keyString :"+keyString);
            return encrypt(strToEncrypt,keyString.getBytes());
        }



        public static String encrypt(String strToEncrypt,byte[] key)
        {
            if(strToEncrypt==null)
                return strToEncrypt;
            try
            {
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                final SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
                cipher.init(Cipher.ENCRYPT_MODE, secretKey);
                final String encryptedString = Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes()));
              //  System.out.println("CipherUtils.encrypt :"+encryptedString);
                return encryptedString;
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            return null;

        }

1 个答案:

答案 0 :(得分:0)

对不起,我无法发表评论,所以我正在写答案部分。 当我使用不同的密钥时我遇到了这个问题,虽然我通过了相同的但是我使用了CBC方法。

请注意,您是否检查过加密是由 AES / ECB / PKCS5Padding 完成的,而不是其他格式,例如 AES / CBC / PKCS5Padding

同时检查加密的密钥格式是否也与keyValue的%016d格式相同。关键是16个字符长。

我创建了一个简单的AES和DESede加密实用程序,它工作正常。

private static final byte[] keyValue = new String(
        "CjxI&S@V&#DSA_S0dA-SDSA$").getBytes();

public static void main(String[] args) throws Exception {
    Client cli = new Client();
    System.out.println(cli.encrypt("your password for encryption"));

    Client cli1 = new Client();
    System.out.println(cli1.decrypt("fTsgVQtXvv49GynHazT4OGZ4Va1H57d+6AM+44Ex040="));
}
public String encrypt(String Data) throws Exception {
    Key key = new SecretKeySpec(keyValue, "AES");
    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal = c.doFinal(Data.getBytes());
    String encryptedValue = DatatypeConverter.printBase64Binary(encVal);
    // String encryptedValue = new BASE64Encoder().encode(encVal);
    return encryptedValue;
}

public String decrypt(String encryptedData) throws Exception {
    Key key = new SecretKeySpec(keyValue, "AES");
    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = DatatypeConverter
            .parseBase64Binary(encryptedData);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}
相关问题