Python implements an example of the DES encryption and decryption method, pythondes

Source: Internet
Author: User

Python implements an example of the DES encryption and decryption method, pythondes

This article describes how to implement DES encryption and decryption in python. Share it with you for your reference. The specific analysis is as follows:

Function: encrypt Chinese characters and other strings
The key length and plaintext length can be unequal.
Only code is pasted here, And the encryption process can be Baidu. The python code is not optimized here.

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, 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 encrypted file

# _ * _ Coding: UTF-8 _*_#! /Usr/bin/env python # Filename: des. pyfrom desstruct import * import re _ all __= ['desc'] class DES (): '''des encrypts ''' def _ init _ (self ): pass # encrypt def code (self, from_code, key, code_len, key_len): output = "" trun_len = 0 # convert passwords and keys to binary code_string = self. _ functionCharToA (from_code, code_len) code_key = self. _ functionCharToA (key, key_len) # if the key length is not an integer multiple of 16, it is changed to an integer multiple of 16 by increasing 0 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 # Every hexadecimal system occupies 4 trun_len = 4 * real_len # encrypt each 64-bit 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-bit plaintext, initial replacement of the key run_code = self. _ codefirstchange (run_code) run_key = self. _ keyfirstchange (run_key) #16 iterations for j in range (16): # retrieve the 32-bit code_r = run_code [32: 64] code_l = run_code [0: 32] #64 switching between left and right run_code = code_r #32-bit extended replacement code on the right _ R = self. _ functionE (code_r) # obtain the key 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) # XOR or code_r = self. _ codeyihuo (code_r, key_y) # Replace/select code_r = self in the S box. _ functionS (code_r) # P converts code_r = self. _ functionP (code_r) # XOR or code_r = self. _ codeyihuo (code_l, code_r) run_code + = code_r #32 swap c Ode_r = run_code [32: 64] code_l = run_code [0: 32] run_code = code_r + code_l # convert binary to hexadecimal notation and reverse initial replacement output + = self. _ functionCodeChange (run_code) return output # different or 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): chan Ged_code + = code [ip [I]-1] return changed_code # initial key replacement def _ keyfirstchange (self, key): changed_key = ''for I in range (56 ): changed_key + = key [pc1 [I]-1] return changed_key # inverse initial replacement 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 # extended replacement def _ functionE (self, code): r Eturn_list = ''for I in range (48): return_list + = code [e [I]-1] return return_list # replace P def _ functionP (self, code ): return_list = ''for I in range (32): return_list + = code [p [I]-1] return return_list # S box instead of selecting replace 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. _ f UnctionTos (s [I] [row] [raw], 4) return return_list # select 2 def _ functionKeySecondChange (self, key) for key replacement ): return_list = ''for I in range (48 ): return_list + = key [pc2 [I]-1] return return_list # convert the hexadecimal format to the binary string 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 # Binary Conversion 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 hexadecimal def tohex (string): return_string = ''for I in 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 desencode (from_code, key): # convert to hexadecimal 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 # test if _ name _ = '_ main __': print desencode ('I am 12345678 Liu is my abcdwfd', '0f1571c947 Liu ') # The returned ciphertext is: ciphertext.

3. decrypt the file

# _ * _ Coding: UTF-8 _*_#! /Usr/bin/env python # Filename: des. pyfrom desstruct import * import re _ all __= ['destcode'] class DES (): ''' decryption function, DES encryption and decryption methods are not much different, except that the sub-keys used during decryption are opposite to the encrypted sub-keys '''def _ init _ (self ): pass def decode (self, string, key, key_len, string_len): output = "" trun_len = 0 num = 0 # convert ciphertext to binary code_string = self. _ functionCharToA (string, string_len) # obtain the word key code_key = self. _ getkey (key, key_len) # If the key length is not an integer multiple of 16, the value of real_len = (Key_len/16) + 1 if key_len % 16! = 0 else key_len/16 trun_len = string_len * 4 # encrypt for I in range (0, trun_len, 64): run_code = code_string [I: I + 64] run_key = code_key [num % real_len] #64-bit plaintext initial replacement run_code = self. _ codefirstchange (run_code) #16 iterations for j in range (16): code_r = run_code [32: 64] code_l = run_code [0: 32] #64 left and right switching run_code = code_r # Right 32-bit extended replacement code_r = self. _ functionE (code_r) # obtain the key key_y = run_key [15-j] # unique or code_r = self. _ codeyihuo (code_r, Key_y) # Replace/select code_r = self in the S box. _ functionS (code_r) # P converts code_r = self. _ functionP (code_r) # XOR or code_r = self. _ codeyihuo (code_l, code_r) run_code + = code_r num + = 1 #32 swap code_r = run_code [32: 64] code_l = run_code [0: 32] run_code = code_r + code_l # convert binary to hexadecimal notation, and replace output with self. _ functionCodeChange (run_code) return output # obtain the sub-key def _ getkey (self, key, key_len): # convert the key to binary 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 # XOR or 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 # ciphertext or plaintext initial replacement def _ codefirstchange (self, code): changed_code = ''for I in range (64 ): changed_code + = code [ip [I]-1] return changed_code # initial key replacement def _ keyfirstchange (self, key): changed_key = ''for I in range (56 ): Changed_key + = key [pc1 [I]-1] return changed_key # inverse initial replacement 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 # extended replacement def _ functionE (self, code): return_list = ''for I in range (48 ): return_list + = code [e [I]-1] return return_list # replace P def _ functionP (self, code): return_list = ''for I in Range (32): return_list + = code [p [I]-1] return return_list # S box replace 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 # select 2 def _ functionKeySecondChange (self, key) for key replacement ): return_list = ''for I in range (48): ret Urn_list + = key [pc2 [I]-1] return return_list # convert the hexadecimal format to the binary string 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 # Binary Conversion 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 hexadecimal def tohex (string): return_string = ''for I in 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): retu Rn_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 <1 or key_len <1: return False key_code = des. decode (from_code, key, key_len, string_len) return tounicode (key_code) # test if _ name _ = '_ main _': print desdecode ('encoding ', '0f1571c947 Liu'

After decryption: I am 12345678, Liu is my abcdwfd

I hope this article will help you with Python programming.

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.