對稱式加密DES

DES(data encryption standard,美國資料加密標準)
1976年後的30幾年,為商業機構常用的加密系統
方法:以feistel加密法為基礎,用56bitkey對64位元資料區段進行加密
規格:56 bits key,64bits block size,重做16回合
ps:
DES是修改IBM現有的lucifer系統而產生的
Feistel加密法是以Shannon提出的”取代-重排網路”及product cipher(乘法加密系統)為基礎

DES使用shannon系統兩大特點
diffusion(擴散):將明文結構分佈到較長的密文上,讓破解者無法用統計方式分析
confusion(混淆):使明文和密文關係更加複雜,讓破解者無法用數學方式分析

…………………………. 

架構大致如下:
產生16把回合金鑰
明文加密時有16回合,每回合用該回合金鑰加密
密文解密時有16回合,每回合用相反的回合金鑰加密

產生16把回合金鑰
1
KEY_56bit+odd parity check => KEY_64bit
在56bit金鑰中,每7bit加入1bit同位檢查變為8bit,並使1的個數變為奇數個
2
key permutation(KEY_64bit)=>new_KEY_56bit= L_KEY_28bit + R_KEY_28bit
將64bit金鑰透過key permutation重排後變成56bit金鑰,在分為2把28bit金鑰
3
ls(L_KEY_28bit)+ls(R_KEY_28bit)=>LR_KEY_56bit
將2把28bit金鑰透過ls(左移位數表)後,在合併成56bit金鑰
4
compression permutation(LR_KEY_56bit)=>KEY1_48bit
將56bit金鑰透過compression permutation重排後變成48bit金鑰
5
(step3-step4)*16=>KEY1_48bit~KEY16_48bit
重覆步驟3到4直到16把回合金鑰產生

加密方式
1
P_nbit=>P1_64bit,P2_64bit,…,Pn_xbit
先將明文p切成多個區塊,區塊最大不可大於64bit
2
initial permutation(P1_64bit)=>new_P_64bit=L0_32bit+R0_32bit
將64bit區塊透過initial permutation重排後,在分為兩個32bit區塊
3
f(R(x)_32bit,KEY(x+1)_48bit)=>f_R(x)K_32bit
將本回合的32bit右區塊與該回合金鑰放入f函數中,以產生32bit資料
f函數運作詳細步驟如下
3.1
ep(R(x)_32bit)=>R(x)_48bit
將本回合的32bit區塊透過ep重排擴展成為48bit區塊
3.2
R(x)_48bit XOR KEY(x+1)_48bit => data(x)_48bit =>data(x)1_6bit+…+data(x)8_6bit
將48bit區塊和本回合金鑰做XOR後,在分成8份6bit的資料
3.3
S-BOX1(data(x)1_6bit)=>data(x)1_4bit
…..
S-BOX8(data(x)8_6bit)=>data(x)8_4bit
將這8份6bit資料分別放S-BOX1-8函數後,產生8份4bit資料
3.4
P-BOX(data(x)1_4bit+…+data(x)8_4bit)=>f_R(x)K_32bit
將8份4bit資料合併後透過P-BOX重排後輸出32bit資料
4
(L(x)_32bit) XOR (f_R(x)K_32bit) => R(x+1)_32bit
將該回合32bit左區塊及32bit資料做XOR產生下一回合的32bit右區塊
5
R(x)_32bit = L(x+1)_32bit
左區塊等於下一回合的右區塊
6
(step3-step5)*16=>R16_32bit+L16_32bit=LR_64bit
重覆步驟3到5直到第16回合
並將第16回合的32bit左右區塊合併成64bit區塊
7
final permutation(LR_64bit)=>C_64bit
將64bit區塊透過final permutation重排後成為密文


解密方式
類似加密方式,差別在於使用的回合金鑰是從第16把開始
1
initial permutation(C_64bit)=>new_C_64bit=L0_32bit+R0_32bit
將64bit區塊透過initial permutation重排後,在分為兩個32bit區塊
2
f(R(x)_32bit,KEY(16-x)_48bit)=>f_R(x)K_32bit
將本回合的32bit右區塊與適當的回合金鑰放入f函數中,以產生32bit資料
f函數運作詳細步驟與前者相同
3
(L(x)_32bit) XOR (f_R(x)K_32bit) => R(x+1)_32bit
將該回合32bit左區塊及32bit資料做XOR產生下一回合的32bit右區塊
4
R(x)_32bit = L(x+1)_32bit
左區塊等於下一回合的右區塊
5
(step2-step4)*16=>R16_32bit+L16_32bit=LR_64bit
重覆步驟2到4直到第16回合,並將第16回合的32bit左右區塊合併成64bit區塊
6
final permutation(LR_64bit)=>P_64bit
將64bit區塊透過final permutation重排後成為明文