web安全學了些密碼系統,還講了具體算法,emmm感覺還是比較感興趣
目前主要講了DES密碼,貌似是一個不是特別優秀但是比較大衆化的密碼系統。
也是記錄在這裏,給以後的自己當個備忘錄。
目前只寫了僞代碼,打算有空的時候真正實現一下。不過感覺很少有有空的時間呢hhhhh(其實是想把有空的時間留給算法)
算法原理概述
– 設信息空間由 {0, 1} 組成的字符串構成,明文信息和經過
DES 加密的密文信息是64位的分組,密鑰也是64位。
明文:M = m1m2 ... m64 , mi 屬於 {0, 1}, i = 1 .. 64.
密文:C = c1c2 ... c64 , ci 屬於 {0, 1}, i = 1 .. 64.
密鑰:K = k1k2 ... k64 , ki 屬於 {0, 1}, i = 1 .. 64.
(除去 k8, k16, ..., k64 共8位奇偶校驗位,起作用的僅爲56位。)
– 加密過程
C = Ek(M) = IP-1 · T16 · T15 · ... · T1 · IP(M), 其中 IP 爲初始置換,IP-1 是
IP 的逆,T1, T2 , ..., T16 是一系列的迭代變換
– 解密過程
M = Dk(C) = IP-1 · T1 · T2 · ... · T16 · IP (C) .
總體結構
模塊分解
置換IP:利用二維矩陣存儲一個IP置換表
T迭代:IP置換之後的64位碼分爲左右兩邊,記爲L0R0進入T迭代。T迭代規則如下:
Li = Ri-1, Ri = Li-1 xor f(Ri-1, Ki), i = 1 .. 16.
經過16次迭代之後得到L16R16
左右交換輸出R16L16
3. 得到R16L16,進入原置換IP的逆置換IP-1得到密文
4. Feistel輪函數f(Ri-1, Ki)
即T迭代中的f,核心是S盒的設計,存在一個E拓展的算法,最後經P置換輸出
5. 密鑰調度得到輪函數中的輸入K
數據結構
1.置換IP
T[8][8]一個二維數組存儲置換表
2.T迭代
輸入L0, R0兩個32位2進制數,輸出R16, L16兩個32位2進制數
3.輪函數
E拓展部分:
temp[8][4]存儲拓展前的R
E[8][6] 表示E拓展之後的48位碼。
S-BOX:
8個表S1-BOX~S8BOX,爲給定的4行16列的二維數組。
P置換表
P[8][4],給定的8行4列的二維數組
4.密鑰調度
k[16]存儲密鑰調度的16個子密鑰,以便傳給輪函數
PC_1[8][7],置換表PC-1,給定的8行7列的二維數組
PC_2[8][6],壓縮置換表PC-2,給定的8行6列的二維數組
僞代碼
總過程:
DES :
input:64位明文M,64位密鑰K
output:64位密文C
//IP置換
temp[64] //T置換後的結果
for i from 0 to 63
temp[i] <— T[i/8][i%8]
end for
//計算密鑰串
k[16] <— call genK(K)
//T迭代
result <— call iterT(temp, K)
//IP的逆置換
for i from 0 to 63
for j from 0 to 63
if T[j/8][j%8] equals result[i]
then result[i] <— j
end if
end for
end for
C <— result
產生子密鑰的函數:
function genK(K)
static: PC_1[8][7] //PC-1置換表
PC_2[8][6] //PC-2置換表
k[16]//存儲子密鑰
temp <— FPC_1(K, PC_1) //置換函數
C0 <— temp[0, …, 27]
D0 <— temp[28, …, 55]
for i from 1 to 16
Ci <— LS(Ci-1, i) //移位函數
Di <— LS(Di-1, i)
Ki <— FPC_2(Ci, Di, PC_2) //壓縮置換PC_2
k[i] = Ki
end for
return k
function FPC_1(K, PC_1)
去掉K中的奇偶校驗位
使用PC_1表置換
形成56位碼temp
return temp
function FPC_2(Ci, Di, PC_2)
連接Ci, Di。
去掉第9, 18, 22, 25, 35, 38, 43, 54位
使用PC_2表置換
形成48位碼Ki
return Ki
function LS(X, i)
if i = 1, 2, 9, 16,X循環左移一位
else X循環左移兩位
end if
return X
T迭代函數:
function iterT(M, K)
L0 <— M[0, .., 31]
R0 <— M[32, …, 63]
for i from 1 to 16
Li <— Ri-1
Ri <— F(Ri-1, K[i-1]) //F爲Feistel輪函數
end for
switch(L16, R16) //交換L16, R16的值
result <— 連接L16, R16
return result
Feistel輪函數:
function F(R, K)
static S1_BOX[4][16], S2_BOX[4][16], S3_BOX[4][16],S4_BOX[4][16]
S5_BOX[4][16], S6_BOX[4][16], S7_BOX[4][16],S8_BOX[4][16]
P[8][4]
E_R <— E_extend(R) //E拓展,返回8x6的數組
EK <— E_R xor K
for i from 0 to 7
Si <—FBOX(EK[i], Si_BOX)
end for
temp <— 連接S0至S7
result <— FP(temp, P)
return result
function E_extend(R)
static temp[8][4]
E[8][6]
temp[8][4] <— R //將R填入temp中
for i from 0 to 7
for j from 0 to 3
E[i][j+1] <— temp[i][j]
if j equals 0
E[i][j] <— temp[(i+7)%8][3]
end if
end for
E[i][5] <— temp[(i+1)%8][0]
end for
return E
function FBOX(E, S_BOX) //處理S盒
return S_BOX[E[0, …, 1]][E[2, …, 5]]
function FP(temp, P) //P置換
根據P表把temp置換成result
return result