對稱分組密碼之數據加密標準(DES)

分組密碼

分組密碼和流密碼的關係

1、流密碼每次加密數據流的一位或一個字節。 分組密碼加解密方案把輸入的明文分組當作一個整體進行加密,並且通常得到與明文等長的密文分組。

Feistel結構

置換:明文元素被替換爲該序列的其他元素(順序改變)。
代替:明文元素(組)被唯一地替換爲相應地密文元素(組)。

對付統計分析方法——擴散和混淆(對分組密碼設計有重要作用)
擴散:每個密文數字被多個明文數字影響,明文的統計特徵消散在密文中【重複對明文進行置換後再用某個函數作用】。
混淆:使密文和加密密鑰之間的統計關係變得更加複雜【複雜的代替算法】。
Feistel加密和解密
LEi = REi-1
REi = LEi-1 ^ F(REi-1,ki)
等價於:
LEi-1 = RE ^ F(REi-1,Ki) = REi ^ F(LEi,Ki)
REi-1 = LEi

數據加密標準DES(Data Encryption Standard)——對稱加密

DES體現經典的Feistel結構,Feistel結構由許多相同的輪函數組成,在每一輪中,對輸入數據的一半進行代替,接着用一個置換來交換數據的兩個等分部分——可以用這種方法將初始密鑰擴展出不同的子密鑰。

可逆變換:2n個不同的明文分組,每一個明文分組將唯一對應一個密文分組,可解密。
如果n充分大,那明文的統計特徵將被覆蓋,密鑰規模是n×2n

Feistel密碼的解密算法與加密算法是相同的,只是子密鑰的使用次序相反。

DES對差分分析和線性分析都有很強的免疫力。
在這裏插入圖片描述
置換表的含義:把二進制序列的每一位,替換爲置換表對應位的二進制碼。

輸入測試實例:
明文:0x31 0x31 0x31 0x31 0x31 0x31 0x31 0x31
密鑰:0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30
可知明文二進制:

00110001 00110001 00110001 00110001 00110001 00110001 00110001 00110001

密鑰二進制:

00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110000

DES算法的實現過程之密鑰的產生
1、64密鑰經過壓縮置換選擇PC1作用後得56位(排除第8,16,24,32,40,48,56,64的校驗位)。
壓縮置換選擇PC1
密鑰進行PC1壓縮置換後的結果:

0000000 0000000 0011111 1111111 0000000 0000000 0000000 0001111

2、分爲左右各28位得兩部分,分別進行循環移位,每輪的置換函數相同,由於循環移位使獲得的子密鑰有所不同。
移位數組
子密鑰生成過程中,左邊生成的值:

C[0]: 0000000 0000000 0011111 1111111
C[1]: 0000000 0000000 0111111 1111110
C[2]: 0000000 0000000 1111111 1111100
C[3]: 0000000 0000011 1111111 1110000
C[4]: 0000000 0001111 1111111 1000000
C[5]: 0000000 0111111 1111110 0000000
C[6]: 0000001 1111111 1111000 0000000
C[7]: 0000111 1111111 1100000 0000000
C[8]: 0011111 1111111 0000000 0000000
C[9]: 0111111 1111110 0000000 0000000
C[10]: 1111111 1111000 0000000 0000001
C[11]: 1111111 1100000 0000000 0000111
C[12]: 1111111 0000000 0000000 0011111
C[13]: 1111100 0000000 0000000 1111111
C[14]: 1110000 0000000 0000011 1111111
C[15]: 1000000 0000000 0001111 1111111
C[16]: 0000000 0000000 0011111 1111111

子密鑰生成過程中,右邊生成的值:

