對稱加密算法-DES以及DESede算法

1、簡述java

  對稱加密算法就是能將數據加解密。加密的時候用密鑰對數據進行加密,解密的時候使用一樣的密鑰對數據進行解密。算法

  DES是美國國家標準研究所提出的算法。由於加解密的數據安全性和密鑰長度成正比。des的56位的密鑰已經造成安全隱患,在1998年以後就不多被採用。可是一些老舊的系統還在使用。由於這個des算法並無被美國標準委員會公佈所有算法,你們一致懷疑被留了後門。因此慢慢就被淘汰掉了。apache

  後來針對des算法進行了改進,有了三重des算法(DESede)。針對des算法的密鑰長度較短以及迭代次數偏少問題作了相應改進,提升了安全強度。不過desede算法處理速度較慢,密鑰計算時間較長,加密效率不高問題使得對稱加密算法的發展不容樂觀。api

2、交互模型安全

一、消息傳遞雙方約定密鑰,一般由消息發送方(甲方)構建密鑰通知消息接收方(乙方)網絡

二、甲方使用密鑰對數據記性加密,而後將加密後的數據經過網絡傳送給乙方測試

三、乙方接收到數據,而後使用約定的密鑰對數據進行解密編碼

 

整個模型很像hmac的數據交互過程,都是一個密鑰的概念,並且密鑰都是雙方知道的。可是hmac算法是信息摘要的獲取。這邊是對數據進行加解密加密

 

3、java6和bouncycastle針對des算法的數據加密支持仍是不一樣的。體如今密鑰長度,工做模式以及填充方式上。這裏bouncycastle的密鑰長度是64位。不過在DESede算法上bouncy castle也是密鑰長度比java6的密鑰長度要長。spa

    不過全部的對稱加密算法的實現仍是相似的。能夠參看以下的代碼:

一、des算法

package com.ca.test;  
import java.security.Key;  
import javax.crypto.Cipher;  
import javax.crypto.KeyGenerator;  
import javax.crypto.SecretKey;  
import javax.crypto.SecretKeyFactory;  
import javax.crypto.spec.DESKeySpec;  
import org.apache.commons.codec.binary.Base64;  
/** 
 * DES對稱加密算法 
 * @author kongqz 
 * */  
public class DESCoder {  
    /** 
     * 密鑰算法 
     * java支持56位密鑰,bouncycastle支持64位 
     * */  
    public static final String KEY_ALGORITHM="DES";  
      
    /** 
     * 加密/解密算法/工做模式/填充方式 
     * */  
    public static final String CIPHER_ALGORITHM="DES/ECB/PKCS5Padding";  
      
    /** 
     *  
     * 生成密鑰,java6只支持56位密鑰,bouncycastle支持64位密鑰 
     * @return byte[] 二進制密鑰 
     * */  
    public static byte[] initkey() throws Exception{  
          
        //實例化密鑰生成器  
        KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);  
        //初始化密鑰生成器  
        kg.init(56);  
        //生成密鑰  
        SecretKey secretKey=kg.generateKey();  
        //獲取二進制密鑰編碼形式  
        return secretKey.getEncoded();  
    }  
    /** 
     * 轉換密鑰 
     * @param key 二進制密鑰 
     * @return Key 密鑰 
     * */  
    public static Key toKey(byte[] key) throws Exception{  
        //實例化Des密鑰  
        DESKeySpec dks=new DESKeySpec(key);  
        //實例化密鑰工廠  
        SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);  
        //生成密鑰  
        SecretKey secretKey=keyFactory.generateSecret(dks);  
        return secretKey;  
    }  
      
    /** 
     * 加密數據 
     * @param data 待加密數據 
     * @param key 密鑰 
     * @return byte[] 加密後的數據 
     * */  
    public static byte[] encrypt(byte[] data,byte[] key) throws Exception{  
        //還原密鑰  
        Key k=toKey(key);  
        //實例化  
        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);  
        //初始化,設置爲加密模式  
        cipher.init(Cipher.ENCRYPT_MODE, k);  
        //執行操做  
        return cipher.doFinal(data);  
    }  
    /** 
     * 解密數據 
     * @param data 待解密數據 
     * @param key 密鑰 
     * @return byte[] 解密後的數據 
     * */  
    public static byte[] decrypt(byte[] data,byte[] key) throws Exception{  
        //歡迎密鑰  
        Key k =toKey(key);  
        //實例化  
        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);  
        //初始化,設置爲解密模式  
        cipher.init(Cipher.DECRYPT_MODE, k);  
        //執行操做  
        return cipher.doFinal(data);  
    }  
    /** 
     * @param args 
     * @throws Exception  
     */  
    public static void main(String[] args) throws Exception {  
        String str="DES";  
        System.out.println("原文:"+str);  
        //初始化密鑰  
        byte[] key=DESCoder.initkey();  
        System.out.println("密鑰:"+Base64.encodeBase64String(key));  
        //加密數據  
        byte[] data=DESCoder.encrypt(str.getBytes(), key);  
        System.out.println("加密後:"+Base64.encodeBase64String(data));  
        //解密數據  
        data=DESCoder.decrypt(data, key);  
        System.out.println("解密後:"+new String(data));  
    }  
}  
控制檯輸出結果:  
原文:DES  
密鑰:ocewbYVbtmE=  
加密後:w6KsVSkLV3Q=  
解密後:DES  

 

