Java 之 Given final block not properly padded

  获取Cipher对象的时候一定要写成

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

  不要写成

  Cipher cipher = Cipher.getInstance("DES");

  否则解密的时候会报错:

  Given final block not properly padded

  原因是Cipher cipher = Cipher.getInstance("DES");与Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");等同,填充方式错误,加密的时候会得到16长度的字节数组。

  解密的时候报错: javax.crypto.BadPaddingException:   Given   final   block   not   properly   padded

  仔细分析一下,不难发现,该异常是在解密的时候抛出的,加密的方法没有问题。

  但是两个方法的唯一差别是Cipher对象的模式不一样,这就排除了程序写错的可能性。再看一下异常的揭示信息,大概的意思是:提供的字块不符合填补的。

  原来在用DES加密的时候,最后一位长度不足64的,它会自动填补到64,那么在我们进行字节数组到字串的转化过程中,可以把它填补的不可见字符改变了,所以引发系统抛出异常。

  问题找到,怎么解决呢?大家还记得邮件传输通常会把一些信息编码保存,对了,就是Base64,那样保证了信息的完整性。为了方便使用,我们再写一个新的方法封装一下原来的方法:

    public static String DataEncrypt(String str, byte[] key)
    {  
        String encrypt = null;  
        try
        {  
            byte[] ret = encode(str.getBytes("UTF-8"),key);  
            encrypt = new String(Base64.encode(ret));  
        }
        catch(Exception e){  
            System.out.print(e);  
            encrypt = str;  
        }  
        return encrypt;  
    }
    public static String DataDecrypt(String str, byte[] key)
    {  
        String decrypt = null;  
        try
        {  
            byte[] ret = decode(Base64.decode(str),key);  
            decrypt = new String(ret,"UTF-8");  
        }
        catch(Exception e)
        {  
            System.out.print(e);  
            decrypt = str;  
        }  
        return decrypt;  
    }  

  我们把方法的参数改成了字串,但是为什么要用UTF-8呢?不指定它的字节格式不行吗?大家知道,UTF-8是国际通用的字符编码,用它传输任何字串都不会有问题,通过它也可以很完美的解决J2EE的中文问题!所以我们最好用UTF-8编码,以减少不必要的麻烦。

时间: 2024-08-29 17:14:27

Java 之 Given final block not properly padded的相关文章

javax.crypto.BadPaddingException: Given final block not properly padded解决方案

JAVA的AES加密解密在windows上测试一切正常,上传到空间上在解密时就出现错误.空间是Linux系统 查看日志发现出现此异常 javax.crypto.BadPaddingException: Given final block not properly padded 后面百度了一下终于解决了,在生成key的时候出现错误的 原来的代码: private Key initKeyForAES(String key) throws NoSuchAlgorithmException { if (

javax.crypto.BadPaddingException: Given final block not properly padded

异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填充算法(也就是说,是否都是使用PKCS5Padding)2)确认下你要解密的字节数组是否正确. javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded

javax.crypto.BadPaddingException: Given final block not properly padded 解决方法

下面的 Des 加密解密代码,在加密时正常,但是在解密是抛出错误: javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at com.sun.crypto.provider.DESCipher.engin

记一次文件编码出现的BUG javax.crypto.BadPaddingException: Given final block not properly padded

1.前景:工作中需要实现一个功能,导出的数据需要加密,不能被明文看到,使用DES加密,对byte数组加密解密操作代码如下 public class DESTool { static String transformation = "DESede/ECB/PKCS5Padding"; static String algorithm = "DESede"; public byte[] decode(byte[] srcByte, byte[] keyByte, int

AES解密异常Given final block not properly padded-在线助手博客

AES 128/192/256位CBC/CFB/ECB/OFB/PCBC 在线加密解密 解密内容:1243CFEBD819AA6B1C717DE870459F7B 秘钥:http://www.it399.com 没有使用填充向量iv AES解密异常Given final block not properly padded javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypt

浅析Java中的final关键字

原文出处: 海子 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字

【Java基础】final关键字总结

Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例.final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的. final关键字的含义? final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如

转载:浅析Java中的final关键字

文章转自:http://www.cnblogs.com/dolphin0520/p/3736238.html 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cn

浅析Java中的final关键字(转载)

自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰.final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方