The requirement is to implement DES encryption, decryption, I was implemented with Python, or there are quite a lot of pits, change the bug on a long time, after the encryption implementation, the decryption process is relatively easy.
Requirements: The input key is a 64-bit binary number (the valid bit is 56 bits, where every eight bits of the last digit is the parity bit), the plaintext is a 64-bit binary number, the output is a 64-bit binary number, the decryption process is roughly the reverse process
The code is as follows:
#-*-coding:utf-8-*-Import TimeImportbase64c0="'D0="'L0="'R0="'cipher="'Outtext="'substitute1=[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,23,15, 7, 62,54,46,38,30,22, 14, 6,61,53,45,37,29, 21,13, 5,28,20,12, 4]substitute2=[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]shift=[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]key=[Dict () forIinchRange (16)]sbox= [ [ 0xe,0x4,0xd,0x1,0x2,0xf,0xb,0x8,0x3,0xa,0x6,0xc,0x5,0x9,0x0,0x7, 0x0,0xf,0x7,0x4,0xe,0x2,0xd,0x1,0xa,0x6,0xc,0xb,0x9,0x5,0x3,0x8, 0x4,0x1,0xe,0x8,0xd,0x6,0x2,0xb,0xf,0xc,0x9,0x7,0x3,0xa,0x5,0x0, 0xf,0xc,0x8,0x2,0x4,0x9,0x1,0x7,0x5,0xb,0x3,0xe,0xa,0x0,0x6,0xd, ], [ 0xf,0x1,0x8,0xe,0x6,0xb,0x3,0x4,0x9,0x7,0x2,0xd,0xc,0x0,0x5,0xa, 0x3,0xd,0x4,0x7,0xf,0x2,0x8,0xe,0xc,0x0,0x1,0xa,0x6,0x9,0xb,0x5, 0x0,0xe,0x7,0xb,0xa,0x4,0xd,0x1,0x5,0x8,0xc,0x6,0x9,0x3,0x2,0xf, 0xd,0x8,0xa,0x1,0x3,0xf,0x4,0x2,0xb,0x6,0x7,0xc,0x0,0x5,0xe,0x9, ], [ 0xa,0x0,0x9,0xe,0x6,0x3,0xf,0x5,0x1,0xd,0xc,0x7,0xb,0x4,0x2,0x8, 0xd,0x7,0x0,0x9,0x3,0x4,0x6,0xa,0x2,0x8,0x5,0xe,0xc,0xb,0xf,0x1, 0xd,0x6,0x4,0x9,0x8,0xf,0x3,0x0,0xb,0x1,0x2,0xc,0x5,0xa,0xe,0x7, 0x1,0xa,0xd,0x0,0x6,0x9,0x8,0x7,0x4,0xf,0xe,0x3,0xb,0x5,0x2,0xc, ], [ 0x7,0xd,0xe,0x3,0x0,0x6,0x9,0xa,0x1,0x2,0x8,0x5,0xb,0xc,0x4,0xf, 0xd,0x8,0xb,0x5,0x6,0xf,0x0,0x3,0x4,0x7,0x2,0xc,0x1,0xa,0xe,0x9, 0xa,0x6,0x9,0x0,0xc,0xb,0x7,0xd,0xf,0x1,0x3,0xe,0x5,0x2,0x8,0x4, 0x3,0xf,0x0,0x6,0xa,0x1,0xd,0x8,0x9,0x4,0x5,0xb,0xc,0x7,0x2,0xe, ], [ 0x2,0xc,0x4,0x1,0x7,0xa,0xb,0x6,0x8,0x5,0x3,0xf,0xd,0x0,0xe,0x9, 0xe,0xb,0x2,0xc,0x4,0x7,0xd,0x1,0x5,0x0,0xf,0xa,0x3,0x9,0x8,0x6, 0x4,0x2,0x1,0xb,0xa,0xd,0x7,0x8,0xf,0x9,0xc,0x5,0x6,0x3,0x0,0xe, 0xb,0x8,0xc,0x7,0x1,0xe,0x2,0xd,0x6,0xf,0x0,0x9,0xa,0x4,0x5,0x3, ], [ 0xc,0x1,0xa,0xf,0x9,0x2,0x6,0x8,0x0,0xd,0x3,0x4,0xe,0x7,0x5,0xb, 0xa,0xf,0x4,0x2,0x7,0xc,0x9,0x5,0x6,0x1,0xd,0xe,0x0,0xb,0x3,0x8, 0x9,0xe,0xf,0x5,0x2,0x8,0xc,0x3,0x7,0x0,0x4,0xa,0x1,0xd,0xb,0x6, 0x4,0x3,0x2,0xc,0x9,0x5,0xf,0xa,0xb,0xe,0x1,0x7,0x6,0x0,0x8,0xd, ], [ 0x4,0xb,0x2,0xe,0xf,0x0,0x8,0xd,0x3,0xc,0x9,0x7,0x5,0xa,0x6,0x1, 0xd,0x0,0xb,0x7,0x4,0x9,0x1,0xa,0xe,0x3,0x5,0xc,0x2,0xf,0x8,0x6, 0x1,0x4,0xb,0xd,0xc,0x3,0x7,0xe,0xa,0xf,0x6,0x8,0x0,0x5,0x9,0x2, 0x6,0xb,0xd,0x8,0x1,0x4,0xa,0x7,0x9,0x5,0x0,0xf,0xe,0x2,0x3,0xc, ], [ 0xd,0x2,0x8,0x4,0x6,0xf,0xb,0x1,0xa,0x9,0x3,0xe,0x5,0x0,0xc,0x7, 0x1,0xf,0xd,0x8,0xa,0x3,0x7,0x4,0xc,0x5,0x6,0xb,0x0,0xe,0x9,0x2, 0x7,0xb,0x4,0x1,0x9,0xc,0xe,0x2,0x0,0x6,0xa,0xd,0xf,0x3,0x5,0x8, 0x2,0x1,0xe,0x7,0x4,0xa,0x8,0xd,0xf,0xc,0x9,0x0,0x3,0x5,0x6,0xb, ] ] Substituteip= [ 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]selectoperate=[ 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]substitutep=[ 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]resubstituteip=[ 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]defHandleraw (String): a="' forIinchstring:a+=bin (ord (i)). Replace ('0b',"'). Zfill (8) returnadefShiftleft (string,x):returnstring[-(len (String)-X):]+String[:x]defencodepassword1 (x):GlobalC0GlobalD0 forIinchRange (0,28): C0+=x[substitute1[i]-1] forJinchRange (28,56): D0+=x[substitute1[j]-1]k=0defEncodepassword2 ():Globalk,c0,d0 S="'m="' if(k!=16): C0=Shiftleft (c0,shift[k]) D0=Shiftleft (D0,shift[k]) s=c0+D0 forIinchsubstitute2:m+=s[i-1] Key[k]=m K+=1Encodepassword2 ()defSubstituteip (String):GlobalL0,r0 a="' forIinchsubstituteip:a+=string[i-1] L0=a[:32] R0=a[-32:]defsboxoperate (): Mid="' forIinchSelectoperate:mid+=r0[i-1] Mid=str (Bin (int (mid,2) ^int (key[m-1],2)). Replace ('0b',"'). Zfill (48)) Outraw="' forNinchRange (8): A=int (mid[6*n]+mid[6*n+5],2) b=int (mid[(6*n+1):(6*n+5)],2) Outraw+=str (Bin (int (str (SBOX[N][A*16+B))). Replace ('0b',"'). Zfill (4)) " "print ' S: ', M,outraw" " out="' forIinchSubstitutep:out+=outraw[i-1] returnOutm=0defEncodemain ():GlobalM,l0,r0,cipher" "print ' l0,r0 ', L0,r0" "m+=1a=L0 L0=R0 R0=str (Bin (int (sboxoperate (), 2) ^int (a,2)). Replace ('0b',"'). Zfill (32)) if(m!=16): Encodemain ()Else: b=r0+L0" "print ' l0,r0 ', L0,r0" " forIinchResubstituteip:cipher+=b[i-1]defdecodecircle ():GlobalL0,r0,outtext,m a=R0 R0=L0 L0=str (Bin (int (sboxoperate (), 2) ^int (a,2)). Replace ('0b',"'). Zfill (32)) M-=1if(m!=0): decodecircle ()Else: D=l0+R0 Decodetext=[0 forIinchRange (64)] forIinchRange (64): Decodetext[substituteip[i]-1]=D[i] Outtext="'. Join (Decodetext)defDECODERESUBSTITUTEIP (cipher):GlobalR0,l0 a=[0 forIinchRange (64)] forIinchRange (64): A[resubstituteip[i]-1]=Cipher[i] a="'. Join (a) R0=a[:32] L0=a[-32:]if __name__=='__main__': Print 'This is a DES encrypt and decrypt function' " "rawpassword=raw_input (' Please input the password:\n ') Password=handleraw (Rawpassword)" "Password=raw_input ('Please input the password:\n') A=time.time () encodepassword1 (password) encodepassword2 ()" "print ' The key is:\n ', key" " " "rawtext=raw_input (LEA ' PSE input the text:\n ') Text=handleraw (rawtext)" "b=time.time () text=raw_input ('Please input the text:\n') C=time.time () substituteip (text) encodemain ()Print 'The cipher is:', Cipher" "decode the cipher" "DECODERESUBSTITUTEIP (cipher) decodecircle ()Print 'The Decodetext is:', OuttextPrint 'The time cost is :', Time.time ()-c+b-a,'s'
Python implementation des encryption source