DES密码的思想

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章