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

来源:http://www.cnblogs.com/digdeep/archive/2016/06/13/5580244.html
-Advertisement-
Play Games

下麵的 Des 加密解密代碼,在加密時正常,但是在解密是拋出錯誤: 解決方法: 將 setKey方法修改為如下: 不使用SecureRandom生成SecretKey,而是使用SecretKeyFactory;重新實現方法generateKey,代碼如下 問題解決。 另外如果 加密時 和解密 時使用 ...


下麵的 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.engineDoFinal(DashoA13*..)
        at javax.crypto.Cipher.doFinal(DashoA13*..)

 

public class Des {
    static Des instance;
    static Key key;
    static Cipher encryptCipher;
    static Cipher decryptCipher;

    protected Des() {
    }

    protected Des(String strKey) {
        key = setKey(strKey);
        try {
            encryptCipher = Cipher.getInstance("DES");
            encryptCipher.init(Cipher.ENCRYPT_MODE, key);
            decryptCipher = Cipher.getInstance("DES");
            decryptCipher.init(Cipher.DECRYPT_MODE, key);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }

    }

    public static Des getInstance() {
        if (instance == null) {
            instance = new Des("diaxxxxoft@201Y10");
        }

        return instance;
    }

    //  根據參數生成KEY
    private Key setKey(String strKey) {
        try {
            KeyGenerator _generator = KeyGenerator.getInstance("DES");
            _generator.init(new SecureRandom(strKey.getBytes()));
            return _generator.generateKey();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    //  加密String明文輸入,String密文輸出
    public String setEncString(String strMing) {
        BASE64Encoder base64en = new BASE64Encoder();
        try {
            byte[] byteMing = strMing.getBytes("UTF-8");
            byte[] byteMi = this.getEncCode(byteMing);
            return base64en.encode(byteMi);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //加密以byte[]明文輸入,byte[]密文輸出
    private byte[] getEncCode(byte[] byteS) {
        byte[] byteFina = null;
        try {
            byteFina = encryptCipher.doFinal(byteS);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return byteFina;
    }

    //	 解密:以String密文輸入,String明文輸出
    public String setDesString(String strMi) {
        BASE64Decoder base64De = new BASE64Decoder();
        try {
            byte[] byteMi = base64De.decodeBuffer(strMi);
            byte[] byteMing = this.getDesCode(byteMi);
            return new String(byteMing, "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 解密以byte[]密文輸入,以byte[]明文輸出
    private byte[] getDesCode(byte[] byteD) {
        byte[] byteFina = null;
        try {
            byteFina = decryptCipher.doFinal(byteD);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return byteFina;
    }

    //多線程測試一下
    public static void main(String[] args) throws InterruptedException {

        //沒有依賴註入的配置,所以在這裡手動生成一次
        Des dtDes = Des.getInstance();

        final String[] mi = new String[10];
        for (int i = 0; i < 10; i++) {
            final Integer integer = i;
            Thread thread = new Thread() {
                public void run() {
                    //明文加密:
                    Des dtDes = Des.getInstance();
                    mi[integer] = dtDes.setEncString("ShowHistory.jsp?MenuId=345&MenuBelong=1&tableLimits=where a1450=RecordId"); //調用get函數獲取加密後密文。
                }
            };
            thread.start();
        }

        Thread.sleep(5000);

        for (int i = 0; i < 10; i++) {
            final Integer integer = i;

            Thread thread2 = new Thread() {
                public void run() {
                    System.out.println(String.format("mi[%s] = %s", integer, mi[integer]));
                    //這樣來模擬另外一個頁面的獲取
                    Des dtDes2 = Des.getInstance();
                    String M = dtDes2.setDesString(mi[integer]);//調用get函數獲取解密後明文。
                    System.out.println(String.format("des[%s] = %s", integer, M));
                }
            };
            thread2.start();
        }

        //等待列印完畢
        Thread.sleep(5000);
    }
}

解決方法:

將 setKey方法修改為如下:

    //  根據參數生成KEY
    private Key setKey(String strKey) {
        try {
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            DESKeySpec keySpec = new DESKeySpec(strKey.getBytes("utf-8"));  
            keyFactory.generateSecret(keySpec);  
            return keyFactory.generateSecret(keySpec); 
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

不使用SecureRandom生成SecretKey,而是使用SecretKeyFactory;重新實現方法generateKey,代碼如下

問題解決。

 

另外如果 加密時  和解密 時使用的秘鑰 不一樣,也會報 相同的錯誤。

比如加密時使用的秘鑰:

diaxxxxoft@201xxxx10

而解密時使用的秘鑰:

addddxxxx

那麼在解密時也可能會報這個錯誤。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 看了下Java Tutorials中的fork/join章節,整理下。 什麼是fork/join框架 fork/join框架是ExecutorService介面的一個實現,可以幫助開發人員充分利用多核處理器的優勢,編寫出並行執行的程式,提高應用程式的性能;設計的目的是為了處理那些可以被遞歸拆分的任務 ...
  • Xdebug能替代PHP的var_dump()函數來顯示變數值。xdebug的版本包含對不同數據類型作數組元素/對象屬性、最大深度和字元串長度以不同顏色標識。這裡也有一些功能能很好地處理變數顯示。 相關設置: xdebug.cli_color 類型: integer, 預設值: 0, 始於 2.2版 ...
  • 實戰代碼 安裝完成後,我們來看下代碼: 系統環境:Linux Python環境:Python2.7 請註意python版本 bt2url.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #! /usr/local/bin/python #  ...
  • Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the dept ...
  • OC中經常用到的一種初始化控制器的方法.比如A push B.並且將A的一個值:value 傳遞給B 使用.簡單的辦法就是 在B重構init方法.比如在.h 中定義: ()initValue:(NSString )value; 然後在.m中實現 ()initValue:(NSString )valu ...
  • 在使用 url 的 queryString 傳遞參數時,因為參數的值,被DES加密了,而加密得到的是 Base64的編碼字元串,類似於: za4T8MHB/6mhmYgXB7IntyyOUL7Cl++0jv5rFxAIFVji8GDrcf+k8g== 顯然 這裡面含有了 特殊字元: / + = 等等 ...
  • 前兩章:概述&設計環境 第3章 基本程式設計結構 基本概念在Java中的實現方式。包括以下內容: 概覽。 註釋。 數據類型。 變數。 運算符。 字元串。 輸入輸出。 控制流程。 大數值。 數組。 3.1 概覽 大小寫敏感。 訪問修飾符:程式其他部分對這段代碼的訪問級別。 類是構建所有java應用程式 ...
  • 1、和mysql擴展庫的區別: (1 安全性、穩定性更高 (2 提供了面向對象和麵向過程兩種風格 2、php.ini 中的 extension=php_mysqli.dll 解除封印 3、面向對象:查詢列表 1 <?php 2 3 //mysqli 操作數據(面向對象風格) 4 5 #1、創建Mys ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...