javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a

文章目录

  • 一、发现问题
  • 二、分析问题
  • 三、解决问题
    • 3.1 方法一:不要用openjdk
    • 3.2 方法二:修改KeyGenerator.init
    • 四、全部源码

      一、发现问题

      javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
      	at java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:977)
      	at java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1058)
      	at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:855)
      	at java.base/com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
      	at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2207)
      

      二、分析问题

      这是一个des解密的代码,在执行cipher.doFinal()的时候报错:BadPaddingException

      public static String decrypt(String keyStr,String content){ try { Key key = loadKey(keyStr);
              Cipher cipher = Cipher.getInstance("DES");
              cipher.init(Cipher.DECRYPT_MODE,key);
              byte[] source =Base64.getDecoder().decode(content.getBytes(StandardCharsets.UTF_8));
              return new String(cipher.doFinal(source),StandardCharsets.UTF_8);
          }catch (Exception e){ e.printStackTrace();
              return null;
          }
      }
      

      三、解决问题

      • 这边有两个方法,两个方法都能解决问题,二选一即可。

        3.1 方法一:不要用openjdk

        3.2 方法二:修改KeyGenerator.init

        generator.init(new SecureRandom(keyStr.getBytes(StandardCharsets.UTF_8)));

        修改成

        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(keyStr.getBytes());
        generator.init(secureRandom);
        

        四、全部源码

         private static Key loadKey(String keyStr){ Key key = null;
                try { KeyGenerator generator = KeyGenerator.getInstance("DES");
        //            generator.init(new SecureRandom(keyStr.getBytes(StandardCharsets.UTF_8)));
                    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
                    secureRandom.setSeed(keyStr.getBytes());
                    generator.init(secureRandom);
                    key = generator.generateKey();
                }catch (Exception e){ e.printStackTrace();
                }
                return key;
            }
            public static String encrypt(String keyStr,String content){ try { Key key = loadKey(keyStr);
                    Cipher cipher = Cipher.getInstance("DES");
                    cipher.init(Cipher.ENCRYPT_MODE,key);
                    byte[] source = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
                    return new String(Base64.getEncoder().encode(source),StandardCharsets.UTF_8);
                }catch (Exception e){ e.printStackTrace();
                    return null;
                }
            }
            public static String decrypt(String keyStr,String content){ try { Key key = loadKey(keyStr);
                    Cipher cipher = Cipher.getInstance("DES");
                    cipher.init(Cipher.DECRYPT_MODE,key);
                    byte[] source =Base64.getDecoder().decode(content.getBytes(StandardCharsets.UTF_8));
                    return new String(cipher.doFinal(source),StandardCharsets.UTF_8);
                }catch (Exception e){ e.printStackTrace();
                    return null;
                }
            }
        

        觉得好,就一键三连呗(点赞+收藏+关注)