pythondes加密盒子_PYTHON实现DES加密及base64源码

要求是实现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\n press 1 to encrypt, 2 to decrypt:')

password=raw_input('please input the key:\n')

encodepassword1(password)

encodepassword2()

'''print 'the KEY is:\n',KEY'''

if(e=='1'):

text=raw_input('please input the text:\n')

substituteIP(text)

encodemain()

print 'the cipher is:',cipher

if(e=='2'):

ciphertext=raw_input('please input the cipher:\n')

decoderesubstituteip(ciphertext)

decodecircle()

print 'the decodetext is:',outtext

os.system("pause")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值