二、desede算法演示

  1 package com.ca.test;  
  2 import java.security.Key;  
  3 import javax.crypto.Cipher;  
  4 import javax.crypto.KeyGenerator;  
  5 import javax.crypto.SecretKey;  
  6 import javax.crypto.SecretKeyFactory;  
  7 import javax.crypto.spec.DESedeKeySpec;  
  8 import org.apache.commons.codec.binary.Base64;  
  9 /** 
 10  * DESede對稱加密算法演示 
 11  * @author kongqz 
 12  * */  
 13 public class DESedeCoder {  
 14     /** 
 15      * 密鑰算法 
 16      * */  
 17     public static final String KEY_ALGORITHM="DESede";  
 18       
 19     /** 
 20      * 加密/解密算法/工做模式/填充方式 
 21      * */  
 22     public static final String CIPHER_ALGORITHM="DESede/ECB/PKCS5Padding";  
 23       
 24     /** 
 25      *  
 26      * 生成密鑰 
 27      * @return byte[] 二進制密鑰 
 28      * */  
 29     public static byte[] initkey() throws Exception{  
 30           
 31         //實例化密鑰生成器  
 32         KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);  
 33         //初始化密鑰生成器  
 34         kg.init(168);  
 35         //生成密鑰  
 36         SecretKey secretKey=kg.generateKey();  
 37         //獲取二進制密鑰編碼形式  
 38         return secretKey.getEncoded();  
 39     }  
 40     /** 
 41      * 轉換密鑰 
 42      * @param key 二進制密鑰 
 43      * @return Key 密鑰 
 44      * */  
 45     public static Key toKey(byte[] key) throws Exception{  
 46         //實例化Des密鑰  
 47         DESedeKeySpec dks=new DESedeKeySpec(key);  
 48         //實例化密鑰工廠  
 49         SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);  
 50         //生成密鑰  
 51         SecretKey secretKey=keyFactory.generateSecret(dks);  
 52         return secretKey;  
 53     }  
 54       
 55     /** 
 56      * 加密數據 
 57      * @param data 待加密數據 
 58      * @param key 密鑰 
 59      * @return byte[] 加密後的數據 
 60      * */  
 61     public static byte[] encrypt(byte[] data,byte[] key) throws Exception{  
 62         //還原密鑰  
 63         Key k=toKey(key);  
 64         //實例化  
 65         Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);  
 66         //初始化,設置爲加密模式  
 67         cipher.init(Cipher.ENCRYPT_MODE, k);  
 68         //執行操做  
 69         return cipher.doFinal(data);  
 70     }  
 71     /** 
 72      * 解密數據 
 73      * @param data 待解密數據 
 74      * @param key 密鑰 
 75      * @return byte[] 解密後的數據 
 76      * */  
 77     public static byte[] decrypt(byte[] data,byte[] key) throws Exception{  
 78         //歡迎密鑰  
 79         Key k =toKey(key);  
 80         //實例化  
 81         Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);  
 82         //初始化,設置爲解密模式  
 83         cipher.init(Cipher.DECRYPT_MODE, k);  
 84         //執行操做  
 85         return cipher.doFinal(data);  
 86     }  
 87     /** 
 88      * 進行加解密的測試 
 89      * @throws Exception  
 90      */  
 91     public static void main(String[] args) throws Exception {  
 92         String str="DESede";  
 93         System.out.println("原文:/t"+str);  
 94         //初始化密鑰  
 95         byte[] key=DESedeCoder.initkey();  
 96         System.out.println("密鑰:/t"+Base64.encodeBase64String(key));  
 97         //加密數據  
 98         byte[] data=DESedeCoder.encrypt(str.getBytes(), key);  
 99         System.out.println("加密後:/t"+Base64.encodeBase64String(data));  
100         //解密數據  
101         data=DESedeCoder.decrypt(data, key);  
102         System.out.println("解密後:/t"+new String(data));  
103     }  
104 }  
105 控制檯輸出結果:  
106 原文: DESede  
107 密鑰: BBDmwTjBsF7IwTIyGWt1bmFntRyUgMQL  
108 加密後:    FM/DsEv3KgM=  
109 解密後:    DESede  

 

4、總結

一、主要看設定密鑰的長度的變化。同時,bouncycastle支持更多的填充模式,在相同算法上比java6實現的版本的密鑰長度要長

二、java的api中僅僅提供了DES,DESede和PBE 3三種對稱加密算法密鑰材料實現類

相關文章
相關標籤/搜索