分组密码是将明文消息编码表示后的数字序列划分成长为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函数的作用是将上一轮的右半边的结果,以及该轮所获得的密钥作为输入数据,输出结果是通过异或操作来加密。
在f函数最开始时,首先将32-bit数据扩展为48-bit数据,参照的方法为通过E矩阵进行扩展。扩展(或称为映射)方法与IP形似。
第二步,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的四种运行模式:
来源: http://www.cnblogs.com/gscienty/p/5991806.html