DES、3DES加密算法(轉載整理)

文章1:
java

        這一篇文章要解決數據加密——數據補位的問題、DES算法的兩種模式ECB和CBC問題以及更加安全的算法——3DES算法。web

        1、數據補位 DES數據加解密就是將數據按照8個字節一段進行DES加密或解密獲得一段8個字節的密文或者明文,最後一段不足8個字節,按照需求補足8個字節(一般補00或者FF,根據實際要求不一樣)進行計算,以後按照順序將計算所得的數據連在一塊兒便可。 這裏有個問題就是爲何要進行數據補位?主要緣由是DES算法加解密時要求數據必須爲8個字節。 算法

        2、ECB模式 DES ECB(電子密本方式)其實很是簡單,就是將數據按照8個字節一段進行DES加密或解密獲得一段8個字節的密文或者明文,最後一段不足8個字節,按照需求補足8個字節進行計算,以後按照順序將計算所得的數據連在一塊兒便可,各段數據之間互不影響。安全

        3、CBC模式 DES CBC(密文分組連接方式)有點麻煩,它的實現機制使加密的各段數據之間有了聯繫。其實現的機理以下: 加密步驟以下: 1)首先將數據按照8個字節一組進行分組獲得D1D2......Dn(若數據不是8的整數倍,用指定的PADDING數據補位) 2)第一組數據D1與初始化向量I異或後的結果進行DES加密獲得第一組密文C1(初始化向量I爲全零) 3)第二組數據D2與第一組的加密結果C1異或之後的結果進行DES加密,獲得第二組密文C2 4)以後的數據以此類推,獲得Cn 5)按順序連爲C1C2C3......Cn即爲加密結果。 解密是加密的逆過程,步驟以下: 1)首先將數據按照8個字節一組進行分組獲得C1C2C3......Cn 2)將第一組數據進行解密後與初始化向量I進行異或獲得第一組明文D1(注意:必定是先解密再異或) 3)將第二組數據C2進行解密後與第一組密文數據進行異或獲得第二組數據D2 4)以後依此類推,獲得Dn 5)按順序連爲D1D2D3......Dn即爲解密結果。 這裏注意一點,解密的結果並不必定是咱們原來的加密數據,可能還含有你補得位,必定要把補位去掉纔是你的原來的數據。 網絡

        4、3DES 算法 3DES算法顧名思義就是3次DES算法,其算法原理以下: 設Ek()和Dk()表明DES算法的加密和解密過程,K表明DES算法使用的密鑰,P表明明文,C表明密表,這樣, 3DES加密過程爲:C=Ek3(Dk2(Ek1(P))) 3DES解密過程爲:P=Dk1((EK2(Dk3(C))) 這裏能夠K1=K3,但不能K1=K2=K3(若是相等的話就成了DES算法了) 3DES with 2 diffrent keys(K1=K3),能夠是3DES-CBC,也能夠是3DES-ECB,3DES-CBC整個算法的流程和DES-CBC同樣,可是在原來的加密或者解密處增長了異或運算的步驟,使用的密鑰是16字節長度的密鑰,將密鑰分紅左8字節和右8字節的兩部分,即k1=左8字節,k2=右8字節,而後進行加密運算和解密運算。 3DES with 3 different keys,和3DES-CBC的流程徹底同樣,只是使用的密鑰是24字節的,但在每一個加密解密加密時候用的密鑰不同,將密鑰分爲3段8字節的密鑰分別爲密鑰一、密鑰二、密鑰3,在3DES加密時對加密解密加密依次使用密鑰一、密鑰二、密鑰3,在3DES解密時對解密加密解密依次使用密鑰三、密鑰二、密鑰1。ide


文章2:測試

DES加密

  1977年1月,美國政府頒佈:採納IBM公司設計的方案做爲非機密數據的正式數據加密標準(DES Data Encryption Standard) spa

  目前在國內,隨着三金工程尤爲是金卡工程的啓動,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費站等領域被普遍應用,以此來實現關鍵數據的保密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數據包的MAC校驗等,均用到DES算法。.net

 

  DES算法的入口參數有三個:Key、Data、Mode。

  其中Key爲8個字節共64位,是DES算法的工做密鑰

  Data也爲8個字節64位,是要被加密或被解密的數據

  Mode爲DES的工做方式,有兩種:加密解密

 

  DES算法是這樣工做的:

  如Mode爲加密,則用Key 去把數據Data進行加密, 生成Data的密碼形式(64位)做爲DES的輸出結果;

  如Mode爲解密,則用Key去把密碼形式的數據Data解密,還原爲Data的明碼形式(64位)做爲DES的輸出結果。

  在通訊網絡的兩端,雙方約定一致的Key,在通訊的源點用Key對核心數據進行DES加密,而後以密碼形式在公共通訊網(如電話網)中傳輸到通訊網絡的終點,數據到達目的地後,用一樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據(如PIN、MAC等)在公共通訊網中傳輸的安全性和可靠性。

  經過按期在通訊網絡的源端和目的端同時改用新的Key,便能更進一步提升數據的保密性,這正是如今金融交易網絡的流行作法。

 

3DES

  3DES是DES加密算法的一種模式,它使用3條64位的密鑰對數據進行三次加密數據加密標準(DES)是美國的一種由來已久的加密標準,它使用對稱密鑰加密法。

  3DES(即Triple DESDESAES過渡的加密算法(1999年,NIST將3-DES指定爲過渡的加密標準),是DES的一個更安全的變形。它以DES爲基本模塊,經過組合分組方法設計出分組加密算法。

 

  設Ek()和Dk()表明DES算法的加密和解密過程,K表明DES算法使用的密鑰,P表明明文,C表明密表,這樣,

  3DES加密過程爲:C=Ek3(Dk2(Ek1(P)))

  3DES解密過程爲:P=Dk1((EK2(Dk3(C)))

  K一、K二、K3決定了算法的安全性,三個密鑰互不相同,本質上就至關於用一個長爲168位的密鑰進行加密。多年來,它在對付強力攻擊時是比較安全的。若數據對安全性要求不那麼高,K1能夠等於K3。在這種狀況下,密鑰的有效長度爲112位

 

AES

  AES(Advanced Encryption Standard):高級加密標準,是下一代的加密算法標準,速度快,安全級別高。

  用AES加密2000年10月,NIST(美國國家標準和技術協會)宣佈經過從15種候選算法中選出的一項新的密匙加密標準。Rijndael被選中成爲未來的 AES。Rijndael是在1999年下半年,由研究員Joan Daemen 和 Vincent Rijmen 建立的。AES正日益成爲加密各類形式的電子數據的實際標準。

  美國標準與技術研究院(NIST)於2002年5月26日製定了新的高級加密標準(AES)規範。

 

  AES算法基於排列和置換運算。排列是對數據從新進行安排,置換是將一個數據單元替換爲另外一個。

  AES使用幾種不一樣的方法來執行排列和置換運算。AES是一個迭代的對稱密鑰分組的密碼,它可使用128192256位密鑰,而且用128位(16字節)分組加密和解密數據。

  與公共密鑰加密使用密鑰對不一樣,對稱密鑰密碼使用相同的密鑰加密和解密數據。經過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重複置換和替換輸入數據。

推薦文章:

http://blog.csdn.net/zixu/article/details/1204298

package mai.util;

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class ThreeDES {

private static final String Algorithm = "DESede"//定義 加密算法,可用 DES,DESede,Blowfish
    
    
//keybyte爲加密密鑰,長度爲24字節
    
//src爲被加密的數據緩衝區(源)
    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;
    }

    
//keybyte爲加密密鑰,長度爲24字節
    
//src爲加密後的緩衝區
    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;
    }

    
//轉換成十六進制字符串
    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就要把它添加進去
        Security.addProvider(new com.sun.crypto.provider.SunJCE());

        
final byte[] keyBytes = {0x110x220x4F0x58, (byte)0x880x100x400x38
                               , 
0x280x250x790x51, (byte)0xCB, (byte)0xDD0x550x66
                               , 
0x770x290x74, (byte)0x980x300x400x36, (byte)0xE2};    //24字節的密鑰
        String szSrc = "This is a 3DES test. 測試";
        
        System.out.println(
"加密前的字符串:" + szSrc);
        
        
byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());        
        System.out.println(
"加密後的字符串:" + new String(encoded));
        
        
byte[] srcBytes = decryptMode(keyBytes, encoded);
        System.out.println(
"解密後的字符串:" + (new String(srcBytes)));    }}

相關文章
相關標籤/搜索