1 # -*- coding: UTF-8 -*- 2 from Tkinter import * 3 from tkMessageBox import * 4 5 ip = [ 6 58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4, 7 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8, 8 57,49,41,33,25,17, 9,1,59,51,43,35,27,19,11,3, 9 61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7, 10 ] 11 ip_1 = [ 12 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31, 13 38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29, 14 36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27, 15 34,2,42,10,50,18,58,26,33,1,41, 9,49,17,57,25, 16 ] 17 e = [ 18 32, 1, 2, 3, 4, 5, 19 4 , 5, 6, 7, 8, 9, 20 8 , 9,10,11,12,13, 21 12,13,14,15,16,17, 22 16,17,18,19,20,21, 23 20,21,22,23,24,25, 24 24,25,26,27,28,29, 25 28,29,30,31,32, 1, 26 ] 27 p = [ 28 16, 7,20,21,29,12,28,17, 29 1 ,15,23,26, 5,18,31,10, 30 2 ,8 ,24,14,32,27, 3, 9, 31 19,13,30, 6,22,11, 4,25, 32 ] 33 sbox = [ 34 [ 35 [0xe,0x4,0xd,0x1,0x2,0xf,0xb,0x8,0x3,0xa,0x6,0xc,0x5,0x9,0x0,0x7], 36 [0x0,0xf,0x7,0x4,0xe,0x2,0xd,0x1,0xa,0x6,0xc,0xb,0x9,0x5,0x3,0x8], 37 [0x4,0x1,0xe,0x8,0xd,0x6,0x2,0xb,0xf,0xc,0x9,0x7,0x3,0xa,0x5,0x0], 38 [0xf,0xc,0x8,0x2,0x4,0x9,0x1,0x7,0x5,0xb,0x3,0xe,0xa,0x0,0x6,0xd] 39 ], 40 [ 41 [0xf,0x1,0x8,0xe,0x6,0xb,0x3,0x4,0x9,0x7,0x2,0xd,0xc,0x0,0x5,0xa], 42 [0x3,0xd,0x4,0x7,0xf,0x2,0x8,0xe,0xc,0x0,0x1,0xa,0x6,0x9,0xb,0x5], 43 [0x0,0xe,0x7,0xb,0xa,0x4,0xd,0x1,0x5,0x8,0xc,0x6,0x9,0x3,0x2,0xf], 44 [0xd,0x8,0xa,0x1,0x3,0xf,0x4,0x2,0xb,0x6,0x7,0xc,0x0,0x5,0xe,0x9] 45 ], 46 [ 47 [0xa,0x0,0x9,0xe,0x6,0x3,0xf,0x5,0x1,0xd,0xc,0x7,0xb,0x4,0x2,0x8], 48 [0xd,0x7,0x0,0x9,0x3,0x4,0x6,0xa,0x2,0x8,0x5,0xe,0xc,0xb,0xf,0x1], 49 [0xd,0x6,0x4,0x9,0x8,0xf,0x3,0x0,0xb,0x1,0x2,0xc,0x5,0xa,0xe,0x7], 50 [0x1,0xa,0xd,0x0,0x6,0x9,0x8,0x7,0x4,0xf,0xe,0x3,0xb,0x5,0x2,0xc] 51 ], 52 [ 53 [0x7,0xd,0xe,0x3,0x0,0x6,0x9,0xa,0x1,0x2,0x8,0x5,0xb,0xc,0x4,0xf], 54 [0xd,0x8,0xb,0x5,0x6,0xf,0x0,0x3,0x4,0x7,0x2,0xc,0x1,0xa,0xe,0x9], 55 [0xa,0x6,0x9,0x0,0xc,0xb,0x7,0xd,0xf,0x1,0x3,0xe,0x5,0x2,0x8,0x4], 56 [0x3,0xf,0x0,0x6,0xa,0x1,0xd,0x8,0x9,0x4,0x5,0xb,0xc,0x7,0x2,0xe] 57 ], 58 [ 59 [0x2,0xc,0x4,0x1,0x7,0xa,0xb,0x6,0x8,0x5,0x3,0xf,0xd,0x0,0xe,0x9], 60 [0xe,0xb,0x2,0xc,0x4,0x7,0xd,0x1,0x5,0x0,0xf,0xa,0x3,0x9,0x8,0x6], 61 [0x4,0x2,0x1,0xb,0xa,0xd,0x7,0x8,0xf,0x9,0xc,0x5,0x6,0x3,0x0,0xe], 62 [0xb,0x8,0xc,0x7,0x1,0xe,0x2,0xd,0x6,0xf,0x0,0x9,0xa,0x4,0x5,0x3] 63 ], 64 [ 65 [0xc,0x1,0xa,0xf,0x9,0x2,0x6,0x8,0x0,0xd,0x3,0x4,0xe,0x7,0x5,0xb], 66 [0xa,0xf,0x4,0x2,0x7,0xc,0x9,0x5,0x6,0x1,0xd,0xe,0x0,0xb,0x3,0x8], 67 [0x9,0xe,0xf,0x5,0x2,0x8,0xc,0x3,0x7,0x0,0x4,0xa,0x1,0xd,0xb,0x6], 68 [0x4,0x3,0x2,0xc,0x9,0x5,0xf,0xa,0xb,0xe,0x1,0x7,0x6,0x0,0x8,0xd] 69 ], 70 [ 71 [0x4,0xb,0x2,0xe,0xf,0x0,0x8,0xd,0x3,0xc,0x9,0x7,0x5,0xa,0x6,0x1], 72 [0xd,0x0,0xb,0x7,0x4,0x9,0x1,0xa,0xe,0x3,0x5,0xc,0x2,0xf,0x8,0x6], 73 [0x1,0x4,0xb,0xd,0xc,0x3,0x7,0xe,0xa,0xf,0x6,0x8,0x0,0x5,0x9,0x2], 74 [0x6,0xb,0xd,0x8,0x1,0x4,0xa,0x7,0x9,0x5,0x0,0xf,0xe,0x2,0x3,0xc] 75 ], 76 [ 77 [0xd,0x2,0x8,0x4,0x6,0xf,0xb,0x1,0xa,0x9,0x3,0xe,0x5,0x0,0xc,0x7], 78 [0x1,0xf,0xd,0x8,0xa,0x3,0x7,0x4,0xc,0x5,0x6,0xb,0x0,0xe,0x9,0x2], 79 [0x7,0xb,0x4,0x1,0x9,0xc,0xe,0x2,0x0,0x6,0xa,0xd,0xf,0x3,0x5,0x8], 80 [0x2,0x1,0xe,0x7,0x4,0xa,0x8,0xd,0xf,0xc,0x9,0x0,0x3,0x5,0x6,0xb] 81 ] 82 ] 83 hex_bin = { 84 0x0:'0000',0x1:'0001',0x2:'0010',0x3:'0011', 85 0x4:'0100',0x5:'0101',0x6:'0110',0x7:'0111', 86 0x8:'1000',0x9:'1001',0xa:'1010',0xb:'1011', 87 0xc:'1100',0xd:'1101',0xe:'1110',0xf:'1111' 88 } 89 bin_hex = { 90 '0000':'0','0001':'1','0010':'2','0011':'3', 91 '0100':'4','0101':'5','0110':'6','0111':'7', 92 '1000':'8','1001':'9','1010':'A','1011':'B', 93 '1100':'C','1101':'D','1110':'E','1111':'F' 94 } 95 hex_s = { 96 '0':'0000','1':'0001','2':'0010','3':'0011', 97 '4':'0100','5':'0101','6':'0110','7':'0111', 98 '8':'1000','9':'1001','A':'1010','B':'1011', 99 'C':'1100','D':'1101','E':'1110','F':'1111' 100 } 101 #生成子密钥 102 def Rkey(cipherkey): 103 pc_1 = [ 104 57,49,41,33,25,17, 9, 105 1 ,58,50,42,34,26,18, 106 10, 2,59,51,43,35,27, 107 19,11, 3,60,52,44,36, 108 63,55,47,39,31,23,15, 109 7 ,62,54,46,38,30,22, 110 14, 6,61,53,45,37,29, 111 21,13, 5,28,20,12, 4 112 ] 113 pc_2 = [ 114 14,17,11,24, 1, 5, 3,28, 115 15, 6,21,10,23,19,12, 4, 116 26, 8,16, 7,27,20,13, 2, 117 41,52,31,37,47,55,30,40, 118 51,45,33,48,44,49,39,56, 119 34,53,46,42,50,36,29,32 120 ] 121 pc = [ 122 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 123 ] 124 125 k0 = [] 126 s = cipherkey 127 for i in range(8): 128 k0.append(s[i]) 129 for i in range(len(k0)): 130 k0[i] = bin(int(hex(ord(k0[i])),16))[2:] 131 k = '' 132 for i in range(len(k0)): 133 if len(k0[i]) != 8: 134 k0[i] = (8-len(k0[i]))*'0' + k0[i] 135 k = k+k0[i] 136 k1='' 137 for i in range(56): 138 k1 = k1 +k[pc_1[i]-1] 139 c0 = k1[0:28] 140 d0 = k1[28:] 141 c = [] 142 d = [] 143 for i in range(16): 144 if i == 0: 145 c.append(c0[pc[i]:]+c0[i]) 146 d.append(d0[pc[i]:]+d0[i]) 147 else: 148 c.append(c[i-1][pc[i]:]+c[i-1][0:pc[i]]) 149 d.append(d[i-1][pc[i]:]+d[i-1][0:pc[i]]) 150 K_0 = [] #进行pc_2置换并存到列表K_1中 151 K_1 = [] 152 for i in range(16): 153 K_0.append(c[i]+d[i]) 154 for i in range(16): 155 s = '' 156 for j in range(48): 157 s = s + K_0[i][pc_2[j]-1] 158 K_1.append(s) 159 return K_1 160 #F函数 161 def des_F(R,Ki): 162 R1 = '' 163 for i in range(48): 164 R1 = R1 + R[e[i]-1] 165 #print R1 166 R2 = '' 167 for i in range(48): 168 if R1[i] == Ki[i]: 169 s = '0' 170 else: 171 s = '1' 172 R2 = R2 + s 173 R3 = [] 174 S = [0,6,12,18,24,30,36,42] 175 for i in S: 176 R3.append(R2[i:(i+6)]) 177 S1 = '' 178 for i in range(8): 179 row = int((R3[i][0]+R3[i][5]),2) #hang 180 col = int((R3[i][1:5]),2) #lie 181 l = sbox[i][row][col] 182 183 S1 = S1 + hex_bin[l] 184 S2 = '' 185 for i in range(32): 186 S2 = S2 +S1[p[i]-1] 187 return S2 188 189 #加密 190 191 def des_Encode(cleartext,cipherkey): 192 K = Rkey(cipherkey) 193 s = str(cleartext) 194 s0 = [] 195 for i in range(len(s)): 196 s0.append(bin(int(hex(ord(s[i])),16))[2:]) 197 if len(s0) != 8: 198 for i in range((8 - len(s0))): 199 s0.append('00000000') 200 s1 = '' 201 for i in range(8): 202 if len(s0[i]) != 8: 203 s0[i] = (8-len(s0[i]))*'0' + s0[i] 204 s1 = s1 + s0[i] 205 #初始置换 206 s2 = '' 207 for i in range(64): 208 s2 = s2 + s1[ip[i]-1] 209 210 L0 = s2[0:32] 211 R0 = s2[32:] 212 L = [] 213 R = [] 214 for i in range(16): 215 if i == 0: 216 L.append(L0) 217 R.append(R0) 218 else: 219 Li = R[i-1] 220 ans = des_F(R[i-1],K[i-1]) 221 Ri = '' 222 for j in range(32): 223 if L[i-1][j] == ans[j]: 224 ss = '0' 225 else: 226 ss = '1' 227 Ri = Ri + ss 228 L.append(Li) 229 R.append(Ri) 230 ans1 = des_F(R[15],K[15]) 231 L_15 = R[14] 232 L_16 = '' 233 #异或 234 for i in range(32): 235 if L_15[i] == ans1[i]: 236 tt = '0' 237 else: 238 tt = '1' 239 L_16 = L_16 + tt 240 R_16 = R[15] 241 C = '' 242 xx =L_16+R_16 243 #逆初始置换 244 for i in range(64): 245 C = C +(xx)[ip_1[i]-1] 246 #转换为16进制 247 binhex = [0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60] 248 binbox = [] 249 for i in binhex: 250 binbox.append(C[i:(i+4)]) 251 C_hex = '' 252 for i in range(16): 253 C_hex = C_hex + str(bin_hex[binbox[i]]) 254 255 return C_hex 256 #解密 257 def des_Decode(ciphertext,cipherkey): 258 text = ciphertext 259 K_l = Rkey(cipherkey) 260 K_list =[] 261 for i in range(16): 262 K_list.append(K_l[15-i]) 263 264 text1 = '' 265 for i in text: 266 text1 = text1 + hex_s[i] 267 text2 = '' 268 for i in range(64): 269 text2 = text2 + text1[ip[i]-1] 270 L0 = text2[0:32] 271 R0 = text2[32:] 272 L = [] 273 R = [] 274 for i in range(16): 275 if i == 0: 276 L.append(L0) 277 R.append(R0) 278 else: 279 L_next = R[i-1] 280 R_1 = des_F(R[i-1],K_list[i-1]) 281 R_next = '' 282 for j in range(32): 283 if L[i-1][j] == R_1[j]: 284 s = '0' 285 else: 286 s = '1' 287 R_next = R_next +s 288 L.append(L_next) 289 R.append(R_next) 290 L16 = '' 291 ans2 = des_F(R[15],K_list[15]) 292 for i in range(32): 293 if L[15][i] == ans2[i]: 294 ss = '0' 295 else: 296 ss = '1' 297 L16 = L16 + ss 298 R16 = R[15] 299 L_R = L16 + R16 300 m_bin = '' 301 for i in range (64): 302 m_bin = m_bin + L_R[ip_1[i]-1] 303 bin_list = [0,8,16,24,32,40,48,56] 304 asc_list = [] 305 for i in bin_list: 306 asc_list.append(int(m_bin[i:(i+8)],2)) 307 m_string = '' 308 for i in asc_list: 309 m_string = m_string + chr(int(i)) 310 return m_string 311 312 class window(): 313 def __init__(self,top): 314 top.title('Des v1.0') 315 top.geometry('560x380+500+200') 316 #top.iconbitmap('G:/1.ico') 317 top.resizable(0,0) 318 label1 = Label(top,text = ('明 文:').decode('utf-8')) 319 label1.place(x=0,y=4) 320 self.t = StringVar() 321 self.entry1 = Entry(top,width = 80,textvariable = self.t) 322 self.entry1.place(x=70,y=5) 323 label2 = Label(top,text = ('密 钥:').decode('utf-8')) 324 label2.place(x=0,y=32) 325 self.entry2 = Entry(top,width = 80) 326 self.entry2.place(x=70,y=33) 327 self.button1 = Button(top,text = ('加 密').decode('utf-8'),width = 10,height = 1,command = self.Encode_button) 328 self.button1.place(x=70,y=63) 329 self.button2 = Button(top,text = ('解 密').decode('utf-8'),width = 10,height = 1,command = self.Decode_button) 330 self.button2.place(x=160,y=63) 331 self.button3 = Button(top,text = ('显示子密钥').decode('utf-8'),width = 10,height = 1,command = self.Show_key) 332 self.button3.place(x=250,y=63) 333 self.button4 = Button(top,text = ('清空密钥').decode('utf-8'),width = 10,height = 1,command = self.Clear_text) 334 self.button4.place(x=340,y=63) 335 label3 = Label(top,text = ('密 文:').decode('utf-8')) 336 label3.place(x=0,y=93) 337 self.e = StringVar() 338 self.entry3 = Entry(top,width = 80,textvariable=self.e) 339 self.entry3.place(x=70,y=93) 340 label4 = Label(top,text = ('子 密 钥:').decode('utf-8')) 341 label4.place(x=0,y=123) 342 self.text2=Text(top,selectbackground = 'gray',selectforeground = 'red',width = 60) 343 self.text2.place(x=70,y=123) 344 def Encode_button(self): 345 try: 346 clear_text = self.entry1.get() 347 cipher_key = self.entry2.get() 348 text_list = [] 349 if (len(clear_text)/8)*8 != len(clear_text): 350 for i in range((len(clear_text)/8)): 351 text_list.append(clear_text[i*8:(i+1)*8]) 352 text_list.append(clear_text[(len(clear_text)/8)*8:]) 353 else: 354 for i in range((len(clear_text)/8)): 355 text_list.append(clear_text[i*8:(i+1)*8]) 356 ans ='' 357 for i in text_list: 358 ans = ans + des_Encode(i,cipher_key) 359 self.e.set(ans) 360 361 except: 362 showwarning('Warning','Error!') 363 def Show_key(self): 364 try: 365 cipher_key = self.entry2.get() 366 key = Rkey(cipher_key) 367 for i in range(16): 368 self.text2.insert(END,'K'+str(i+1)+': '+key[i]+' ') 369 370 except: 371 showwarning('Warning','Error!') 372 def Clear_text(self): 373 self.text2.delete(1.0,END) 374 def Decode_button(self): 375 try: 376 cipher_text = self.entry3.get() 377 cipher_key = self.entry2.get() 378 mingwen = des_Decode(cipher_text,cipher_key) 379 self.t.set(mingwen) 380 except: 381 showwarning('Warning','Error!') 382 383 top = Tk() 384 window = window(top) 385 top.mainloop()