特點
分組比較短、密鑰太短、密碼生命週期短、運算速度較慢。
編輯本段基本原理
入口參數有三個:key、data、mode。 key爲加密解密使用的密鑰,data爲加密解密的數據,mode爲其工作模式。當模式爲加密模式時,明文按照64位進行分組,形成明文組,key用於對數據加密,當模式爲解密模式時,key用於對數據解密。實際運用中,密鑰只用到了64位中的56位,這樣才具有高的安全性。 DES( Data Encryption Standard)算法,於1977年得到美國政府的正式許可,是一種用56位密鑰來加密64位數據的方法。雖然56位密鑰的DES算法已經風光不在,而且常有用Des加密的明文被破譯的報道,但是瞭解一下昔日美國的標準加密算法總是有益的,而且目前DES算法得到了廣泛的應用,在某些場合,仍然發揮着餘熱。
編輯本段密鑰生成
取得密鑰
從用戶處取得一個64位(本文如未特指,均指二進制位))長的密碼key ,去除64位密碼中作爲奇偶校驗位的第8、16、24、32、40、48、56、64位,剩下的56位作爲有效輸入密鑰.
等分密鑰
表1. DES加密算法
57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 50 44 36 表2. 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4 把在1步中生成的56位輸入密鑰分成均等的A,B兩部分,每部分爲28位,參照表1和表2把輸入密鑰的位值填入相應的位置. 按照表1所示A的第一位爲輸入的64位密鑰的第57位,A的第2位爲64位密鑰的第49位,...,依此類推,A的最後一位最後一位是64位密鑰的第36位。
密鑰移位
表3. i 1 2 3 4 5 6 7 8 DES加密算法
ǿ 1 1 2 2 2 2 2 2 i 9 10 11 12 13 14 15 16 ǿ 1 2 2 2 2 2 2 1 DES算法的密鑰是經過16次迭代得到一組密鑰的,把在1.1.2步中生成的A,B視爲迭代的起始密鑰,表3顯示在第i次迭代時密鑰循環左移的位數. 比如在第1次迭代時密鑰循環左移1位,第3次迭代時密鑰循環左移2位. 第9次迭代時密鑰循環左移1位,第14次迭代時密鑰循環左移2位. 第一次迭代: A(1) = ǿ(1) A B(1) = ǿ(1) B DES加密算法
第i次迭代: A(i) = ǿ(i) A(i-1) B(i) = ǿ(i) B(i-1)
實現接口函數的介紹
1 int des(char *data, char *key,int readlen) 參數: 1.存放待加密明文的內存指針(長度爲readlen,可能經過填充; 2.存放用戶輸入的密鑰內存的指針 3.待加密明文的長度(8字節的倍數) 功能: 生成加密密鑰,把待加密的明文數據分割成64位的塊,逐塊完成16次迭代加密,密文存放在data所指向的內存中. 2 int Ddes(char *data, char *key,int readlen) 參數: 1.存放待解密文的內存指針(長度爲readlen,可能經過填充; 2.存放用戶輸入的密鑰內存的指針 3.待解密文的長度( 8字節的倍數) 功能: 生成解密密鑰,把待解密文分割成64位的塊,逐塊完成16次迭代解密,解密後的明文存放在data所指向的內存中. 3 int des3(char *data, char *key, int n ,int readlen) 參數: 1.存放待加密明文的內存指針(長度爲readlen,可能經過填充; 2.存放用戶輸入的密鑰內存的指針 DES加密算法
3.用戶指定進行多少層加密 4.待加密明文的長度(8字節的倍數) 功能: 生成加密密鑰,把待加密的明文分割成64位的塊,把第i-1層加密後的密文作爲第i層加密的明文輸入,根據用戶指定的加密層數進行n層加密,最終生成的密文存放在data所指向的內存中. 說明: 用戶僅僅輸入一條密鑰,所有的加密密鑰都是由這條密鑰生成. 4 int Ddes3(char *data, char*key, int n ,int readlen) 參數: 1.存放待解密文的內存指針(長度爲readlen,可能經過填充; 2.存放用戶輸入的密鑰內存的指針 3.用戶指定進行多少層解密 4.待解密文的長度(8字節的倍數) 功能: 生成解密密鑰,把待解密文分割成64位的塊,把第i-1層解密後的"明文"作爲第i層解密的密文輸入,根據用戶指定的解密層數進行n層解密,最終生成的明文存放在data所指向的內存中. 說明: 用戶僅僅輸入一條密鑰,所有的解密密鑰都是由這條密鑰生成. 5 int desN(char*data,char**key,int n_key,int readlen) 參數: 1.存放待加密明文的內存指針(長度爲readlen,可能經過填充; 2.存放用戶輸入的密鑰內存的指針 3.用戶指定了多少條密鑰 4.待加密明文的長度(8字節的倍數) 功能: DES加密算法生成加密密鑰,把待加密的明文分割成64位的塊,把第i-1層加密後的密文作爲第i層加密的明文輸入,根據用戶指定的加密層數進行n層加密,最終生成的密文存放在data所指向的內存中. 說明: 這裏用戶通過輸入的密鑰條數決定加密的層數,每輪16次迭代加密所使用的加密密鑰是由用戶自定的對應密鑰生成. 6 int DdesN(char*data,char**key,intn_key,int readlen) 參數: 1.存放待解密文的內存指針(長度爲readlen,可能經過填充; 2.存放用戶輸入的密鑰內存的指針 3.用戶指定了多少條密鑰 4.待解密文的長度(8字節的倍數) 功能: 生成解密密鑰,把待解密文分割成64位的塊,把第i-1層解密後的”明文”作爲第i層解密的密文輸入,根據用戶指定的解密層數進行n層解密,最終生成的明文存放在data所指向的內存中. 說明: 這裏用戶通過輸入的密鑰條數決定解密的層數,每輪16次迭代加密所使用的解密密鑰是由用戶自定的對應密鑰生成. DES加密算法-實現的介紹 利用算法核心代碼封裝的接口函數編寫了一個針對文本文件的加密解密工具。選擇把密文以16進制的形式寫入文件的方法.當然也可以直接寫入文件. 例: DES加密算法
密文爲:12345678 在內存中顯示爲: 31 32 33 34 35 36 37 38 那麼就把以3132333435363738的形式寫入文件. 爲了解密的方便,密文中的每個字節用兩個字節表示,也即在內存中顯示爲0x9A的內容,就以9A的形式寫入文件中.當內存中顯示的內容爲0x0?(?代表0~F)形式時,需要以0?的形式寫入文件. 這樣可以避開前面提及的問題,只是在解密時先按照兩兩組合的原則,順序把從文件中讀取的數據轉換成待解的密文. 例: 讀出的數據是: 3132333435363738 那麼復原的過程: 31->1 32->2 33->3 …. 38->8 最終得真正的密文12345678,這樣就可以調用DES算法解密函數從密文得到明文. DES算法是對固定大小(64位)的數據塊進行加密解密操作的,對於那些不夠64位的數據塊需要採用填充機制補位到64位長,爲了方便使用,數據位的填充是對用戶而言是透明的,利用該工具進行加密解密操作時,用戶只需輸入操作的類型、讀取數據的文件名、寫入操作結果的文件名、密鑰等信息.
編輯本段操作思路
#define READFILESIZE 512 步驟: 1.從文件中讀取READFILESIZE個字節的數據 2.,如果從文件中讀出的數據少於READFILESIZE個,以0補足,然後根據用戶指定的類型對這READFILESIZE個字節的數據進行操作. 3.判斷文件是否結束,沒有則執行步驟1 4.把加密後的文件實際長度添加到密文的末尾 5.結束 採用一次只從文件讀取READFILESIZE個字節是在爲了防止由於需要加密或解密的文件太大導致內存不夠的情況出現。 DES加密算法-注意事項 DES算法的加密密鑰是根據用戶輸入的密碼生成的,該算法把64位密碼中的第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位作爲奇偶校驗位,在計算密鑰時要忽略這8位.如果輸入的密碼只是在這8位上有區別的話,那麼操作後的結果將是一樣的. 例: 輸入的密碼爲wuzhenll,密鑰的16進製表示爲77 75 7A 68 65 6E 6C 6C 任意改變這64位數據的奇偶校驗位,可以得到16個不同的密碼, 把8個奇偶檢驗位全取反後: w->v u->t z->{ h->i e->d n->o l->m 形成新密碼:vt{idomm 表面上新密碼和原密碼迥然不同,但是由於他們僅在奇偶校驗位上有區別,所以用這兩個密碼進行加密解密操作得到的結果是一樣的. 筆者建議使用安全係數較高的多密鑰加密解密方案. 此外用戶輸入的密碼的長度不受限制,當輸入的密碼長度爲0時,使用缺省64位密碼;當輸入的密碼長度大於8字節時,輸入密碼的前8個字節爲有效密碼. 該工具提供6種不同的操作類型: 1:一層加密; 2:一層解密; 3:N層單密鑰加密; 4:N層單密鑰解密; 5:N層多密鑰加密; 6:N層多密鑰解密; 這六種操作是對稱使用的,例如:加密明文時選擇一層加密,解密時對密文使用一層解密