D[0]: 0000000 0000000 0000000 0001111
D[1]: 0000000 0000000 0000000 0011110
D[2]: 0000000 0000000 0000000 0111100
D[3]: 0000000 0000000 0000001 1110000
D[4]: 0000000 0000000 0000111 1000000
D[5]: 0000000 0000000 0011110 0000000
D[6]: 0000000 0000000 1111000 0000000
D[7]: 0000000 0000011 1100000 0000000
D[8]: 0000000 0001111 0000000 0000000
D[9]: 0000000 0011110 0000000 0000000
D[10]: 0000000 1111000 0000000 0000000
D[11]: 0000011 1100000 0000000 0000000
D[12]: 0001111 0000000 0000000 0000000
D[13]: 0111100 0000000 0000000 0000000
D[14]: 1110000 0000000 0000000 0000001
D[15]: 1000000 0000000 0000000 0000111
D[16]: 0000000 0000000 0000000 0001111

3、56位的密鑰進行壓縮置換選擇PC2得48位,至此得Ki,以此循環16次可以得到16組不同的子密鑰。
DES明文分組長度爲64位,密鑰長度爲56位,得到64位的輸出。

16輪子密鑰如下【48】:

子密鑰K[0] 01010000 00101100 10101100 01000100 00000000 01000000 01010000
子密鑰K[1] 01010000 10101100 10100100 01000000 10000000 01000000 11010000
子密鑰K[2] 11010000 10101100 00100110 01000000 10000100 00001000 11100000
子密鑰K[3] 11100000 10100110 00100110 00001000 00010100 00001000 11100000
子密鑰K[4] 11100000 10010110 00100110 00001000 01010000 00100000 11100000
子密鑰K[5] 11100000 10010010 01110010 00000000 01001000 00100000 10100100
子密鑰K[6] 10100100 11010010 01110010 10000000 00001000 00010000 10100110
子密鑰K[7] 10100110 01010011 01010010 10000001 00000010 00010000 00100110
子密鑰K[8] 00100110 01010011 01010011 10000001 00000010 00000000 00101111
子密鑰K[9] 00101111 01010001 01010001 00010000 00000010 00000100 00001111
子密鑰K[10] 00001111 01000001 11011001 00010000 00000000 10000100 00011111
子密鑰K[11] 00011111 01000001 10011001 00000000 00100000 10000001 00011111
子密鑰K[12] 00011111 00001001 10001001 00100010 00100000 00000001 00011011
子密鑰K[13] 00011011 00101000 10001101 00100010 00000001 00000010 00011001
子密鑰K[14] 00011001 00101100 10001100 00000100 00000001 00000010 01010001
子密鑰K[15] 01010001 00101100 10001100 00000100 00000001 01000000 00000000

DES算法的實現過程之F輪函數——(混淆、非線性、希望有較號的雪崩效應)
1、明文的32位的右半部分用擴展置換(E盒)擴展爲48位【有16位的重複】。
擴展置換(E盒)

第[0]輪E盒擴展: 00000000 00010111 11111110 10000000 00000000 00000000
第[1]輪E盒擴展: 00001111 01010101 00000111 11100101 01101010 00001100
第[2]輪E盒擴展: 01011111 11000000 10101010 10111111 01101010 00000101
第[3]輪E盒擴展: 01111111 11000000 00000010 10100000 01111101 11111101
第[4]輪E盒擴展: 10100000 01101001 10100010 10101010 00000000 11111110
第[5]輪E盒擴展: 01011111 01101011 01010100 00101111 00101010 01010001
第[6]輪E盒擴展: 10111111 01101000 01011101 01001111 01010101 11111010
第[7]輪E盒擴展: 11001010 00000011 11111100 00011111 10010101 11110111
第[8]輪E盒擴展: 11100101 01101000 11110000 00010000 11000010 01011111
第[9]輪E盒擴展: 00111010 01010101 01011001 01000101 11010111 00000000
第[10]輪E盒擴展: 01110000 10000001 10101001 01100000 10010110 01011001
第[11]輪E盒擴展: 11011111 10101010 11110011 11011010 01101001 01010011
第[12]輪E盒擴展: 10101111 10010110 10100000 00110101 11111100 10101110
第[13]輪E盒擴展: 01110000 11101000 00000001 01111111 10010110 11111001
第[14]輪E盒擴展: 11001111 10101010 00000000 00110000 01101011 10101011
第[15]輪E盒擴展: 00001010 10000001 01011011 11101111 01010101 10101100

