DES加密算法的实现
花了几天的时间终于把DES加密搞定了,原本只是看着教科书上做,发现书上不详细,而且S盒矩阵都没有列出来,于是上网找资料,才把程序完成,还发现了教科书上的一个错误:《计算机网络安全》-邓亚平,人民邮电出版社,第一版 P51,第1行:“……最右两个取出来当列数……”此处的“列”应该是“行”,而下一行的“……当行数……”,应该是“列”。
代码下载
使用范例
//Copyright
//2005-10-16
#include "des.h"
char str[]="http://jonlee.cnblogs.com"; //25*8位明文
char key[]="ILOVEYOU"; //8位密钥
char str2[32]; //密文必须是8字节(64位)的倍数
char str3[32]; //解密结果
CDes dese;
void main()
{
//加密(明文,密钥,密文,长度)
dese.Encrypt (str,key,str2,25);
//解密(密文,密钥,明文,长度)
dese.Decrypt (str2,key,str3,32);
}
下面附上DES加密的原理
DES加密算法的原理. (转) 一.本文實用於初學者,目的在於幫助大家熟悉一些系統底層的知識。 二.本文只是為了讓廣大網友共同提高一些基礎知識,本人決無賣弄之意,只供需要這方面知識的讀者閱讀,如果你是高手,或者不需要這方面知識,請跳過。 三.本文是一篇翻譯文章,如有雷同,敬請諒解。 四.本文歡迎傳抄轉載,但是不要用於任何商業用途。請尊重作者勞動,也歡迎來信交流 fnlq@263.net
【正文】 DES算法理論 本世紀五十年代以來,密碼學研究領域出現了最具代表性的兩大成就。其中之一就是1971年美國學者塔奇曼 (Tuchman)和麥耶(Meyer)根據信息論創始人香農(Shannon)提出的「多重加密有效性理論」創立的,後於1977年由美國國家標準局頒布的數據加密標準。 它的算法是對稱的,既可用於加密又可用於解密。 美國國家標準局1973年開始研究除國防部外的其它部門的計算機系統的數據加密標準,於1973年5月15日和1974年8月27日先後兩次向公眾發出了徵求加密算法的公告。 加密算法要達到的目的通常稱為DES密碼算法要求主要為以下四點: 提供高質量的數據保護,防止數據未經授權的洩露和未被察覺的修改;具有相當高的複雜性,使得破譯的開銷超過可能獲得的利益,同時又要便於理解和掌握 DES密碼體制的安全性應該不依賴於算法的保密,其安全性僅以加密密鑰的保密為基礎實現經濟,運行有效,並且適用於多種完全不同的應用。 1977年1月,美國政府頒布:採納IBM公司設計的方案作為非機密數據的正式數據加密標準(DES棗Data Encryption Standard)。 目前在這裡,隨著三金工程尤其是金卡工程的啟動,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費站等領域被廣泛應用,以此來實現關鍵數據的保密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數據包的MAC校驗等,均用到DES算法。 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,便能更進一步提高數據的保密性,這正是現在金融交易網絡的流行做法。 DES算法詳述 DES算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的密鑰也是64位,其功能是把輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位,其置換規則見下表: 58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4,
經過26次迭代運算後。得到L16、R16,將此作為輸入,進行逆置換,即得到密文輸出。逆置換正好是初始置的逆運算,例如,第1位經過初始置換後,處於第40位,而通過逆置換,又將第40位換回到第1位,其逆置換規則如下表所示: 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31, 放大換位表 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10,11, 單純換位表 16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10, 在f(Ri,Ki)算法描述圖中,S1,S2...S8為選擇函數,其功能是把6bit數據變為4bit數據。下面給出選擇函數Si(i=1,2......8)的功能表: S1:
現設輸入為: D=D1D2D3D4D5D6 然後在S1表中查得對應的數,以4位二進製表示,此即為選擇函數S1的輸出。下面給出子密鑰Ki(48bit)的生成算法 從子密鑰Ki的生成算法描述圖中我們可以看到:初始Key值為64位,但DES算法規定,其中第8、16、......64位是奇偶校驗位,不參與DES運算。故Key 實際可用位數便只有56位。即:經過縮小選擇換位表1的變換後,Key 的位數由64 位變成了56位,此56位分為C0、D0兩部分,各28位,然後分別進行第1次循環左移,得到C1、D1,將C1(28位)、D1(28位)合併得到56位,再經過縮小選擇換位2,從而便得到了密鑰K0(48位)。依此類推,便可得到K1、K2、......、K15,不過需要注意的是,16次循環左移對應的左移位數要依據下述規則進行: 循環左移位數 由上述DES算法介紹我們可以看到:DES算法中只用到64位密鑰中的其中56位,而第8、16、24、......64位8個位並未參與DES運算,這一點,向我們提出了一個應用上的要求,即DES的安全性是基於除了8,16,24,......64位外的其餘56位的組合變化256才得以保證的。因此,在實際應用中,我們應避開使用第8,16,24,......64位作為有效數據位,而使用其它的56位作為有效數據位,才能保證DES算法安全可靠地發揮作用。如果不瞭解這一點,把密鑰Key的8,16,24,..... .64位作為有效數據使用,將不能保證DES加密數據的安全性,對運用DES來達到保密作用的系統產生數據被破譯的危險,這正是DES算法在應用上的誤區,是各級技術人員、各級領導在使用過程中應絕對避免的,而當今各金融部門及非金融部門,在運用DES工作,掌握DES工作密鑰Key的領導、主管們,極易忽略,給使用中貌似安全的系統,留下了被人攻擊、被人破譯的極大隱患。 筆者用Turbo C編寫了DES算法程序,並在PC機上對上述的DES 算法的應用誤區進行了騅,其驗證數據如下: Key: 0x30 0x30 0x30 0x30......0x30(8個字節) 如果把上述的Key換為8個字節的0x31,而Data和Mode均不變,則執行DES 後得到的密文完全一樣。類似地,用Key:8個0x32和用Key:8個0x33 去加密Data (8 個0x31),二者的圖文輸出也是相同的:5e c3 ac e9 53 71 3b ba 當Key由8個0x32換成8個0x31後,貌似換成了新的Key,但由於0x30和0x31僅僅是在第8,16,24......64有變化,而DES算法並不使用Key的第8,16,......64位作為Key的有效數據位,故:加密出的結果是一樣的。 Key: 0x31 0x31......0x31(8個0x31) 由以上看出:DES算法加密與解密均工作正確。唯一需要避免的是:在應用中,避開使用Key的第8,16......64位作為有效數據位,從而便避開了DES 算法在應用中的誤區。 在DES密鑰Key的使用、管理及密鑰更換的過程中,應絕對避開DES 算法的應用誤區,即:絕對不能把Key的第8,16,24......64位作為有效數據位,來對Key 進行管理。這一點,特別推薦給金融銀行界及非金融業界的領導及決策者們,尤其是負責管理密鑰的人,要對此點予以高度重視。有的銀行金融交易網絡,利用定期更換DES密鑰Key的辦法來進一步提高系統的安全性和可靠性,如果忽略了上述應用誤區,那麼,更換新密鑰將是徒勞的,對金融交易網絡的安全運行將是十分危險的,所以更換密鑰一定要保證新Key與舊Key真正的不同,即除了第8,16,24,...64位外其它位數據發生了變化,請務必對此保持高度重視! |
*******************************************************************************************
* 2007-9-16更新
*******************************************************************************************
对于两年前写的这篇blog和提供的代码感到有点抱歉,故更新了一下,修正了一些致命的bug,使用方法也不再是上面写的那样,具体可以看头文件。
代码下载