如有疑問歡迎留言
參考網絡資源用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 1100011100111010101001111111 0101010110011001111000110001
3 0001110011101010100111111111 0101011001100111100011000101
4 0111001110101010011111111100 0101100110011110001100010101
5 1100111010101001111111110001 0110011001111000110001010101
6 0011101010100111111111000111 1001100111100011000101010101
7 1110101010011111111100011100 0110011110001100010101010110
8 1010101001111111110001110011 1001111000110001010101011001
9 0101010011111111100011100111 0011110001100010101010110011
10 0101001111111110001110011101 1111000110001010101011001100
11 0100111111111000111001110101 1100011000101010101100110011
12 0011111111100011100111010101 0001100010101010110011001111
13 1111111110001110011101010100 0110001010101011001100111100
14 1111111000111001110101010011 1000101010101100110011110001
15 1111100011100111010101001111 0010101010110011001111000110
16 1111000111001110101010011111 0101010101100110011110001100
K 1 100110110000101011111111111110000111000001110010
K 2 011110011100111011011011110110111100100110100101
K 3 011101011111100110001110000000100100111110011001
K 4 001100101010110111010111110110110011000100010101
K 5 011111010110110000110111111000110100001110101000
K 6 111001111010010110111100010100000011101100001111
K 7 110111101000011010110111111101100001000010111100
K 8 111111111001101000111010010000010011101111101011
K 9 111000011111101110101011011011001110011110000001
K 10 101100011011011111010111101110100100010001001111
K 11 011101010101111011010011110011101101001110000010
K 12 011101111111000111110100100101000110011101101001
K 13 100111101100010111010111111110101001101001000000
K 14 011111110100001100111111110100001110011100111010
K 15 101011111001000110101101001111010011111000001000
K 16 110110111011010111001011000010100001011011110101
第二步 加密
1、同樣轉2進制
s = ''.join(__hex_bin[i] for i in s)
2、重排列 排列矩陣爲IP
__ip = [
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,
]
s = __re(__ip,s)
3 F函數(在下一步用到)
F函數對於兩個輸入R和K
先對R根據E矩陣重排列得到E,再對E、K異或操作,再進行S-BOX
每六位進行一個S-BOX運算,首位與末位合做行標,中間四位做列標
最後仍有一個重新排列P
__p = [
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,
]
def __f(r,k):
#E
r = __re(__e,r)
#K+E
r = ''.join('0' if k[i]==r[i] else '1' for i in range(len(r)))
#sbox lookup row i col j
#first and last bit is i
#middle four is j
r = ''.join(__hex_bin['%x'%__s[i][int(r[i*6]+r[i*6+5],2)*16+int(r[i*6+1:i*6+5],2)]] for i in range(8))
r = __re(__p,r)
return r
其中s-box矩陣爲__s = [
[
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,
],
]
4
循環16輪進行以下步驟
Ln = Rn-1
Rn = Ln-1 異或
f(Rn-1,Kn)
f爲上述的f函數
for i in range(16):
l_n = r
print '-'*30,'Round',i+1,'-'*30
r_n = __f(r,key[i])
r_n = ''.join('0' if r_n[i]==l[i] else '1' for i in range(len(l)))
print 'r\t',r_n
print 'l\t',l_n
l,r = l_n,r_n
運行結果爲
M
1010010000000110011101010011100001010100101010111100110111101111
IP
1101010000011100110101111110010011100001101011011110100010100010
------------------------------ Round 1 ------------------------------
E 011100000011110101011011111101010001010100000101
K+E 111010110011011110100100000011010110010101110111
S-Box 10100110100010011011010001010000
P 11100011100100000000001111011000
r 00110111100011001101010000111100
l 11100001101011011110100010100010
------------------------------ Round 2 ------------------------------
E 000110101111110001011001011010101000000111111000
K+E 011000110011001010000010101100010100100001011101
S-Box 01010110001111010111001101101001
P 11101100001101001011110011010110
r 00001101100110010101010001110100
l 00110111100011001101010000111100
------------------------------ Round 3 ------------------------------
E 000001011011110011110010101010101000001110101000
K+E 011100000100010101111100101010001100110000110001
S-Box 00001000010110001101011010101111
P 00101101001011110000110001101001
r 00011010101000111101100001010101
l 00001101100110010101010001110100
------------------------------ Round 4 ------------------------------
E 100011110101010100000111111011110000001010101010
K+E 101111011111100011010000001101000011001110111111
S-Box 01110101101000011101111111011011
P 10111011001101101110101100011111
r 10110110101011111011111101101011
l 00011010101000111101100001010101
------------------------------ Round 5 ------------------------------
E 110110101101010101011111110111111110101101010111
K+E 101001111011100101101000001111001010100011111111
S-Box 01000101110111000001001010111011
P 00101110001000111101110101010001
r 00110100100000000000010100000100
l 10110110101011111011111101101011
------------------------------ Round 6 ------------------------------
E 000110101001010000000000000000001010100000001000
K+E 111111010011000110111100010100001001001100000111
S-Box 11010000111010000011011110001000
P 00101000101000011010000111001111
r 10011110000011100001111010100100
l 00110100100000000000010100000100
------------------------------ Round 7 ------------------------------
E 010011111100000001011100000011111101010100001001
K+E 100100010100011011101011111110011100010110110101
S-Box 11100010101100011110010101111001
P 11001111100101001010111110001100
r 11111011000101001010101010001000
l 10011110000011100001111010100100
------------------------------ Round 8 ------------------------------
E 011111110110100010101001010101010101010001010001
K+E 100000001111001010010011000101000110111110111010
S-Box 01001110001101110010111100100011
P 11010100011010101011110010011100
r 01001010011001001010001000111000
l 11111011000101001010101010001000
------------------------------ Round 9 ------------------------------
E 001001010100001100001001010100000100000111110000
K+E 110001001011100010100010001111001010011001110001
S-Box 01010010011001100001001000101111
P 01101000011000111001110000100110
r 10010011011101110011011010101110
l 01001010011001001010001000111000
------------------------------ Round 10 ------------------------------
E 010010100110101110101110100110101101010101011101
K+E 111110111101110001111001001000001001000100010010
S-Box 00001110010011000111011100101001
P 01101000001011010011110011011000
r 00100010010010011001111011100000
l 10010011011101110011011010101110
------------------------------ Round 11 ------------------------------
E 000100000100001001010011110011111101011100000000
K+E 011001010001110010000000000000010000010010000010
S-Box 10011100000101110010000011000010
P 10000100110110100001000010010011
r 00010111101011010010011000111101
l 00100010010010011001111011100000
------------------------------ Round 12 ------------------------------
E 100010101111110101011010100100001100000111111010
K+E 111111010000110010101110000001001010011010010011
S-Box 11011001000111011110001010100101
P 10000101101011001101110011100011
r 10100111111001010100001000000011
l 00010111101011010010011000111101
------------------------------ Round 13 ------------------------------
E 110100001111111100001010101000000100000000000111
K+E 010011100011101011011101010110101101101001000111
S-Box 01101000100111101111111100011000
P 00111111011011001011001111001000
r 00101000110000011001010111110101
l 10100111111001010100001000000011
------------------------------ Round 14 ------------------------------
E 100101010001011000000011110010101011111110101010
K+E 111010100101010100111100000110100101100010010000
S-Box 10101010110010000001001001001010
P 01101000101110110000001101000000
r 11001111010111100100000101000011
l 00101000110000011001010111110101
------------------------------ Round 15 ------------------------------
E 111001011110101011111100001000000010101000000111
K+E 010010100111101101010001000111010001010000001111
S-Box 10100001100001001100011000110100
P 00000011101001000101011100101000
r 00101011011001011100001011011101
l 11001111010111100100000101000011
------------------------------ Round 16 ------------------------------
E 100101010110101100001011111000000101011011111010
K+E 010011101101111011000000111010100100000000001111
S-Box 01100100010101110011111101000100
P 10110100011100011011001010111000
r 01111011001011111111001111111011
l 00101011011001011100001011011101
將第16輪後的L和R合併,進行IP-1的重排列
s = r_n+l_n
s = __re(__ip1,s)
print ' '*25,'%x'%int(s,2)
IP-1排列表爲
__ip1 = [
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,
]
得到最終結果
RL
0111101100101111111100111111101100101011011001011100001011011101
IP-1
1111011111011101001100101101001101000111111101010110111100001111
------------------------------ Hex Form ------------------------------
f7dd32d347f56f0f