在20世紀60年代後期,IBM公司成立了一個由Horst Feistel負責的計算機密碼學研究項目。1971年設計出密碼算法LUCIFER後,該項目宣告結束。LUCIFER被賣給了倫敦的Lloyd公司,用在一樣由IBM公司開發的現金髮放系統上。LUCIFER是分組長度爲64位、密鑰長度爲128位、具備Feistel結構的分組密碼算法。由於LUCIFER很是成功,IBM決定開發一個適合於芯片實現的商業密碼產品。這一次由Walter Tuchman和Carl Meyer牽頭,參與者不只有IBM公司的研究人員,並且還有美國國家安全局(NSA)的技術顧問。此次努力的結果是給出了LUCIFER的一個修訂版,它的抗密碼分析能力更強,並且密鑰長度減少爲56位。git
1973年,美國國家標準局(NBS)徵求美國國家密碼標準方案時,IBM將Tuchman-Meyer方案提交給NBS,它是全部應徵方案中最好的一個,因此1977年NBS將它採納爲數據加密標準,即DES。github
以上內容直接來自與參考文獻[1],參考文獻[2]給出了更加詳細的一些介紹,有興趣能夠閱讀。算法
分組密碼經常使用的結構有SP、Feistel[3]、Lai-Massey、MISTY等,其中Feistel結構的使用較爲廣泛,不只DES用到了,後續的不少經典算法中都有涉及,故在此先對其進行介紹。安全
Feistel是以發明者Horst Feistel的名字命名的。加解密的原理如右圖1,左邊表示的加密過程,右邊表示解密過程。網絡
在每一輪加密過程當中,明文被分紅左右兩部分。函數
加密和解密公式以下:編碼
不一樣的是,在加密過程當中,輪數和輪密鑰從小開始遞增;解密時正好相反,從最大開始遞減。加密
從圖中能夠看出,加密最後一輪的操做與前面的有所不一樣,最後一輪獲得的兩個部分沒有交換,之因此這樣是爲了保持解密的流程和加密一致,這樣在硬件設計時可使用相同的結構,進而減小硬件面積。spa
可是對於Feistel結構最本質的特色究竟是什麼,我也一直不太明白,比較淺顯的一點認識就是:每一輪只有一半的比特位參與計算,另一半直接做爲下一輪的輸入。設計
假設明文爲(L0,R0),一共有兩輪計算,每輪的密鑰分別爲k0、k1,加解密的流程如圖2。
DES算法原理如右圖,相關參數以下:
整個操做能夠分爲3部分:
接下來分別對這三種核心操做進行介紹。
置換的操做以下表一、表2,將一個64位的輸入經過各位的提到獲得一個新的64位輸出。觀察能夠發現x = IP-1 ( IP(x) ) = IP ( IP-1(x) )。
須要注意的一點是,圖中的索引值從1開始(下文中的數字也相似),有些資料中是從0開始的,若是從零開始,則全部的數字減1便可。
每一輪的流程如圖4,從圖中能夠看出DES用到了Feistel結構。F即爲圖中虛線框的內容。
圖4 輪操做流程
每一輪主要涉及3中操做:
從圖1和圖4中能夠得出,密鑰擴展流程能夠表示以下:
1) 64位初始密鑰P進行置換選擇1,獲得56位輸出K;
2) 將K循環左移必定位數,再進行置換選擇2獲得48位輸出k1(即第一輪的密鑰);
3) 循環步驟2),直至獲得16輪的密鑰(k1、k2、……、k16);
4) 結束。
置換選擇一、置換選擇2和左移次數的值分別如表六、表七、表8。
近期介紹了DES、AES和Simon3種密碼算法,他們都屬於分組密碼算法,後續有時間再介紹其它分組密碼算法、流密碼算法、雜湊函數(Hash算法)等。讀者有興趣能夠參考《密碼學與網絡安全——原理與實踐》以及網上相關資料,算法原理基本都差很少。
[1] William Stallings著;王張宜等譯. 密碼編碼學與網絡安全——原理與實踐(第五版)[M]. 北京:電子工業出版社,2012.1.
[2] http://en.wikipedia.org/wiki/Data_Encryption_Standard
[3] http://en.wikipedia.org/wiki/Feistel_cipher
[4] https://github.com/tarequeh/DES