2、48位的輸出與Ki異或,所得結果再與代替函數(S盒)作用產生32位的輸出。
代替函數由8個S盒組成,每個S盒都有6位輸入,4位輸出。
在這裏插入圖片描述
在這裏插入圖片描述

第[0]次s盒的輸入S盒: 010100 000011 101101 010010 110001 000000 000001 000000
第[1]次s盒的輸入S盒: 010111 111111 100110 100011 101001 011110 101001 001100
第[2]次s盒的輸入S盒: 100011 110110 110010 001100 111111 111110 111000 001101
第[3]次s盒的輸入S盒: 100111 110110 011000 100100 101010 000110 100111 110101
第[4]次s盒的輸入S盒: 010000 001111 111110 000100 101000 100101 000011 011110
第[5]次s盒的輸入S盒: 101111 111111 100100 100110 001011 110110 001001 110001
第[6]次s盒的輸入S盒: 000110 111011 101000 101111 110011 110101 110111 101010
第[7]次s盒的輸入S盒: 011011 000101 000010 101110 100111 101001 011111 100111
第[8]次s盒的輸入S盒: 110000 110011 101110 100011 100100 011100 000001 011111
第[9]次s盒的輸入S盒: 000101 010000 010000 001000 010101 011101 010100 000100
第[10]次s盒的輸入S盒: 011111 111100 000001 110000 011100 001001 011011 011101
第[11]次s盒的輸入S盒: 110000 001110 101101 101010 110110 100100 100111 010010
第[12]次s盒的輸入S盒: 101100 001001 111100 101001 000101 111101 110010 101111
第[13]次s盒的輸入S盒: 011010 111100 000010 001100 010111 011001 011111 111011
第[14]次s盒的輸入S盒: 110101 101000 011010 001100 001101 000110 101010 101001
第[15]次s盒的輸入S盒: 010110 111010 110111 010111 111010 110101 010011 101100
第[0]次s盒的輸出: 1100 0011 0011 1100 0011 0001 0011 1110
第[1]次s盒的輸出: 0011 1010 0100 1001 1101 1111 0011 0100
第[2]次s盒的輸出: 1001 0010 0000 1001 1010 0000 0110 0101
第[3]次s盒的輸出: 0010 1111 1110 1010 0010 1000 1111 1101
第[4]次s盒的輸出: 1111 0100 1000 1011 0101 1111 1000 1001
第[5]次s盒的輸出: 1000 0010 1101 1111 1110 0111 1111 1001
第[6]次s盒的輸出: 0111 1001 0001 0000 1111 0011 1001 1000
第[7]次s盒的輸出: 1111 0110 0000 1111 0001 0101 1101 0010
第[8]次s盒的輸出: 0101 0100 0000 1101 0111 1001 0110 0111
第[9]次s盒的輸出: 0001 0101 1000 1000 1111 0001 1111 1100
第[10]次s盒的輸出: 0111 1001 0100 0000 0111 1010 0100 1111
第[11]次s盒的輸出: 0011 1110 0111 1110 1010 0010 0000 0111
第[12]次s盒的輸出: 0010 0110 1011 1001 1101 1111 1000 1001
第[13]次s盒的輸出: 1100 0110 0001 1001 0011 0110 0000 0111
第[14]次s盒的輸出: 1011 1001 1001 1111 0001 1011 0001 1011
第[15]次s盒的輸出: 0110 1101 1000 0010 0110 1100 1101 1101解

3、用置換函數P進行置換。
置換函數(P)

