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