Python implementation of DES Encryption and decryption Method Example

Source: Internet
Author: User
Tags ord
This paper describes the implementation of DES encryption and decryption method in Python. Share to everyone for your reference. The specific analysis is as follows:

Implementation function: Encrypt strings such as Chinese
Keys and plaintext can be unequal
Here only the code, the encryption process can own Baidu, where the Python code is not optimized

1. Structure to be used in desstruct.py des encryption

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, (7) ip_1= (40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54  0, 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, , 1, 9, (+) (32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13) E = (+) 4, 16,17, +, +,----------------------------16, 1, 7 Ten, 5, 1, 2, at A,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 3, 9,, 8, 6 [[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, 1 1, 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, 1 4, 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]  , [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] , [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,, 0, 2, 6,,,, 3, 5, 8, 2,, 1, 7, 4, 8,, 9, 0,, 3, 5, 11]]]pc1= (6, 57  , 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, 7, (+), (+), 5, 6, (+), (+), (+), (+), (+), 4);p c2= (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, (1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2), d = (+)

2. des.py Encrypted files

#_ *_ coding:utf-8 _*_#!/usr/bin/env python#filename:des.pyfrom desstruct import *import re__all__=[' Desencode ']class Des (): ' Des encryption ' ' Def __init__ (self): pass #加密 def code (self,from_code,key,code_len,key_len): output= "" Tru N_len=0 #将密文和密钥转换为二进制 Code_string=self._functionchartoa (From_code,code_len) Code_key=self._functionchartoa (Key,ke Y_len) #如果密钥长度不是16的整数倍则以增加0的方式变为16的整数倍 if code_len%16!=0:real_len= (CODE_LEN/16) *16+16 else:real_len=c Ode_len if key_len%16!=0:key_len= (key_len/16) *16+16 key_len*=4 #每个16进制占4位 Trun_len=4*real_len #对每64位进      Line one time encryption 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位明文, key initial displacement run_code= Self._codefirstchange (run_code) run_key= self._keyfirstchange (Run_key) #16次迭代        For j in range: #取出明文左右32位 code_r=run_code[32:64] code_l=run_code[0:32] #64左右交换 Run_code=code_r #右边32Bit extension Displacement 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= sel  F._functionkeysecondchange (Run_key) #异或 code_r= Self._codeyihuo (code_r,key_y) #S盒代替/select 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进制, Inverse initial displacement output+=self._functioncodechange (Run_code) return output #异或 def _codeyihuo (self , Code,key): Code_len=len (key) return_list= "For me in Range (Code_len): If Code[i]==key[i]: Return_lis t+= ' 0 ' else:return_list+= ' 1 ' return return_list #密文或明文初始置换 def _codefirstchange (self,code): Changed_c Ode= ' For I in range(+): Changed_code+=code[ip[i]-1] return changed_code #密钥初始置换 def _keyfirstchange (self,key): changed_key= "     For I in Range (*): 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 me in Range": Return_list+=code[e[i]-1] return return_list #置换P def _functionp (Self,code): Return_list= ' For I in range (+): Return_list+=code[p[i]-1] return return_list #S盒代替选择置换 def _functions (sel F, 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 re Turn_list #密钥置换选择2 def_functionkeysecondchange (Self,key): return_list= ' for I in range: Return_list+=key[pc2[i]-1] return ret      Urn_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) 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# convert Unicode characters to 16 def tohex (string): return_string= ' for I in string:return_string+= "%02x"%ord (i) Return return_stringdef Tounicode (string): Return_string= "String_len=len (stri NG) for I in Range (0,string_len,2): return_string+=chr (int (string[i:i+2],16)) Return return_string# entry function def desencode ( From_code,key): #转换为16进制 from_code=tohex (From_code) Key=tohex (key) Des=des () Key_len=len (key) String_len=len (From_co DE) if STRING_LEN&Lt;1 or key_len<1:print ' ERROR input ' return False key_code= des.code (From_code,key,string_len,key_len) return key_code# Test if __name__ = = ' __main__ ': Print Desencode (' I am 12345678 Liu is my abcdwfd ', ' 0f1571c947 Liu ') #返回密文为: 84148584371a6a1fe99e1da0ce1e34649b88ed15098e8aa4b8eb0bf24885c658

3. Decrypting a file

#_ *_coding:utf-8_*_#!/usr/bin/env python#filename:des.pyfrom desstruct import *import re__all__=[' Desdecode ']class Des (): "Decryption function, des encryption and decryption method is not the same as the decryption of the sub-key with the encryption of the sub-key opposite the" "Def __init__ (self): Pass def decode (self,string,key,k Ey_len,string_len): output= "" Trun_len=0 num=0 #将密文转换为二进制 Code_string=self._functionchartoa (string,string_l EN) #获取字密钥 code_key=self._getkey (Key,key_len) #如果密钥长度不是16的整数倍则以增加0的方式变为16的整数倍 real_len= (KEY_LEN/16) +1 if key_l En%16!=0 Else key_len/16 trun_len=string_len*4 #对每64位进行一次加密 for I in Range (0,trun_len,64): Run_code=code_str       ING[I:I+64] Run_key=code_key[num%real_len] #64位明文初始置换 run_code= self._codefirstchange (run_code) #16次迭代 For j in range: 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] #异或 Co De_r= Self._codeyihuo (Code_r,key_y) #S盒代替/select 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进制, inverse initial displacement output+=self._functioncodechange (Run_co    DE) 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_l      EN/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 (+): 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 ' el se:return_list+= ' 1 ' return return_list #密文或明文初始置换 def _codefirstchange (self,code): Change D_code= ' For I in range: Changed_code+=code[ip[i]-1] return changed_code #密钥初始置换 def _keyfirstchange (SE Lf,key): changed_key= "For I in Range": Changed_key+=key[pc1[i]-1] return changed_key #逆初始置换 def _func Tioncodechange (self, Code): return_list= "For me in Range (+): list=" for J in Range (4): List+=cod E[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: Return_list+=code[e[i]-1] return return_list #置换P def _functionp (Self,code): Return_list= ' foR I in range (+): Return_list+=code[p[i]-1] return return_list #S盒代替选择置换 def _functions (self, key): Return_ List= "For me 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: Return_list+=key[pc2[i]-1] Retur N 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) return Return_code #二进制转换 def _functiontos (self,o,lens): return_code= "For I in Range (lens): Return_co De=str (o>>i &1) +return_code return return_code# converts Unicode characters to 16-in Def tohex (string): return_string= ' for I N String:return_string+= "%02x"%ord (i) Return return_stringdef 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# entry function 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&L T;1 or Key_len<1:return False key_code= des.decode (From_code,key,key_len,string_len) return Tounicode (Key_code) #测 Try if __name__ = = ' __main__ ': Print Desdecode (' 84148584371a6a1fe99e1da0ce1e34649b88ed15098e8aa4b8eb0bf24885c658 ', ' 0f1571c947 Liu '

After decryption: I am 12345678 Liu is my abcdwfd

Hopefully this article will help you with Python programming.

  • Related Article

    Contact Us

    The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

    If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.