DES加密模式詳解


DES加密模式詳解

http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html

http://www.blogjava.net/wayne/archive/2011/05/23/350879.html

 

加密算法常見的有ECB模式和CBC模式:

ECB模式:電子密本方式,這是JAVA封裝的DES算法的默認模式,就是將數據按照8個字節一段進行DES加密或解密得到一段8個字節的密文或者明文,最后一段不足8個字節,則補足8個字節(注意:這里就涉及到數據補位了)進行計算,之后按照順序將計算所得的數據連在一起即可,各段數據之間互不影響。

CBC模式:密文分組鏈接方式,這是.NET封裝的DES算法的默認模式,它比較麻煩,加密步驟如下:

1、首先將數據按照8個字節一組進行分組得到D1D2......Dn(若數據不是8的整數倍,就涉及到數據補位了)

2、第一組數據D1與向量I異或后的結果進行DES加密得到第一組密文C1(注意:這里有向量I的說法,ECB模式下沒有使用向量I)

3、第二組數據D2與第一組的加密結果C1異或以后的結果進行DES加密,得到第二組密文C2

4、之后的數據以此類推,得到Cn

5、按順序連為C1C2C3......Cn即為加密結果。

 

數據補位一般有NoPadding和PKCS7Padding(JAVA中是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding實際只是協議不一樣,根據相關資料說明:PKCS5Padding明確定義了加密塊是8字節,PKCS7Padding加密快可以是1-255之間。但是封裝的DES算法默認都是8字節,所以可以認為他們一樣。數據補位實際是在數據不滿8字節的倍數,才補充到8字節的倍數的填充過程。

NoPadding填充方式:算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分別為不填充和填充0的方式。

PKCS7Padding(PKCS5Padding)填充方式:為.NET和JAVA的默認填充方式,對加密數據字節長度對8取余為r,如r大於0,則補8-r個字節,字節為8-r的值;如果r等於0,則補8個字節8。比如:

加密字符串為為AAA,則補位為AAA55555;加密字符串為BBBBBB,則補位為BBBBBB22;加密字符串為CCCCCCCC,則補位為CCCCCCCC88888888。

 

互聯網的軟件設計一定少不了加密算法,並且大量使用的都會是對稱加密,比較常見的對稱加密有:DES、3DES、RC4、AES等等;

加密算法都有幾個共同的要點:

  1. 密鑰長度;(關系到密鑰的強度)
  2. 加密模式;(ecb、cbc等等)
  3. 塊加密算法里的填充方式區分;

對於加密模式,很多同學還不清楚,比如DES,也會有ECB、CBC等不同的區分,它們都是標准的;

      Windows加密庫中,默認則是CBC模式,也可以手工設置;

       Openssl庫要更明顯一點,它的函數名里面就寫明了,比如:DES_ncbc_encrypt,一看就知道是cbc模式;

       JAVA里面也比較清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式

 

各種加密模式有什么不同呢:(為了方便,這里的加密key都取64位)

電子密碼本模式ECB:

最古老,最簡單的模式,將加密的數據分成若干組,每組的大小跟加密密鑰長度相同

然后每組都用相同的密鑰加密, 比如DES算法, 如果最后一個分組長度不夠64位,要補齊64位;

定義:

          Enc(X,Y)是加密函數

          Dec(X,Y)是解密函數

          Key是加密密鑰;

          Pi ( i = 0,1…n)是明文塊,大小為64bit;

          Ci ( i = 0,1…n)是密文塊,大小為64bit;

ECB加密算法可表示為:

           Ci = Enc(Key, Pi)

ECB解密算法可以表示為:

          Pi = Dec(Key,Ci)

     算法 特點:

  • 每次Key、明文、密文的長度都必須是64位;
  • 數據塊重復排序不需要檢測;
  • 相同的明文塊(使用相同的密鑰)產生相同的密文塊,容易遭受字典攻擊;
  • 一個錯誤僅僅會對一個密文塊產生影響;

加密塊鏈模式CBC:

     與ECB模式最大的不同是加入了初始向量

     定義:

           Enc(X,Y)是加密函數

           Dec(X,Y)是解密函數

           Key是加密密鑰;

           Pi ( i = 0,1…n)是明文塊,大小為64bit;

           Ci ( i = 0,1…n)是密文塊,大小為64bit;

           XOR(X,Y)是異或運算;

           IV是初始向量(一般為64位);

    ECB加密算法可表示為:

          C0 = Enc(Key, XOR(IV, P0)

            Ci = Enc(Key, XOR(Ci-1, Pi)

    ECB解密算法可以表示為:

           P0 = XOR(IV, Dec(Key, C0))

            Pi = XOR(Ci-1, Dec(Key,Ci))

算法特點:

  • 每次加密的密文長度為64位(8個字節);
  • 當相同的明文使用相同的密鑰和初始向量的時候CBC模式總是產生相同的密文;
  • 密文塊要依賴以前的操作結果,所以,密文塊不能進行重新排列;
  • 可以使用不同的初始化向量來避免相同的明文產生相同的密文,一定程度上抵抗字典攻擊;
  • 一個錯誤發生以后,當前和以后的密文都會被影響;

加密反饋模式CFB:

加密反饋模式克服了需要等待8個字節才能加密的缺點,它采用了分組密碼作為流密碼的密鑰流生成器;

     定義:

           Enc(X,Y)是加密函數

           Dec(X,Y)是解密函數

          Key是加密密鑰;

           Pi ( i = 0,1…n)是明文塊,大小為64bit;

           Ci ( i = 0,1…n)是密文塊,大小為64bit;

            Si ( i = 0,1…n),大小為8bit,n個連續的Si組成加密位移寄存器,一般n=8;

           Oi = Enc(Key, Si);

           Lef(x) 為取數據x的最左8個bit位;

           A(x,y)為合並x左移8位,空位用y填充

     CFB加密算法可表示為:

           S0 = IV;

           Oi = Enc(Key, Si);

            Ci = XOR( Ci, Lef(Oi));

           Si = A(Si-1, Ci);

     CFB解密算法可表示為:

           S0 = IV;

           Oi = Enc(Key, Si);

           Ci = XOR( Ci, Lef(Oi));

           Si = A(Si-1, Ci);

     圖示:

        

 

    特點:

  • 每次加密的Pi和Ci不大於64位;
  • 加密算法和解密算法相同,不能適用於公鑰算法;
  • 使用相同的密鑰和初始向量的時候,相同明文使用CFB模式加密輸出相同的密文;
  • 可以使用不同的初始化變量使相同的明文產生不同的密文,防止字典攻擊;
  • 加密強度依賴於密鑰長度;
  • 加密塊長度過小時,會增加循環的數量,導致開銷增加;
  • 加密塊長度應時8位的整數倍(即字節為單位);
  • 一旦某位數據出錯,會影響目前和其后8個塊的數據;

輸出反饋模式OFB:

與CFB模式不同之處在於, 加密位移寄存器與密文無關了,僅與加密key和加密算法有關;

做法是不再把密文輸入到加密移位寄存器,而是把輸出的分組密文(Oi)輸入到一位寄存器;

     定義:

           Enc(X,Y)是加密函數

           Dec(X,Y)是解密函數

           Key是加密密鑰;

           Pi ( i = 0,1…n)是明文塊,大小為64bit;

           Ci ( i = 0,1…n)是密文塊,大小為64bit;

           Si ( i = 0,1…n),大小為8bit,n個連續的Si組成加密位移寄存器,一般n=8;

           Oi = Enc(Key, Si);

           Lef(x) 為取數據x的最左8個bit位;

           A(x,y)為合並x左移8位,空位用y填充

    CFB加密算法可表示為:

           S0 = IV;

           Oi = Enc(Key, Si);

           Ci = XOR( Ci, Lef(Oi));

           Si = A(Si-1, Oi);          注意這里與CFB模式的不同

    CFB解密算法可表示為:

           S0 = IV;

           Oi = Enc(Key, Si);

           Ci = XOR( Ci, Lef(Oi));

           Si = A(Si-1, Oi);

    特點:

  • 與CFB類似,以下都是不同之處;
  • 因為密文沒有參與鏈操作,所以使得OFB模式更容易受到攻擊;
  • 不會進行錯誤傳播,某位密文發生錯誤,只會影響該位對應的明文,而不會影響別的位;
  • 不是自同步的,如果加密和解密兩個操作失去同步,那么系統需要重新初始化;
  • 每次重新同步時,應使用不同的初始向量。可以避免產生相同的比特流,避免”已知明文”攻擊 ;

 

Windows API進行加密參數設置:

     CryptGetKeyParam可以對HCRYPTKEY對象的各種參數進行查詢,包括加密模式、padding方式等;但這個函數不能用於查詢加密key的明文;

     但如果需要看到真正加密的key是什么,則需要另外的API:CryptExportKey,選擇PLAINTEXTKEYBLOB方式進行導出可以得到key的明文;

 

使用加密要注意的地方:

    當兩個封裝好的加密算法對8byte數據進行DES加密時,如果加密出來的結果是一樣的,千萬不要認為這兩個算法可以互換;

     因為ECB模式,和向量全為0的CBC模式得到的密文前8byte,確實是一樣,但后面的密文就不一樣了;

使用加密以前確定你理解了它;

 

互聯網程序中加密模式的使用:

     ECB是不推薦的方式,Key相同時,相同的明文在不同的時候產生相同的明文,容易遭到字典攻擊;

     CBC由於加入了向量參數,一定程度上抵御了字典工具,但缺點也隨之而來,一旦中間一個數據出錯或丟失,后面的數據將受到影響;

     CFB與CBC類似,好處是明文和密文不用是8bit的整數倍,中間一個數據出錯,只影響后面的幾個塊的數據;

     OFB比CFB方式,一旦一個數據出錯,不會影響后面的數據,但安全性降低;

     因此,推薦使用CFB方式,但每個數據包單獨加密,否則一個數據包丟失,需要做很多容錯處理;

     當然,具體問題也要具體分析,對於只需要”特定安全性”①,不需要”計算安全性”以上的軟件,也可以使用ECB模式;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM