分组密码是将明文消息编码表示后的数字序列划分红长为n的组,每一个组(可称为长度为n的矢量)分别在密钥控制下变换成等长的输出数字序列。
其加密函数E:V_n × K → V_m。 其中V_n和V_m分别为n维和m维的矢量空间,K为密钥空间。它与流密码不一样之处在于输出的每一位数字不是只与相应时刻输入的明文数字有关,而是与一组长为n的明文数字有关。这种密码实质上是字长为n的数字序列的代换密码。算法
Feistel提出利用乘积密码可得到简单的代换密码,乘积密码指顺序地执行两个或多个基本密码系统,使得最后的密码强度高于每一个基本密码系统产生的结果。其思想其实是Shannon提出的利用乘积密码实现混淆和扩散思想的具体应用。安全
加密算法的输入是分组长为2w的明文和一个密钥k,将每组明文分红左右两半L和R,在进行完n轮迭代后,左右两半再合并到一块儿产生密文分组。第i轮迭代的前一轮输出的函数:网络
L_i = R_{i-1}
R_i = L_{i-1} xor F(R_{i-1}, k_i)函数
解密过程本质上和加密过程是同样的,算法使用密文做为输入,但使用子密钥K_i的次序与加密过程相反。这一特征保证了解密和加密可采用同一算法。编码
明文分组长度为64比特,密钥长度为56比特。在加密过程当中将有三个阶段:加密
这里须要注意的是,不管是初始置换仍是最终的逆初始置换,都不能增减DES的安全性。其设计的初衷并不被人所知,可是看起来其目的是将明文从新排列,使之适应8-bit寄存器。其映射规则以下:矩阵为8×8矩阵,自左至右,自上至下依次排位,矩阵中的某次位数目即为明文中该次位的比特值映射到buffer的偏移量。设计
f函数在DES的安全性中起到了相当重要的做用,f函数的做用是将上一轮的右半边的结果,以及该轮所得到的密钥做为输入数据,输出结果是经过异或操做来加密。it
在f函数最开始时,首先将32-bit数据扩展为48-bit数据,参照的方法为经过E矩阵进行扩展。扩展(或称为映射)方法与IP形似。io
第二步,48-bit的结果将会按位与该轮对应的子密钥(48位)异或。扩展
第三步,将48-bit数据切分红8个6-bit数据,分别做为8个不一样的代换盒子(s-box)的输入数据,s-box用于实现代换操做。每个s-box包含64个实体,存放于4×16的矩阵之中。其代换规则以下:取6-bit数据中最高位比特数以及最低位比特数做为行数,剩余四位在中间的比特数做为列数,由此能够取出s-box中某行某列的数,该数为0-15之间,即输出结果为4-bit数据。
对于s-box的设计有如下特性:
s-box是DES加密中最重要的元素,由于他们实现了非线性加密 : S(a) xor S(b) != S(a xor b)
输入DES的56-bit密钥首先要通过一个置换运算,其置换规则与上文IP矩阵相似。这里须要首先明确一点,DES的输入密钥一般是64-bit的,真实的56-bit密钥生成的算法是:将64-bit分红8组,每组8-bit,仅取每组前7-bit组成56-bit密钥。每一个子密钥是为48-bit。
56-bit密钥首先将会分红两部分,这两部分将会各自循环移位。其移位规则以下:
咱们能够发现,16轮事后,两个子部密钥正好旋转了28-bit,即旋转一周。
在每一轮中,为了生成48-bit子密钥,须要进行子置换,其输入数据为旋转后获得的密钥舍去8-bit,然后再用一个6×8的矩阵进行置换,置换规则如上所述。因此,56-bit的密钥中每一位,都会在16轮中的14轮里使用到。
DES的解密和加密使用同一个算法,可是子密钥使用的顺序倒是相反的
所以在解密过程当中,子密钥的循环移位规则与加密过程有不一样
而在Feistel网络中的解密解析以下:
咱们能够分析得出:
解密L0 = 加密R16
解密R0 = 加密L16 = 加密R15
解密L1 = 解密R0 = 加密L16 = 加密R15
解密R1 = 解密L0 xor f(解密R0, k16) = 加密R16 xor f(加密L16, k16) = (加密L15 xor f(加密R15, k16)) xor f(加密R15, k16) = 加密L15
如此,能够推算出解密算法可逆。
分组密码在加密的时候,明文分组长度是固定的,但在实际应用过程当中每每难以保证实文的长度。所以为了能在各类场合使用DES,定义了DES的四种运行模式: