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