用心分享,共同成長html
沒有什麼比你天天進步一點點更實在了git
<p align="center">本文已經收錄至個人github,歡迎你們踊躍star 和 issues。</p>
<p align="center"><a rel="nofollow" href="https://github.com/midou-tech/articles" target="_blank">https://github.com/midou-tech/articles</a></p>;github
今天要說點和你的隱私有關的事情,在這個信息化的時代,是否是真的有人一手握着你的信息,一手數着鈔票呢?答案必定是固然。算法
說到網絡安全,我就不得不提一個東西——<font face="宋體" color=blue size=4>密碼學</font>(是否是聽起來頭皮發麻心跳加速),穩住穩住,老司機上線帶你學。今天給你們say&see什麼是密碼學中的<font face="宋體" color=orange size=4>DES</font>。安全
DES:markdown
English Name:Data Encrytion Standard網絡
中文名:DES 算法,數據加密標準ide
是迄今爲止世界上最爲普遍使用和流行的一種分組密碼算法。(聽到這裏有沒有感受有點東西)函數
data(加解密的數據):64bit的明文或者密文須要被加密或被解密的數據加密
key(加解密的密鑰):8Byte,64bit密鑰(56bit密鑰+8bit奇偶校驗位)
DES算法使用64位的密鑰key將64位的明文輸入塊變爲64位的密文輸出塊,並把輸出塊分爲L0、R0兩部分,每部分均爲32位。左部分Li=Ri-1,右部分Ri=Li-1⊕F(Ri-1,Ki)<font face="宋體" color=orange size=4>(注:這裏的⊕指二元域上的加法,即異或)</font>,初始置換規則以下:
1 58,50,42,34,26,18,10,02, 2 60,52,44,36,28,20,12,04, 3 62,54,46,38,30,22,14,06, 4 64,56,48,40,32,24,16,08, 5 57,49,41,33,25,17,09,01, 6 59,51,43,35,27,19,11,03, 7 61,53,45,37,29,21,13,05, 8 63,55,47,39,31,23,15,07,
即將輸入的64位明文的第1位置換到第40位,第2位置換到第8位,第3位置換到第48位。以此類推,最後一位是原來的第7位。置換規則是規定的。L0是置換後的數據的前32位(D1-D32),R0是置換後的數據的後32位(D33-D64)。
F函數是DES的加密核心,做用也是很是大的,而Feistel結構決定了其加密解密流程是相同的,不管是硬件實現仍是軟件實現都只須要一種結構,不須要分別實現。
函數F由四步運算構成:密鑰置換;擴展E變換;S-盒代替;P-盒置換。
DES算法由64位密鑰產生16輪的48位子密鑰。在每一輪的迭代過程當中,使用不一樣的子密鑰。
a、把密鑰的奇偶校驗位忽略不參與計算,即每一個字節的第8位,將64位密鑰降至56位,而後根據選擇置換PC-1將這56位分紅兩塊C0(28位)和D0(28位);
b、將C0和D0進行循環左移變化<font face="宋體" color=orange size=4>(注:每輪循環左移的位數由輪數決定)</font>,變換後生成C1和D1,而後C1和D1合併,並經過選擇置換PC-2生成子密鑰K1(48位);
c、C1和D1在次通過循環左移變換,生成C2和D2,而後C2和D2合併,經過選擇置換PC-2生成密鑰K2(48位);
擴展E變換是將數據的右半部分Ri從32位擴展到48位。
擴展置換的目的:
a、產生與密鑰相同長度的數據以進行異或運算,R0是32位,子密鑰是48位,因此R0要先進行擴展置換以後與子密鑰進行異或運算;
擴展置換E規則以下:
1 32,01,02,03,04,05, 2 04,05,06,07,08,09, 3 08,09,10,11,12,13, 4 12,13,14,15,16,17, 5 16,17,18,19,20,21, 6 20,21,22,23,24,25, 7 24,25,26,27,28,29, 8 28,29,30,31,32,31,
也就是說,表中的第i個數據j表示輸出的第i位爲輸入的第j位。例如;輸出的第1位是輸入的第32位,輸出的第7位爲輸入的第4位。
S-盒做爲feistel結構的<font face="宋體" color=orange size=4>核心</font>,起着相當重要的做用。輸入的32bit數據經擴展置換以後與48bit子密鑰Kn異或,生成的結果做爲輸入,傳入S盒中進行代替運算。S-盒功能是把48位數據變爲32位數據,feistel結構中是由8個不一樣的S盒共同協做完成。其中,每一個S-盒有6位輸入,4位輸出。因此48位的輸入塊被分紅8個6位的分組,每個分組對應一個S-盒代替操做。通過S-盒代替,造成8個4位分組結果。
<font face="宋體" color=orange size=4>注:每個S-盒的輸入數據是6位,輸出數據是4位,可是每一個S-盒自身是64位!!</font>
S-盒1:
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,
S-盒2:
15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,
S-盒3:
10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,
S-盒4:
7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,
S-盒5:
2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,
S-盒6:
12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,
S-盒7:
4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,
S-盒8:
13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,
S盒的計算:第一位和第六位肯定行數,第2、3、四行肯定列數,在表中找出對應的數據,將其表示爲二進制數據。
在S-盒代替運算中,每個S-盒獲得4位,8盒共獲得32bit輸出數據。這32位輸出做爲P盒置換的輸入塊,最終輸出爲32bit的輸出數據。P盒置換將每一位輸入位映射到輸出位。任何一位都不能被映射兩次,也不能被略去。
將初始置換進行16次的迭代,即進行16層的加密變換,這個運算過程咱們暫時稱爲函數f。獲得L16和R16,將此做爲輸入塊,進行逆置換獲得最終的密文輸出塊。逆置換是初始置換的逆運算。從初始置換規則中能夠看到,原始數據的第1位置換到了第40位,第2位置換到了第8位。則逆置換就是將第40位置換到第1位,第8位置換到第2位。以此類推,逆置換規則以下:
1 40,08,48,16,56,24,64,32,39,07,47,15,55,23,63,31, 2 38,06,46,14,54,22,62,30,37,05,45,13,53,21,61,29, 3 36,04,44,12,52,20,60,28,35,03,43,11,51,19,59,27, 4 34,02,42,10,50,18,58 26,33,01,41,09,49,17,57,25,
注:DES算法的加密密鑰是根據用戶輸入的祕鑰生成的,該算法把64位密碼中的第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位做爲奇偶校驗位,在計算密鑰時要忽略這8位.因此實際中使用的祕鑰有效位是56位。
祕鑰共64位,每次置換都不考慮每字節的第8個比特位,這一位是在密鑰產生過程當中生成的奇偶校驗位,因此64位祕鑰的第八、1六、2四、3二、40、4八、5六、64位在計算祕鑰時均忽略。
DES的解密過程和DES的加密過程基本相似,惟一的不一樣是將16輪的子密鑰序列的順序反過來,即在加密過程當中所用的加密密鑰k1,...,k16在解密過程當中須要轉換成k16,...,k1。
[