体制
分组密码是将明文消息编码表示后的数字序列划分成长为n的组,每个组(可称为长度为n的矢量)分别在密钥控制下变换成等长的输出数字序列。
其加密函数E:V_n × K → V_m。 其中V_n和V_m分别为n维和m维的矢量空间,K为密钥空间。它与流密码不同之处在于输出的每一位数字不是只与相应时刻输入的明文数字有关,而是与一组长为n的明文数字有关。这种密码实质上是字长为n的数字序列的代换密码。
混淆和扩散
- 混淆(Confusion) 是一种加密操作,使得密钥与密文之间的关系变得模糊(通过代换器来完成,即S盒)
- 扩散(Diffusion) 是一种加密操作,使得一个明文符号能够分散为多个密文符号,其目的是隐藏明文字符出现次数的统计概率。
Feistel密码结构
Feistel提出利用乘积密码可获得简单的代换密码,乘积密码指顺序地执行两个或多个基本密码系统,使得最后的密码强度高于每个基本密码系统产生的结果。其思想实际上是Shannon提出的利用乘积密码实现混淆和扩散思想的具体应用。
Feistel加密结构
加密算法的输入是分组长为2w的明文和一个密钥k,将每组明文分成左右两半L和R,在进行完n轮迭代后,左右两半再合并到一起产生密文分组。第i轮迭代的前一轮输出的函数:
L_i = R_{i-1}
R_i = L_{i-1} xor F(R_{i-1}, k_i)
Feistel解密结构
解密过程本质上和加密过程是一样的,算法使用密文作为输入,但使用子密钥K_i的次序与加密过程相反。这一特征保证了解密和加密可采用同一算法。
DES算法描述
明文分组长度为64比特,密钥长度为56比特。在加密过程中将有三个阶段:
- 一个初始置换IP,用于重新排列明文分组的64比特数据。
- 进行具有相同功能的16轮变换,每轮变换中都有置换和代换运算,在第16轮变换的输出后,将结果分成左右两半,并交换次序。
- 最后再经过一个逆初始置换逆IP从而产生64比特密文。
这里需要注意的是,无论是初始置换还是最终的逆初始置换,都不能增减DES的安全性。其设计的初衷并不被人所知,但是看起来其目的是将明文重新排列,使之适应8-bit寄存器。其映射规则如下:矩阵为8×8矩阵,自左至右,自上至下依次排位,矩阵中的某次位数目即为明文中该次位的比特值映射到buffer的偏移量。
f函数
f函数在DES的安全性中起到了至关重要的作用,f函数的作用是将上一轮的右半边的结果,以及该轮所获得的密钥作为输入数据,输出结果是通过异或操作来加密。
在f函数最开始
