要求是实现DES加密,解密,我是用python实现的,还是有挺多坑的,改bug就改了挺久,加密实现后,解密过程就比较轻松。
另外,附加base64编码源码
要求:输入秘钥为64位二进制数(有效位为56位,其中每八位最后一位为奇偶校验位),明文为64位二进制数,输出为64位二进制数,解密过程大致为逆向过程
base64代码如下:
base='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' def base64(string): out='' c=len(string)%3 a=''.join(bin(ord(i)).replace('0b','').zfill(8) for i in string) if(c==1): a+='0000' if(c==2): a+='00' m=int(len(a)/6) for j in range(m): out+=base[int(a[j*6:j*6+6],2)] if(c==1): out+='==' if(c==2): out+='=' return out string=raw_input('please input the text:') print ('the base64text is:'),base64(string)
DES代码如下:
# -*- coding: utf-8 -*- import time import base64 import os m=0 C0='' 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() for i in range(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] def handleraw(string): a='' for i in string: a+=bin(ord(i)).replace('0b','').zfill(8) return a def shiftleft(string,x): return string[-(len(string)-x):]+string[:x] def encodepassword1(x): global C0 global D0 for i in range(0,28): C0+=x[substitute1[i]-1] for j in range(28,56): D0+=x[substitute1[j]-1] k=0 def encodepassword2(): global k,C0,D0 t='' if(k!=16): C0=shiftleft(C0,shift[k]) D0=shiftleft(D0,shift[k]) s=C0+D0 for i in substitute2: t+=s[i-1] KEY[k]=t k+=1 encodepassword2() def substituteIP(string): global L0,R0 a='' for i in substituteip: a+=string[i-1] L0=a[:32] R0=a[-32:] def sboxoperate(): mid='' for i in selectoperate: mid+=R0[i-1] mid=str(bin(int(mid,2)^int(KEY[m-1],2)).replace('0b','').zfill(48)) outraw='' for n in range(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]),10)).replace('0b','').zfill(4)) '''print 'S:',m,outraw''' out='' for i in substituteP: out+=outraw[i-1] return out def encodemain(): global m,L0,R0,cipher '''print 'L0,R0',L0,R0''' m+=1 a=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''' for i in resubstituteip: cipher+=b[i-1] def decodecircle(): global L0,R0,outtext,m a=R0 R0=L0 L0=str(bin(int(sboxoperate(),2)^int(a,2)).replace('0b','').zfill(32)) m-=1 if(m!=0): decodecircle() else: d=L0+R0 decodetext=[0 for i in range(64)] for i in range(64): decodetext[substituteip[i]-1]=d[i] outtext=''.join(decodetext) def decoderesubstituteip(string): global R0,L0,m m=16 a=[0 for i in range(64)] for i in range(64): a[resubstituteip[i]-1]=string[i] a=''.join(a) R0=a[:32] L0=a[-32:] if __name__=='__main__': e=raw_input('This is a DES encrypt and decrypt function press 1 to encrypt, 2 to decrypt:') password=raw_input('please input the key: ') encodepassword1(password) encodepassword2() '''print 'the KEY is: ',KEY''' if(e=='1'): text=raw_input('please input the text: ') substituteIP(text) encodemain() print 'the cipher is:',cipher if(e=='2'): ciphertext=raw_input('please input the cipher: ') decoderesubstituteip(ciphertext) decodecircle() print 'the decodetext is:',outtext os.system("pause")