分享

加密抛异常:javax.crypto.BadPaddingException: Given final block not properly padded

 CevenCheng 2011-06-02
加密抛异常:Given final block not properly padded

在做加密解密过程中,报错了: 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编码,以减少不必要的麻烦。

注意,上面方法中当加密或者解密过程中,程序抛出异常,将返回原值,使得在调用方法失败时更方便的找出错误。

大家也可以利用其它的密钥,进行不同地方的加密解密

总结:DES是一个相对比较老的加密算法,对于现在也不是最安全的,所以大家也可以利用别的加密算法进行加密解密,以得到更安全的系统。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多