如有疑问欢迎留言
参考网络资源用PYTHON把DES的流程走了一遍,以下为代码与解析,更为具体的细节可参照http://orlingrabbe.com/des.htm或维基百科
假设要加密的原文为a406753854abcdef密钥为a34457799bbcdff1(16进制)
s = 'a406753854abcdef'
key = 'a34457799bbcdff1'
第一步 密钥的生成
1.将原文转为2进制
__hex_bin = {
'0':'0000','1':'0001','2':'0010','3':'0011',
'4':'0100','5':'0101','6':'0110','7':'0111',
'8':'1000','9':'1001','a':'1010','b':'1011',
'c':'1100','d':'1101','e':'1110','f':'1111',
' ':'0000'
}
key = ''.join(__hex_bin[i] for i in key)
2.P-1重新排列
排列矩阵为P1
__re = lambda t, s: ''.join(s[i-1] for i in t)
# PC-1
__k1 = [
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,
]
密钥由64位变为56位
3.将其分为左右两组C0与D0,分别按照循环移位表移位,得到Cn Dn
移位表:
序数 左移位数 1 1 2 1 3 2 4 2 5 2 6 2 7 2 8 2 9 1 10 2 11 2 12 2 13 2 14 2 15 2 16 1代码:
k0 = [
0,1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28,
]
key = [key[k0[i]:28]+key[0:k0[i]] + key[k0[i]+28:56]+key[28:k0[i]+28] for i in range(17)]
4再次重排列
#PC-2
__k2 = [
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,
]
key = [__re(__k2,key[i]) for i in range(1,17)]
运行结果:
key
a34457799bbcdff1
K
1010001101000100010101110111100110011011101111001101111111110001
K+
11110001110011101010100111110101010101100110011110001100
n Cn Dn
0 1111000111001110101010011111 0101010101100110011110001100
1 1110001110011101010100111111 1010101011001100111100011000
2