DES算法之加密-從數學角度進行梳理

DES,Data Encryption Standard,數據加密標準。 算法

DES屬於分組密碼,明文分組長度爲64位,密鑰長度亦爲64位,造成的密文分組仍然爲64位。app

[分組密碼:將明文劃分爲相同長度的段落,對每一個段落分別進行加密的一種密碼機制]
框架

[序列密碼:對明文字符進行逐位加密的一種密碼機制,也稱流密碼]
ide

[密鑰長度:有些文章會直說DES密鑰長度爲56位,關於這點咱們下面再詳述]加密

 

DES加密算法框架圖以下所示[這裏僅考慮某一個分組的加密過程]spa

我用底色來進行了大體的類型區分,分別爲: 3d

青底粉框的置換運算、綠底的輪結構、深灰底的左循環移位、淺灰底的左右交換orm

因爲輪結構中會牽涉到左循環移位和左右交換,下面咱們將分別講解置換運算和輪結構。xml

 

--置換運算-- blog

置換,通俗來講就是交換位置。

[對一個密碼體制,考察其任一密鑰控制下的加密變換:若任意密文c=c1c2cn的各信息元素{ci}均是相應明文m1m2mn的各信息元素{mi}的某種排列,則稱該種密碼爲置換密碼;不然,即存在密文c=c1c2cn的各信息元素{ci}不是相應明文m1m2mn的各信息元素{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源程序》一書中所述。學生黨可隨意搬走使用,或聯繫我去掉圖片水印,其餘人員請保留水印,謝謝~





相關文章
相關標籤/搜索