zoukankan      html  css  js  c++  java
  • javax.crypto.BadPaddingException: Given final block not properly padded解决方案

    解密的时候报错: 

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

    该异常是在解密的时候抛出的,加密的方法没有问题。  

    但是两个方法的唯一差别是Cipher对象的模式不一样,这就排除了程序写错的可能性。再看一下异常的揭示信息,大概的意思是:提供的字块不符合填补的。原来在用DES加密的时候,最后一位长度不足64的,它会自动填补到64,那么在我们进行字节数组到字串的转化过程中,可以把它填补的不可见字符改变了,所以引发系统抛出异常。大家还记得邮件传输通常会把一些信息编码保存,就是Base64,那样保证了信息的完整性,所以我们就是利用一下下了。

    原来的代码:

    private Key initKeyForAES(String key) throws NoSuchAlgorithmException {
            if (null == key || key.length() == 0) {
                throw new NullPointerException("key not is null");
            }
            SecretKeySpec key2 = null;try {
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                kgen.init(128, new SecureRandom(key.getBytes()));
                SecretKey secretKey = kgen.generateKey();
                byte[] enCodeFormat = secretKey.getEncoded();
                key2 = new SecretKeySpec(enCodeFormat, "AES");
            } catch (NoSuchAlgorithmException ex) {
                throw new NoSuchAlgorithmException();
            }
            return key2;
    
        }

    主要是红色部分的问题

    修改后代码:

     
    private Key initKeyForAES(String key) throws NoSuchAlgorithmException {
            if (null == key || key.length() == 0) {
                throw new NullPointerException("key not is null");
            }
            SecretKeySpec key2 = null;
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(key.getBytes());
            try {
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                kgen.init(128, random);
                SecretKey secretKey = kgen.generateKey();
                byte[] enCodeFormat = secretKey.getEncoded();
                key2 = new SecretKeySpec(enCodeFormat, "AES");
            } catch (NoSuchAlgorithmException ex) {
                throw new NoSuchAlgorithmException();
            }
            return key2;
    
        }

    其实就是SecureRandom创建的方式不同而引起的错误

  • 相关阅读:
    教你玩转CSS的所有字体,路过的来瞧一瞧。
    CSS基本语法?
    怎么样才能玩转前端所有的CSS背景相关问题?
    如何玩转CSS内部样式表与外部样式表?
    什么是CSS?你真的理解了吗?
    CSS页面demo
    HTML教程(看完这篇就够了)
    HTML5新增的主体结构元素
    Math
    练习点菜及用的公式
  • 原文地址:https://www.cnblogs.com/interdrp/p/9112717.html
Copyright © 2011-2022 走看看