第0次P置換輸出: 01101110 10000010 11110100 11100100
第1次P置換輸出: 11110011 00101101 00100110 01101010
第2次P置換輸出: 11000001 10010000 00001100 11100010
第3次P置換輸出: 01011010 01011001 01001111 11110101
第4次P置換輸出: 10111000 11100100 10101011 01011011
第5次P置換輸出: 11001111 11110101 00111101 11001001
第6次P置換輸出: 00101111 00101100 11100010 10000011
第7次P置換輸出: 11100010 11010010 10110010 01011011
第8次P置換輸出: 10110000 00010110 10111100 11110010
第9次P置換輸出: 00101011 00010100 01100101 11110011
第10次P置換輸出: 00111000 00111111 11001010 10100010
第11次P置換輸出: 01000101 01101011 00011010 11110110
第12次P置換輸出: 11111101 00100100 00101011 01011101
第13次P置換輸出: 11100100 10100010 10001000 11111000
第14次P置換輸出: 10111110 11101010 01111011 01000010
第15次P置換輸出: 00011010 01011100 11001011 10111001
F[0]的輸出結果: 01101110 10000010 11110100 11100100
F[1]的輸出結果: 11110011 00101101 00100110 01101010
F[2]的輸出結果: 11000001 10010000 00001100 11100010
F[3]的輸出結果: 01011010 01011001 01001111 11110101
F[4]的輸出結果: 10111000 11100100 10101011 01011011
F[5]的輸出結果: 11001111 11110101 00111101 11001001
F[6]的輸出結果: 00101111 00101100 11100010 10000011
F[7]的輸出結果: 11100010 11010010 10110010 01011011
F[8]的輸出結果: 10110000 00010110 10111100 11110010
F[9]的輸出結果: 00101011 00010100 01100101 11110011
F[10]的輸出結果: 00111000 00111111 11001010 10100010
F[11]的輸出結果: 01000101 01101011 00011010 11110110
F[12]的輸出結果: 11111101 00100100 00101011 01011101
F[13]的輸出結果: 11100100 10100010 10001000 11111000
F[14]的輸出結果: 10111110 11101010 01111011 01000010
F[15]的輸出結果: 00011010 01011100 11001011 10111001

DES算法的實現過程之明文轉密文
1、明文經過初始置換(IP)而被重新排列;
初始置換(IP)
初始置換後的明文序列:

 00000000 11111111 00000000 11111111 00000000 11111111 00000000 00000000

2、16輪的置換和替代,左半部分和右半部分互換產生預輸出。

左[32]: 00000000 11111111 00000000 00000000
右[32]: 00011010 10100011 11001011 01000110
左[32]: 00011010 10100011 11001011 01000110
右[32]: 10111110 00010101 01111011 01000010
左[32]: 10111110 00010101 01111011 01000010
右[32]: 11111110 00000001 01000011 10111110
左[32]: 11111110 00000001 01000011 10111110
右[32]: 01000011 00110001 01010000 00011111
左[32]: 01000011 00110001 01010000 00011111
右[32]: 10111011 01101010 01011001 01001000
左[32]: 10111011 01101010 01011001 01001000
右[32]: 01111011 00001110 10011010 10111101
左[32]: 01111011 00001110 10011010 10111101
右[32]: 10010000 01111110 00111100 10111011
左[32]: 10010000 01111110 00111100 10111011
右[32]: 11001011 00011000 00100110 01001111
左[32]: 11001011 00011000 00100110 01001111
右[32]: 01110010 10101100 10001110 11100000
左[32]: 01110010 10101100 10001110 11100000
右[32]: 11100100 00110100 11000100 11001100
左[32]: 11100100 00110100 11000100 11001100
右[32]: 10111101 01011001 10110011 00101001
左[32]: 10111101 01011001 10110011 00101001
右[32]: 01011100 11010000 01101111 10010111
左[32]: 01011100 11010000 01101111 10010111
右[32]: 11100111 00000000 11111100 11011100
左[32]: 11100111 00000000 11111100 11011100
右[32]: 10011101 01000000 01100011 01110101
左[32]: 10011101 01000000 01100011 01110101
右[32]: 00010100 00101101 11011010 10110110
左[32]: 00010100 00101101 11011010 10110110
右[32]: 11110011 11000010 10010111 10010001

3、16輪迭代後的預輸出與互逆置換IP-1產生64位的密文。
逆初始置換後的明文序列:

01100101 01011110 10100110 00101000 11001111 01100010 01011000 01011111
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章