Java 加解密技術系列之 3DES

來源:互聯網
上載者:User

標籤:加密   解密   技術   3des   




上一篇文章講的是對稱式加密演算法 — —DES,這篇文章打算在 DES 的基礎上,繼續多講一點,也就是 3 重 DES — — Triple DES。

背景
至於 3DES 為什麼會出現呢?其實,這個不難想到。由於 DES 是一種非常簡便的密碼編譯演算法,但是密鑰長度比較短,計算量比較小,相對來說,比較容易被破解。因此,在 DES 的基礎上,使用三重資料加密演算法,對資料進行加密,這樣來說,破解的機率就小了很多。

概念
3DES,也就是“Triple DES”,中文名“三重資料加密演算法”,它相當於是對每個資料區塊應用三次 DES 密碼編譯演算法。由於電腦運算能力的增強,原版 DES 密碼的密鑰長度變得容易被暴力破解;3DES 即是設計用來提供一種相對簡單的方法,即通過增加 DES 的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。

原理
使用 3 條 56 位的金鑰組資料進行三次加密。3DES(即 Triple DES)是 DES 向 AES 過渡的密碼編譯演算法(1999年,NIST 將 3-DES 指定為過渡的加密標準)。
其具體實現如下:設 Ek() 和 Dk() 代表 DES 演算法的加密和解密過程,K 代表 DES 演算法使用的密鑰,P 代表明文,C 代表密文,這樣:
3DES 加密過程為:C = Ek3 ( Dk2 ( Ek1 ( P ) ) )
3DES 解密過程為:P = Dk1 ( EK2 ( Dk3 ( C ) ) )

代碼實現
3DES 的代碼實現,與 DES 很類似,其實可以參考上一篇文章 — — DES 的代碼實現,把演算法定義改為 DESede 即可。不過,考慮到參考的方便性,這裡還是貼出 3DES 加解密的代碼實現,供大家參考。
<span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.des;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.io.ByteArrayOutputStream;import java.security.Security;/** * Created by xiang.li on 2015/3/19. * TripleDES(3DES) 加解密工具類 */public class TripleDES {    private static final String Algorithm = "DESede"; // 定義 密碼編譯演算法,可用 DES,DESede,Blowfish    private static final String hexString="0123456789ABCDEF";    /**     *     * @param keybyte  加密金鑰,長度為24位元組     * @param src     位元組數組(根據給定的位元組數組構造一個密鑰。 )     * @return     */    public static byte[] encryptMode(byte[] keybyte, byte[] src) {        try {            // 根據給定的位元組數組和演算法構造一個密鑰            SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);            // 加密            Cipher c1 = Cipher.getInstance(Algorithm);            c1.init(Cipher.ENCRYPT_MODE, deskey);            return c1.doFinal(src);        } catch (java.security.NoSuchAlgorithmException e1) {            e1.printStackTrace();        } catch (javax.crypto.NoSuchPaddingException e2) {            e2.printStackTrace();        } catch (java.lang.Exception e3) {            e3.printStackTrace();        }        return null;    }    /**     *     * @param keybyte 密鑰     * @param src       需要解密的資料     * @return     */    public static byte[] decryptMode(byte[] keybyte, byte[] src) {        try {            // 產生密鑰            SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);            // 解密            Cipher c1 = Cipher.getInstance(Algorithm);            c1.init(Cipher.DECRYPT_MODE, deskey);            return c1.doFinal(src);        } catch (java.security.NoSuchAlgorithmException e1) {            e1.printStackTrace();        } catch (javax.crypto.NoSuchPaddingException e2) {            e2.printStackTrace();        } catch (java.lang.Exception e3) {            e3.printStackTrace();        }        return null;    }    /**     * 字串轉為16進位     * @param str     * @return     */    public static String encode(String str)    {        //根據預設編碼擷取位元組數組        byte[] bytes=str.getBytes();        StringBuilder sb=new StringBuilder(bytes.length*2);        //將位元組數組中每個位元組拆解成2位16進位整數        for(int i=0;i<bytes.length;i++)        {            sb.append(hexString.charAt((bytes[i]&0xf0)>>4));            sb.append(hexString.charAt((bytes[i]&0x0f)>>0));        }        return sb.toString();    }    /**     *     * @param bytes     * @return     * 將16進位數字解碼成字串,適用於所有字元(包括中文)     */    public static String decode(String bytes)    {        ByteArrayOutputStream baos=new ByteArrayOutputStream(bytes.length()/2);        //將每2位16進位整數組裝成一個位元組        for(int i=0;i<bytes.length();i+=2)            baos.write((hexString.indexOf(bytes.charAt(i))<<4 |hexString.indexOf(bytes.charAt(i+1))));        return new String(baos.toByteArray());    }    // 轉換成十六進位字串    public static String byte2hex(byte[] b) {        String hs = "";        String stmp = "";        for (int n = 0; n < b.length; n++) {            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));            if (stmp.length() == 1)                hs = hs + "0" + stmp;            else                hs = hs + stmp;            if (n < b.length - 1)                hs = hs + "";        }        return hs.toUpperCase();    }    public static void main(String[] args) {        // 添加新安全演算法,如果用JCE就要把它添加進去        //這裡addProvider方法是增加一個新的密碼編譯演算法提供者(個人理解沒有找到好的答案,求補充)        Security.addProvider(new com.sun.crypto.provider.SunJCE());        //byte數組(用來產生密鑰的)        final byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58, (byte)0x88, 0x10,                0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD,                0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36,                (byte) 0xE2 };        String szSrc = "This is a 3DES test. 測試";        System.out.println("加密前的字串:" + szSrc);        byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());        System.out.println("加密後的字串:" + byte2hex(encoded));        byte[] srcBytes = decryptMode(keyBytes, encoded);        System.out.println("解密後的字串:" + new String(srcBytes));    }}</span>


結束語
由於 3DES 是在 DES 的基礎上發展來的,因此,3DES 的基本原理也與 DES 相差無二,只不過又在其基礎上得到了一些改進,瞭解了這些,再使用 3DES 時,就真的很容易了,雖然 sun 的實現你不瞭解,但大概的原理清楚了,再瞭解一下 sun 的源碼,自己實現還是很容易的。

Java 加解密技術系列之 3DES

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.