DES,Data Encryption Standard,數據加密標準。 算法
DES屬於分組密碼,明文分組長度爲64位,密鑰長度亦爲64位,造成的密文分組仍然爲64位。app
[分組密碼:將明文劃分爲相同長度的段落,對每一個段落分別進行加密的一種密碼機制]
框架
[序列密碼:對明文字符進行逐位加密的一種密碼機制,也稱流密碼]
ide
[密鑰長度:有些文章會直說DES密鑰長度爲56位,關於這點咱們下面再詳述]加密
DES加密算法框架圖以下所示[這裏僅考慮某一個分組的加密過程]: spa
我用底色來進行了大體的類型區分,分別爲: 3d
青底粉框的置換運算、綠底的輪結構、深灰底的左循環移位、淺灰底的左右交換。 orm
因爲輪結構中會牽涉到左循環移位和左右交換,下面咱們將分別講解置換運算和輪結構。xml
--置換運算-- blog
置換,通俗來講就是交換位置。
[對一個密碼體制,考察其任一密鑰控制下的加密變換:若任意密文c=c1c2…cn的各信息元素{ci}均是相應明文m1m2…mn的各信息元素{mi}的某種排列,則稱該種密碼爲置換密碼;不然,即存在密文c=c1c2…cn的各信息元素{ci}不是相應明文m1m2…mn的各信息元素{mi}的某種排列,則稱該種密碼爲代換密碼。]
DES算法中共有四種置換,經過上面的算法框架圖能夠看出分別是初始置換、逆初始置換、置換選擇1、置換選擇2。初始置換和逆初始置換分別是對明文和中間文(過程當中產生的非明文和密文的全部文)進行置換運算,置換選擇1和置換選擇2則是對密鑰進行運算,所以將他們分開講解。
|||初始置換和逆初始置換以下圖所示:
有數字恐懼症的人請淡定,圖中的數字指的是位置而不是數值。【有數學恐懼症的人會來看這個?】
原始狀態指未操做前的位置的定義。咱們看到它一共是64個位置,與分組長度相同。
初始置換(IP)進行後,分組中的64個位置上的字符開始互換位置,回想一下中學時老師給同窗們從新排座位,就是這樣。這位置怎麼排看上圖便可一一對照,我標註了位置1(原始狀態表,第1行第1列)和其初始置換後的位置(初始置換表,第5行第8列),其餘同理。
逆初始置換(IP^-1)是對已進行初始置換[以及其餘操做]後的數據再次置換。
曾經我看到初始置換和逆初始置換這兩個名字,就以爲他們倆之間…有問題。以原始狀態的位置1爲例簡單分析了下,進行初始置換後,它處於位置40(第5行第8列),進行逆初始置換後,處於位置40的字符從新回到了位置1[從上圖中可看到三個有青色底紋的位置變化]。好神奇。轉了一圈回到了本身最初呆的位置。因此不負他們各自的名字啊。
|||置換選擇1和置換選擇2以下圖所示:
置換選擇1和置換選擇2所作的操做與初始置換和逆初始置換原理相同。
這裏不一樣的地方在於,置換選擇1表是7×8一共56位,置換選擇表2是6×8一共48位。在置換過程當中,某些位被丟棄了。丟棄的緣由或者做用咱們在講解輪結構的時候會詳細講解。
一個很重要的概念是:全部置換操做都是線性的,都是一對一的關係。
--輪結構--
輪結構細節圖以下圖所示:
圖中左半部分是對明文的操做,右半部分是對密鑰的操做。
先來看明文部分。
在輪結構的開始,一個64位的明文分組被分紅了兩個部分,L(Left)和R(Right)。抽出右半部分R,首先進行一個擴展置換,這一步將32位分組變成了48位。擴展置換的規則以下圖所示:
這一步其實只是將某些位進行了二次重用。儘管如此,擴展置換仍然屬於一種線性運算。[其實我也不知道爲何,有誰能夠進行解答?]
擴展置換以後,明文分組與通過處理的密鑰進行了異或[⊕]運算。因而咱們先中斷一下明文處理這邊,先來看看密鑰這邊。
在本文的第二行就講到,密鑰是64位,但輪結構圖中標明的密鑰位數是56位,差別性在於:64位是指密鑰的總位數,56位是指密鑰的有效位。緣由在於,密鑰的每第8位爲奇偶校驗位。
密鑰的處理流程:置換選擇1→左循環移位→壓縮置換[也就是前文所說的置換選擇2]。
左循環移位以下圖所示:
在進行左循環移位以前,56位密鑰首先拆分紅兩部分,分別進行移位。循環移位的概念相信你們都清楚,這裏很少講。
左循環移位屬於輪結構的一部分,輪結構共進行16次,在每一輪中進行的左循環移位也並不是徹底相同,如上圖所示,在第一、二、九、16輪中,移位位數爲1位,其餘輪中移位位數爲2位。
左循環移位操做完成後,以前分開的左右兩半部分從新拼合起來進行一次壓縮置換,也就是前文講到的置換選擇2。這裏還要注意的是,拼合後的結果將做爲下一次輪結構的密鑰。
壓縮置換後的結果,與明文右半部分通過擴展置換後的結果,進行異或運算。參與運算的二者皆爲48位,異或後所得結果顯然也是48位。
再將所得的48位結果進行一次S盒代替。
S盒代替以下圖所示:
S盒將48位輸出等分紅8個部分,分別經由8個S盒進行操做。對於每一個S盒來講,輸入6位,輸出4位。
S盒1-8以下圖所示:
每個S盒是一個4×16的矩陣,咱們分別稱其爲[行:第0行、第1行、第2行、第3行,列:第0列、第1列、第2列、第3列、……、第15列]。
下面咱們來講一下S盒運算的規則:
假設進行S盒1的操做,輸入6位爲[1 1 1 0 1 0],咱們取最高位和最低位造成行、中間四位造成列,因而行爲[1 0]等於2,列爲[1 1 0 1]等於13,則查S盒1第2行第13列獲得結果10,轉換爲四位二進制數爲[1 0 1 0],這就是輸出結果。
八個S盒的輸出結果級聯後還需通過一次P盒置換。
P盒置換以下圖所示:
又見置換!哇哈哈這回終於安心地不解釋了。
接下來將P盒置換後所得的結果與明文分組的左半部分進行異或,所得結果做爲輪結果的右半部分。而輪結果的左半部分,直接由明文分組的右半部分擔任。
這個時候你們能夠回頭再看看輪結構簡圖了。
十六輪操做完成以後,再進行一次左右交換和一次逆初始置換[此時看加密算法框架圖],OK,大功告成了!
長噓一口氣……終於講完了……
還要總結一下嗎?來來來,死憋一口氣,繼續講:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
有一段明文須要進行DES加密,首先進行分組,每組64位,對每一分組分別進行加密。
準備一個64位的密鑰。注意每第8位屬於奇偶校驗位。所以有效密鑰爲56位。
密鑰先進行一次置換,再分紅兩半進行左循環移位,接着合起來進行一次壓縮置換。
明文首先進行一次置換,而後分紅兩半,右半邊進行一次擴展置換,與壓縮置換後的密鑰進行異或。
而後S盒,而後P盒,而後與明文的左半部分進行異或,獲得的結果做爲右半部分。
原明文的右半部分做爲左半部分,與上面獲得的進行級聯,而後進行下一輪。
輪結構共進行16次。
接着進行一次左右交換,再進行一次置換。OVER。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
就是這樣。歡迎你們前來交流。鞠躬~
其餘說明:
文中圖片均爲本人用PS製做,但內容大部分屬於《應用密碼學:協議、算法與C源程序》一書中所述。學生黨可隨意搬走使用,或聯繫我去掉圖片水印,其餘人員請保留水印,謝謝~
》
》
》
》
》