分组密码体制

分组密码是将明文消息编码表示后的数字序列划分红长为n的组,每一个组(可称为长度为n的矢量)分别在密钥控制下变换成等长的输出数字序列。
其加密函数E:V_n × K → V_m。 其中V_n和V_m分别为n维和m维的矢量空间,K为密钥空间。它与流密码不一样之处在于输出的每一位数字不是只与相应时刻输入的明文数字有关,而是与一组长为n的明文数字有关。这种密码实质上是字长为n的数字序列的代换密码。算法

混淆和扩散

  1. 混淆(Confusion) 是一种加密操做,使得密钥与密文之间的关系变得模糊(经过代换器来完成,即S盒)
  2. 扩散(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比特。在加密过程当中将有三个阶段:加密

  1. 一个初始置换IP,用于从新排列明文分组的64比特数据。
  2. 进行具备相同功能的16轮变换,每轮变换中都有置换和代换运算,在第16轮变换的输出后,将结果分红左右两半,并交换次序。
  3. 最后再通过一个逆初始置换逆IP从而产生64比特密文。

这里须要注意的是,不管是初始置换仍是最终的逆初始置换,都不能增减DES的安全性。其设计的初衷并不被人所知,可是看起来其目的是将明文从新排列,使之适应8-bit寄存器。其映射规则以下:矩阵为8×8矩阵,自左至右,自上至下依次排位,矩阵中的某次位数目即为明文中该次位的比特值映射到buffer的偏移量。设计

f函数

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的设计有如下特性:

  1. 每个s-box都是以6-bit数据做为输入,4-bit数据做为输出
  2. 输出数据与输入数据无线性关系
  3. 若是6-bit数据中最高位与最低位的值是肯定的,剩余四位是变化的,则输出的4-bit数据不得出现重复
  4. 若是输入到s-box中的数据中有一位不一样,则输出的数据必需要求至少有两位不一样
  5. 若是输入到一个s-box中的两个数据有在中间比特位上有两个不一样,那么输出数据必须至少有两位不一样
  6. 若是输入到一个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轮时,两个子部密钥向左循环移位1-bit
  • 在其它轮时,两个子部密钥向左循环移位2-bit

咱们能够发现,16轮事后,两个子部密钥正好旋转了28-bit,即旋转一周。

在每一轮中,为了生成48-bit子密钥,须要进行子置换,其输入数据为旋转后获得的密钥舍去8-bit,然后再用一个6×8的矩阵进行置换,置换规则如上所述。因此,56-bit的密钥中每一位,都会在16轮中的14轮里使用到。

解密过程

DES的解密和加密使用同一个算法,可是子密钥使用的顺序倒是相反的

所以在解密过程当中,子密钥的循环移位规则与加密过程有不一样

  • 在第1轮时,密钥不进行循环移位
  • 在第二、九、16轮时,两个子部密钥向右循环移位1-bit
  • 剩余轮时,两个子部向右循环移位2-bit

而在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的四种运行模式:

  1. 电码本(ECB)模式:每一个明文组独立地以同一个密钥进行加密,用于传送短数据
  2. 密码分组连接(CBC)模式:加解密算法的输入是当前明文组与前一个密文组的异或,用于传送数据分组和认证
  3. 密码反馈(CFB)模式:每次只处理输入的比特,将上次密文用做加密算法的输入,用以产生伪随机输出,再将该输出与当前明文异或获取当前密文,主要用于传送数据流和认证
  4. 输出反馈(OFB)模式:与CFB相似,但本次加密算法的输入为前一次加密算法的输出,主要用于在有干扰信道上的数据流传送。
相关文章
相关标签/搜索