DES的加密算法:
(1)生成子密钥
首先,将64比特的密钥(实际有效位数只有56比特)进行置换,得到56比特的密钥串;
然后,将56比特的串分为两个28比特的子串,经过16轮的循环左移以及合并置换,生成16个子密钥,记为K1K2K3...K16;
(2)加密
首先,将64比特的明文W做初始置换,得到结果IP(W);
将结果分成两个32比特的子串,记为L0和R0,所以L0R0=IP(W);
然后,根据L0、R0以及K1,求得L1和R1,具体如下:
L1=R0,即L1跟R0完全相同;
R1=P(S(E(R0)^K1))^L0,其中:
E(R0)表示对R0做扩展置换;
E(R0)^K1表示上一步的结果与K1做异或运算;
S(E(R0)^K1)表示上一步的结果做S-box运算;
P(S(E(R0)^K1))表示上一步的结果做置换;
P(S(E(R0)^K1))^L0表示上一步的结果与L0做异或运算.
以上的过程就是一次轮函数.如此,再由L1、R1以及K2,求得L2R2.以此类推,经过16次轮函数的迭代即可求得L16R16.
最后,把L16R16交换顺序,得到R16L16,再经过一次逆置换FP(R16L16),可以得到64比特的密文C,所以C=FP(R16L16).
DES的解密只需将16个子密钥以相反的顺序加入到轮函数。
DES的解密算法:
(1)生成子密钥
解密的时候使用的子密钥与加密时的顺序相反,记为K16K15...K2K1;
(2)解密
首先,将64比特的密文C做初始置换IP(C),
由于C=FP(R16L16),所以IP(C)=IP(FP(R16L16))=R16L16,因此得到的结果为R16L16.
将结果分成两个32比特的子串,也就是R16和L16.
然后,对其进行轮函数运算,结果记为XY,具体如下:
X=L16,
Y=P(S(E(L16)^K16))^R16.
从加密的过程中,我们知道,
L16=R15,
R16=P(S(E(R15)^K16))^L15,
因此,Y=P(S(E(L16)^K16))^P(S(E(R15)^K16))^L15.
由于L16=R15,所以P(S(E(L16)^K16))=P(S(E(R15)^K16)),
所以P(S(E(L16)^K16))^P(S(E(R15)^K16))=00000000000000000000000000000000,
因为00000000000000000000000000000000^L15=L15,
所以Y=P(S(E(L16)^K16))^P(S(E(R15)^K16))^L15=L15.
(以上参照Feistel加解密算法中的函数)由此可知,R16L16经过一次轮函数之后,得到的结果是R15L15.
如此,在对R15L15做轮函数运算,得到R14L14.以此类推,经过16次轮函数的迭代,得到R0L0.
最后,把R0L0交换顺序,得到L0R0,再经过一次逆置换FP(L0R0)=FP(IP(W))=W,就得到了明文W.
综上所述,DES解密算法实际上是DES加密算法的的逆。