標籤:加密 解密 技術 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