之前在网上看了好多关于DES加解密的文章,很多都是直接贴代码,然而大多数都不能运行。花了一天写了个能运行的程序,其中有参考网上的一些好的代码。希望入了密码学坑的同学能得到帮助。python刚上手,代码很长,希望大家多多给出建议。
def keychanged(key):#秘钥初始置换,置换选择1
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)
changed_key=''
for i in range(56):
changed_key+=key[pc1[i]-1]
return changed_key
#将Unicode字符转换为16进制数
def tohex(string):
return_string=''
for i in string:
return_string+="%02x"%ord(i)
return return_string
#将16进制数转换为2进制数
def _functionCharToA(code):
return_code=''
lens = len(code)
lens=lens%16
for key in code:
code_ord=int(key,16)
return_code+=_functionTos(code_ord,4)
if lens!=0:
return_code+='0'*(16-lens)*4###如16进制数不为16倍数,则将剩余补为16位
return return_code
#将16进制数转换为4位2进制数
def _functionTos(o,lens):
return_code=''
for i in range(lens):
return_code=str(o>>i &1)+return_code
return return_code
###将2进制字符串转换为16进制字符串
def binTohex(string):
lens = len(string)
tohex = ''
for i in range(0,lens,4):
list = string[i]+string[i+1]+string[i+2]+string[i+3]
tohex +="%x"%int(list,2)
return tohex
###将16进制转换为unicode字符
def 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
#num = tohex(string)
#dnum = _functionCharToA(num)
#changedkey = keychanged(dnum)
#key_l = changedkey[0:28]
#key_r = changedkey[28:56]
###密钥可以转换为2进制数了
def roundKey(initkey):
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)
keylist = []
key_l = initkey[0:28]
key_r = initkey[28:56]
for i in range(16):
key_l = key_l[d[i]:28]+key_l[0:d[i]]
key_r = key_r[d[i]:28]+key_r[0:d[i]]
key = key_l+key_r
return_list = ''
for i in range(48):#密钥置换选择2
return_list+=key[pc2[i]-1]
keylist.append(return_list)
return keylist
###将轮密钥存在keylist中
#keylist = []
#keylist = r