DES的加密與解密演算法(Python實現)
DES的加密與解密演算法(Python實現)
密碼學實驗 : 實現了DES的簡單的加密和解密演算法,DES演算法的相關資料網上很多,這裡不再贅述,僅僅貼出原始碼給大家分享,原始碼中包含很多漢字註釋,相信大家都是可以讀懂的。
為了方便閱讀和理解DES演算法的原理,這裡我將程式碼進行了模組化,分為了四個模組:金鑰生成模組、F函式模組、DES加密模組、DES解密模組。
注:DES的加密演算法和解密演算法幾乎是一模一樣的,僅僅是金鑰的使用順序不同,所以模組的程式碼也幾乎沒有什麼區別。輸入輸出要求是16個十六進位制的字元,剛好是64bit!
轉載請註明出處:https://www.cnblogs.com/wangyanzhong123/p/10575739.html
金鑰生成模組:
1 MaxTime = 16 2#生成子金鑰的置換表1,將64位的金鑰轉換為56位 3 key_table1=[ 57, 49, 41, 33, 25, 17,9, 41, 58, 50, 42, 34, 26, 18, 510,2, 59, 51, 43, 35, 27, 619, 11,3, 60, 52, 44, 36, 763, 55, 47, 39, 31, 23, 15, 87, 62, 54, 46, 38, 30, 22, 914,6, 61, 53, 45, 37, 29, 1021, 13,5, 28, 20, 12,4 ] 11#生成子金鑰的置換表2,將56位的金鑰轉換為48位 12 key_table2=[ 14, 17, 11, 24,1,5, 133, 28, 15,6, 21, 10, 1423, 19, 12,4, 26,8, 1516,7, 27, 20, 13,2, 1641, 52, 31, 37, 47, 55, 1730, 40, 51, 45, 33, 48, 1844, 49, 39, 56, 34, 53, 1946, 42, 50, 36, 29, 32 ] 20 21 def Listmove(l, step):#將列表中的元素迴圈左移 22return l[step:] + l[:step] 23 24 def Subkey(key):#生成子金鑰 25keyresult = [] 26key0 = [0 for i in range(56)] 27 28for i in range(len(key_table1)): 29key0[i] = key[key_table1[i]-1] 30 31#生成16個金鑰 32for i in range(MaxTime): 33key1 = [0 for i in range(48)] 34#確定每次左移的步數 35if (i == 0 or i == 1 or i == 8 or i == 15): 36step = 1 37else: 38step = 2 39#分成兩組 40tmp1 = key0[0:28] 41tmp2 = key0[28:56] 42#迴圈左移 43tmp1 = Listmove(tmp1, step) 44tmp2 = Listmove(tmp2, step) 45#左右連線 46key0 = tmp1 + tmp2 47#置換選擇 48for i in range(len(key_table2)): 49key1[i] = key0[key_table2[i]-1] 50#生成金鑰 51keyresult.append(key1) 52#返回的是一個集合包含了每次的金鑰 53return keyresult
F函式模組:
1 MaxTime = 16 2 #IP置換表 3 IP_table=[58, 50, 42, 34, 26, 18, 10, 2, 460, 52, 44, 36, 28, 20, 12, 4, 562, 54, 46, 38, 30, 22, 14, 6, 664, 56, 48, 40, 32, 24, 16, 8, 757, 49, 41, 33, 25, 17,9, 1, 859, 51, 43, 35, 27, 19, 11, 3, 961, 53, 45, 37, 29, 21, 13, 5, 1063, 55, 47, 39, 31, 23, 15, 7 ] 11 #逆IP置換表 12 Inv_IP_table=[40,8, 48, 16, 56, 24, 64, 32, 1339,7, 47, 15, 55, 23, 63, 31, 1438,6, 46, 14, 54, 22, 62, 30, 1537,5, 45, 13, 53, 21, 61, 29, 1636,4, 44, 12, 52, 20, 60, 28, 1735,3, 43, 11, 51, 19, 59, 27, 1834,2, 42, 10, 50, 18, 58, 26, 1933,1, 41,9, 49, 17, 57, 25 ] 20 #S盒中的S1盒 21 S1=[14,4, 13,1,2, 15, 11,8,3, 10,6, 12,5,9,0,7, 220, 15,7,4, 14,2, 13,1, 10,6, 12, 11,9,5,3,8, 234,1, 14,8, 13,6,2, 11, 15, 12,9,7,3, 10,5,0, 2415, 12,8,2,4,9,1,7,5, 11,3, 14, 10,0,6, 13 ] 25 #S盒中的S2盒 26 S2=[15,1,8, 14,6, 11,3,4,9,7,2, 13, 12,0,5, 10, 273, 13,4,7, 15,2,8, 14, 12,0,1, 10,6,9, 11,5, 280, 14,7, 11, 10,4, 13,1,5,8, 12,6,9,3,2, 15, 2913,8, 10,1,3, 15,4,2, 11,6,7, 12,0,5, 14,9 ] 30 #S盒中的S3盒 31 S3=[10,0,9, 14,6,3, 15,5,1, 13, 12,7, 11,4,2,8, 3213,7,0,9,3,4,6, 10,2,8,5, 14, 12, 11, 15,1, 3313,6,4,9,8, 15,3,0, 11,1,2, 12,5, 10, 14,7, 341, 10, 13,0,6,9,8,7,4, 15, 14,3, 11,5,2, 12 ] 35 #S盒中的S4盒 36 S4=[ 7, 13, 14,3,0,6,9, 10,1,2,8,5, 11, 12,4, 15, 3713,8, 11,5,6, 15,0,3,4,7,2, 12,1, 10, 14,9, 3810,6,9,0, 12, 11,7, 13, 15,1,3, 14,5,2,8,4, 393, 15,0,6, 10,1, 13,8,9,4,5, 11, 12,7,2, 14 ] 40 #S盒中的S5盒 41 S5=[ 2, 12,4,1,7, 10, 11,6,8,5,3, 15, 13,0, 14,9, 4214, 11,2, 12,4,7, 13,1,5,0, 15, 10,3,9,8,6, 434,2,1, 11, 10, 13,7,8, 15,9, 12,5,6,3,0, 14, 4411,8, 12,7,1, 14,2, 13,6, 15,0,9, 10,4,5,3 ] 45 #S盒中的S6盒 46 S6=[12,1, 10, 15,9,2,6,8,0, 13,3,4, 14,7,5, 11, 4710, 15,4,2,7, 12,9,5,6,1, 13, 14,0, 11,3,8, 489, 14, 15,5,2,8, 12,3,7,0,4, 10,1, 13, 11,6, 494,3,2, 12,9,5, 15, 10, 11, 14,1,7,6,0,8, 13 ] 50 #S盒中的S7盒 51 S7=[ 4, 11,2, 14, 15,0,8, 13,3, 12,9,7,5, 10,6,1, 5213,0, 11,7,4,9,1, 10, 14,3,5, 12,2, 15,8,6, 531,4, 11, 13, 12,3,7, 14, 10, 15,6,8,0,5,9,2, 546, 11, 13,8,1,4, 10,7,9,5,0, 15, 14,2,3, 12] 55 #S盒中的S8盒 56 S8=[13,2,8,4,6, 15, 11,1, 10,9,3, 14,5,0, 12,7, 571, 15, 13,8, 10,3,7,4, 12,5,6, 11,0, 14,9,2, 587, 11,4,1,9, 12, 14,2,0,6, 10, 13, 15,3,5,8, 592,1, 14,7,4, 10,8, 13, 15, 12,9,0,3,5,6, 11 ] 60 # S盒 61 S=[S1,S2,S3,S4,S5,S6,S7,S8] 62 #用於對資料進行擴充套件置換,將32bit資料擴充套件為48bit 63 extend_table=[32,1,2,3,4,5, 644,5,6,7,8,9, 658,9, 10, 11, 12, 13, 6612, 13, 14, 15, 16, 17, 6716, 17, 18, 19, 20, 21, 6820, 21, 22, 23, 24, 25, 6924, 25, 26, 27, 28, 29, 7028, 29, 30, 31, 32,1 ] 71 #P盒 72 P_table=[ 16,7, 20, 21, 29, 12, 28, 17, 731, 15, 23, 26,5, 18, 31, 10, 742,8, 24, 14, 32, 27,3,9, 7519, 13, 30,6, 22, 11,4, 25 ] 76 77 def int2bit(n):#0~15整數轉位元 78a=[] 79for i in range(0,4): 80a.insert(0,str(n%2)) 81n=int(n/2) 82return a 83 84 #IP置換部分,op為0表示正置換,op為1表示逆置換 85 def IP(text, op): 86tmp = [0 for i in range(64)] 87if op == 0: 88for i in range(64): 89tmp[i] = text[IP_table[i]-1] 90return tmp 91if op == 1: 92for i in range(64): 93tmp[i] = text[Inv_IP_table[i]-1] 94return tmp 95 #進行擴充套件,將32位擴充套件為48位 96 def Extend(text): 97extend = [0 for i in range(48)] 98for i in range(48): 99extend[i] = text[extend_table[i] - 1] 100return extend 101 102 #S盒變換部分 103 def S_replace(text): 104Sresult = [0 for k in range(32)] 105for k in range(8): 106row = 2*int(text[k*6]) + int(text[k*6+5]) 107column = 8*int(text[k*6+1]) + 4*int(text[k*6+2]) + 2*int(text[k*6+3]) + int(text[k*6+4]) 108tmp = S[k][row*16+column] 109 110for i in range(4): 111Sresult[4*k + i] = int2bit(tmp)[i] 112return Sresult 113 #P置換部分 114 def P_replace(text): 115Presult = [0 for i in range(32)] 116for i in range(32): 117Presult[i] = text[P_table[i]-1] 118return Presult 119 #異或運算 120 def Xor(bit1, bit2): 121Xorresult = [0 for i in range(len(bit1))] 122for i in range(len(bit1)): 123Xorresult[i] = str(int(bit1[i]) ^ int(bit2[i])) 124return Xorresult
DES加密模組:
1 import CreateSubkey as cs 2 import F_function as f 3 #十六進位制轉二進位制位元串 4 def Hex2bin(text): 5result = [] 6for i in range(len(text)): 7result.extend(f.int2bit(int(text[i],16))) 8return result 9 #二進位制位元串轉十六進位制 10 def bin2Hex(text): 11result = [] 12q = len(text)//4 13for i in range(q): 14dec = int(text[4*i])*8 + int(text[4*i+1])*4 + int(text[4*i+2])*2 + int(text[4*i+3])*1 15x = hex(dec)[2:].upper() 16result.extend(x) 17rs = ''.join(result) 18return rs 19 #按照DES演算法的流程圖進行運算 20 def Encryption(text, key): 21keylist = cs.Subkey(keybit) 22text1 = f.IP(text, 0)#IP置換 23L = [text1[i] for i in range(32)] 24R = [text1[i] for i in range(32,64)] 25for i in range(16): 26tmp = R 27tmp = f.Extend(tmp) 28tmp = f.Xor(tmp, keylist[i]) 29tmp = f.S_replace(tmp) 30tmp = f.P_replace(tmp) 31tmp = f.Xor(tmp, L) 32L = R 33R = tmp 34L,R = R,L 35ctext = L 36ctext.extend(R) 37ctext = f.IP(ctext, 1) 38return bin2Hex(ctext) 39 40 if __name__ == '__main__': 41plaintext = input('請輸入用十六進位制表示的明文:') 42key = input('請輸入用十六進位制表示的金鑰:') 43ptext = Hex2bin(plaintext) 44keybit = Hex2bin(key) 45print('輸出的密文為:' + Encryption(ptext, keybit))
DES解密模組:
1 import CreateSubkey as cs 2 import F_function as f 3 #十六進位制轉二進位制位元串 4 def Hex2bin(text): 5result = [] 6for i in range(len(text)): 7result.extend(f.int2bit(int(text[i],16))) 8return result 9 #二進位制位元串轉十六進位制 10 def bin2Hex(text): 11result = [] 12q = len(text)//4 13for i in range(q): 14dec = int(text[4*i])*8 + int(text[4*i+1])*4 + int(text[4*i+2])*2 + int(text[4*i+3])*1 15x = hex(dec)[2:].upper() 16result.extend(x) 17rs = ''.join(result) 18return rs 19 20 def Encryption(text, key): 21keylist = cs.Subkey(keybit) 22text1 = f.IP(text, 0)#IP置換 23L = [text1[i] for i in range(32)] 24R = [text1[i] for i in range(32,64)] 25for i in range(16): 26tmp = R 27tmp = f.Extend(tmp) 28tmp = f.Xor(tmp, keylist[15-i]) 29tmp = f.S_replace(tmp) 30tmp = f.P_replace(tmp) 31tmp = f.Xor(tmp, L) 32L = R 33R = tmp 34L,R = R,L 35ctext = L 36ctext.extend(R) 37ctext = f.IP(ctext, 1) 38return bin2Hex(ctext) 39 40 if __name__ == '__main__': 41plaintext = input('請輸入用十六進位制表示的密文:') 42key = input('請輸入用十六進位制表示的金鑰:') 43ptext = Hex2bin(plaintext) 44keybit = Hex2bin(key) 45print('輸出的明文為:' + Encryption(ptext, keybit))