本文實例講述了python實現DES加密解密方法。分享給大家供大家參考。具體分析如下:
實現功能:加密中文等字符串
密鑰與明文可以不等長
這裡只貼代碼,加密過程可以自己百度,此處python代碼沒有優化
1. desstruct.py DES加密中要使用的結構體
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 ip= (58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9 , 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7) ip_1=(40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25) e =(32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12,13, 12, 13, 14, 15, 16, 17, 16,17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1) p=(16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25) s=[ [[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]], [[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]], [[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]], [[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]], [[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]], [[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]], [[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]], [[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]]] pc1=(57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 33, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4); pc2= (14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32) d = ( 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1)2. des.py 加密文件
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 #_*_ coding:utf-8 _*_ #!/usr/bin/env python #Filename:des.py from desstruct import * import re __all__=['desencode'] class DES(): '''des 加密''' def __init__(self): pass #加密 def code(self,from_code,key,code_len,key_len): output="" trun_len=0 #將密文和密鑰轉換為二進制 code_string=self._functionCharToA(from_code,code_len) code_key=self._functionCharToA(key,key_len) #如果密鑰長度不是16的整數倍則以增加0的方式變為16的整數倍 if code_len%16!=0: real_len=(code_len/16)*16+16 else: real_len=code_len if key_len%16!=0: key_len=(key_len/16)*16+16 key_len*=4 #每個16進制占4位 trun_len=4*real_len #對每64位進行一次加密 for i in range(0,trun_len,64): run_code=code_string[i:i+64] l=i%key_len run_key=code_key[l:l+64] #64位明文、密鑰初始置換 run_code= self._codefirstchange(run_code) run_key= self._keyfirstchange(run_key) #16次迭代 for j in range(16): #取出明文左右32位 code_r=run_code[32:64] code_l=run_code[0:32] #64左右交換 run_code=code_r #右邊32位擴展置換 code_r= self._functionE(code_r) #獲取本輪子密鑰 key_l=run_key[0:28] key_r=run_key[28:56] key_l=key_l[d[j]:28]+key_l[0:d[j]] key_r=key_r[d[j]:28]+key_r[0:d[j]] run_key=key_l+key_r key_y= self._functionKeySecondChange(run_key) #異或 code_r= self._codeyihuo(code_r,key_y) #S盒代替/選擇 code_r= self._functionS(code_r) #P轉換 code_r= self._functionP(code_r) #異或 code_r= self._codeyihuo(code_l,code_r) run_code+=code_r #32互換 code_r=run_code[32:64] code_l=run_code[0:32] run_code=code_r+code_l #將二進制轉換為16進制、逆初始置換 output+=self._functionCodeChange(run_code) return output #異或 def _codeyihuo(self,code,key): code_len=len(key) return_list='' for i in range(code_len): if code[i]==key[i]: return_list+='0' else: return_list+='1' return return_list #密文或明文初始置換 def _codefirstchange(self,code): changed_code='' for i in range(64): changed_code+=code[ip[i]-1] return changed_code #密鑰初始置換 def _keyfirstchange (self,key): changed_key='' for i in range(56): changed_key+=key[pc1[i]-1] return changed_key #逆初始置換 def _functionCodeChange(self, code): lens=len(code)/4 return_list='' for i in range(lens): list='' for j in range(4): list+=code[ip_1[i*4+j]-1] return_list+="%x" %int(list,2) return return_list #擴展置換 def _functionE(self,code): return_list='' for i in range(48): return_list+=code[e[i]-1] return return_list #置換P def _functionP(self,code): return_list='' for i in range(32): return_list+=code[p[i]-1] return return_list #S盒代替選擇置換 def _functionS(self, key): return_list='' for i in range(8): row=int( str(key[i*6])+str(key[i*6+5]),2) raw=int(str( key[i*6+1])+str(key[i*6+2])+str(key[i*6+3])+str(key[i*6+4]),2) return_list+=self._functionTos(s[i][row][raw],4) return return_list #密鑰置換選擇2 def _functionKeySecondChange(self,key): return_list='' for i in range(48): return_list+=key[pc2[i]-1] return return_list #將十六進制轉換為二進制字符串 def _functionCharToA(self,code,lens): return_code='' lens=lens%16 for key in code: code_ord=int(key,16) return_code+=self._functionTos(code_ord,4) if lens!=0: return_code+='0'*(16-lens)*4 return return_code #二進制轉換 def _functionTos(self,o,lens): return_code='' for i in range(lens): return_code=str(o>>i &1)+return_code return return_code #將unicode字符轉換為16進制 def tohex(string): return_string='' for i in string: return_string+="%02x"%ord(i) return return_string def tounicode(string): return_string='' string_len=len(string) for i in range(0,string_len,2): return_string+=chr(int(string[i:i+2],16)) return return_string #入口函數 def desencode(from_code,key): #轉換為16進制 from_code=tohex(from_code) key=tohex(key) des=DES() key_len=len(key) string_len=len(from_code) if string_len<1 or key_len<1: print 'error input' return False key_code= des.code(from_code,key,string_len,key_len) return key_code #測試 if __name__ == '__main__': print desencode('我是12345678劉就是我abcdwfd','0f1571c947劉') #返回密文為: 84148584371a6a1fe99e1da0ce1e34649b88ed15098e8aa4b8eb0bf24885c6583. 解密文件
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 #_*_coding:utf-8_*_ #!/usr/bin/env python #Filename:des.py from desstruct import * import re __all__=['desdecode'] class DES(): '''解密函數,DES加密與解密的方法相差不大 只是在解密的時候所用的子密鑰與加密的子密鑰相反 ''' def __init__(self): pass def decode(self,string,key,key_len,string_len): output="" trun_len=0 num=0 #將密文轉換為二進制 code_string=self._functionCharToA(string,string_len) #獲取字密鑰 code_key=self._getkey(key,key_len) #如果密鑰長度不是16的整數倍則以增加0的方式變為16的整數倍 real_len=(key_len/16)+1 if key_len%16!=0 else key_len/16 trun_len=string_len*4 #對每64位進行一次加密 for i in range(0,trun_len,64): run_code=code_string[i:i+64] run_key=code_key[num%real_len] #64位明文初始置換 run_code= self._codefirstchange(run_code) #16次迭代 for j in range(16): code_r=run_code[32:64] code_l=run_code[0:32] #64左右交換 run_code=code_r #右邊32位擴展置換 code_r= self._functionE(code_r) #獲取本輪子密鑰 key_y=run_key[15-j] #異或 code_r= self._codeyihuo(code_r,key_y) #S盒代替/選擇 code_r= self._functionS(code_r) #P轉換 code_r= self._functionP(code_r) #異或 code_r= self._codeyihuo(code_l,code_r) run_code+=code_r num+=1 #32互換 code_r=run_code[32:64] code_l=run_code[0:32] run_code=code_r+code_l #將二進制轉換為16進制、逆初始置換 output+=self._functionCodeChange(run_code) return output #獲取子密鑰 def _getkey(self,key,key_len): #將密鑰轉換為二進制 code_key=self._functionCharToA(key,key_len) a=['']*16 real_len=(key_len/16)*16+16 if key_len%16!=0 else key_len b=['']*(real_len/16) for i in range(real_len/16): b[i]=a[:] num=0 trun_len=4*key_len for i in range(0,trun_len,64): run_key=code_key[i:i+64] run_key= self._keyfirstchange(run_key) for j in range(16): key_l=run_key[0:28] key_r=run_key[28:56] key_l=key_l[d[j]:28]+key_l[0:d[j]] key_r=key_r[d[j]:28]+key_r[0:d[j]] run_key=key_l+key_r key_y= self._functionKeySecondChange(run_key) b[num][j]=key_y[:] num+=1 return b #異或 def _codeyihuo(self,code,key): code_len=len(key) return_list='' for i in range(code_len): if code[i]==key[i]: return_list+='0' else: return_list+='1' return return_list #密文或明文初始置換 def _codefirstchange(self,code): changed_code='' for i in range(64): changed_code+=code[ip[i]-1] return changed_code #密鑰初始置換 def _keyfirstchange (self,key): changed_key='' for i in range(56): changed_key+=key[pc1[i]-1] return changed_key #逆初始置換 def _functionCodeChange(self, code): return_list='' for i in range(16): list='' for j in range(4): list+=code[ip_1[i*4+j]-1] return_list+="%x" %int(list,2) return return_list #擴展置換 def _functionE(self,code): return_list='' for i in range(48): return_list+=code[e[i]-1] return return_list #置換P def _functionP(self,code): return_list='' for i in range(32): return_list+=code[p[i]-1] return return_list #S盒代替選擇置換 def _functionS(self, key): return_list='' for i in range(8): row=int( str(key[i*6])+str(key[i*6+5]),2) raw=int(str( key[i*6+1])+str(key[i*6+2])+str(key[i*6+3])+str(key[i*6+4]),2) return_list+=self._functionTos(s[i][row][raw],4) return return_list #密鑰置換選擇2 def _functionKeySecondChange(self,key): return_list='' for i in range(48): return_list+=key[pc2[i]-1] return return_list #將十六進制轉換為二進制字符串 def _functionCharToA(self,code,lens): return_code='' lens=lens%16 for key in code: code_ord=int(key,16) return_code+=self._functionTos(code_ord,4) if lens!=0: return_code+='0'*(16-lens)*4 return return_code #二進制轉換 def _functionTos(self,o,lens): return_code='' for i in range(lens): return_code=str(o>>i &1)+return_code return return_code #將unicode字符轉換為16進制 def tohex(string): return_string='' for i in string: return_string+="%02x"%ord(i) return return_string def tounicode(string): return_string='' string_len=len(string) for i in range(0,string_len,2): return_string+=chr(int(string[i:i+2],16)) return return_string #入口函數 def desdecode(from_code,key): key=tohex(key) des=DES() key_len=len(key) string_len=len(from_code) if string_len%16!=0: return False if string_len<1 or key_len<1: return False key_code= des.decode(from_code,key,key_len,string_len) return tounicode(key_code) #測試 if __name__ == '__main__': print desdecode('84148584371a6a1fe99e1da0ce1e34649b88ed15098e8aa4b8eb0bf24885c658','0f1571c947劉'解密後為: 我是12345678劉就是我abcdwfd
希望本文所述對大家的Python程序設計有所幫助。