DES是一種對稱加密(Data Encryption Standard)算法於年得到美國政府的正式許可是一種用位密鑰來加密位數據的方法一般密碼長度為個字節其中位加密密鑰每個第位都用作奇偶校驗
DES算法一般有兩個關鍵點第一個是加密模式第二個是數據補位加密模式的主要意義就是加密算法是按塊進行加密的例如 DES 是 Bit 一個塊的進行加密就是每次加密 個字節因此每次輸入八個字節的明文輸出八個字節密文如果是 個字節那麼分成兩個塊依次進行加密問題就出現在這裡如果明文是 分塊分別進行加密那麼加密的結果類似CCC CCC可以看出明文的規律這就是 ECB 加密模式密文可以看出明文的規律為了解決這個問題有了其他的加密模式CBC 加密模式(密碼分組連接)CFB加密模式(密碼反饋模式)OFB加密模式(輸出反饋模式)CBC 是要求給一個初始化的向量然後將每個輸出與該向量作運算並將運算的結果作為下一個加密塊的初始化向量CFB 和 OFB 則不需要提供初始化向量直接將密碼或者輸出作為初始化向量進行運算這樣就避免了明文的規律出現在密文中當然缺點是解密時需要保證密文的正確性如果網絡傳輸時發生了一部分錯誤則後面的解密結果就可能是錯誤的(ECB模式僅影響傳輸錯誤的那個塊密碼算法基本上都是分組(按快)進行加密的如果密文長度不是剛剛好可以進行分組怎麼辦?只能進行填充
加密算法常見的有ECB模式和CBC模式
第一種電子密本方式(ECB)
ECB模式電子密本方式就是將數據按照個字節一段進行DES加密或解密得到一段個字節的密文或者明文最後一段不足個字節則補足個字節(注意這裡就涉及到數據補位了)進行計算之後按照順序將計算所得的數據連在一起即可各段數據之間互不影響將明文分成n個比特分組如果明文長度不是比特的倍數則在明文末尾填充適當數目的規定符號對明文組用給定的密鑰分別進行加密行密文C=(CC……Cn)其中Ci=DES(Kxi)i=……n 這是Java封裝的DES算法的默認模式
第二種密文分組鏈接方式(CBC)
密文分組鏈接方式在CBC方式下每個明文組xi在加密前與先一組密文按位模二加後再送到DES加密CBC方式克服了ECB方式報內組重的缺點但由於明文組加密前與一組密文有關因此前一組密文的錯誤會傳播到下一組 這是NET封裝的DES算法的默認模式它比較麻煩加密步驟如下
首先將數據按照個字節一組進行分組得到DD……Dn(若數據不是的整數倍就涉及到數據補位了)
第一組數據D與向量I異或後的結果進行DES加密得到第一組密文C(注意這裡有向量I的說法ECB模式下沒有使用向量I)
第二組數據D與第一組的加密結果C異或以後的結果進行DES加密得到第二組密文C
之後的數據以此類推得到Cn
按順序連為CCC……Cn即為加密結果
第三種密文反饋方式(CFB)可用於序列密碼
明文X=(xx……xn)其中xi由t個比特組成 第四種輸出反饋方式(OFB)可用於序列密碼
與CFB唯一不同的是OFB是直接取DES輸出的t個比特而不是取密文的t個比特其余都與CFB相同但它取的是DES的輸出所以它克服了CFB的密文錯誤傳播的缺點
數據補位一般有NoPadding和PKCSPadding(Java中是PKCSPadding)填充方式PKCSPadding和PKCSPadding實際只是協議不一樣根據相關資料說明PKCSPadding明確定義了加密塊是字節PKCSPadding加密快可以是之間但是封裝的DES算法默認都是字節所以可以認為他們一樣數據補位實際是在數據不滿字節的倍數才補充到字節的倍數的填充過程
NoPadding填充方式算法本身不填充比如NET的padding提供了有NoneZeros方式分別為不填充和填充的方式
PKCSPadding(PKCSPadding)填充方式為NET和Java的默認填充方式對加密數據字節長度對取余為r如r大於則補r個字節字節為r的值如果r等於則補個字節比如
加密字符串為為AAA則補位為AAA;加密字符串為BBBBBB則補位為BBBBBB;加密字符串為CCCCCCCC則補位為CCCCCCCC
NET中的DES加密
對於NET框架在SystemSecurityCryptography命名空間下提供了DESCryptoServiceProvider作為SystemSecurityCryptographyDES加密解密的包裝接口它提供了如下的個方法
public override ICryptoTransform CreateDecryptor(byte[] rgbKey byte[] rgbIV)
public override ICryptoTransform CreateEncryptor(byte[] rgbKey byte[] rgbIV)
public override void GenerateIV()
public override void GenerateKey()
從NET類庫封裝情況加解密需要傳入一個Key和IV向量而且Key必須為字節的數據否則會直接拋異常出來當使用ECB模式下不管傳入什麼IV向量加密結果都一樣
From:http://tw.wingwit.com/Article/program/net/201311/13492.html