分组密码在加密过程当中不是将明文按字符逐位加密,而是首先要将待加密的明文进行分组,每组的长度相同,而后对每组明文分别加密获得密文。加密和解密过程采用相同的密钥,称为对称密码体制。算法
例如将明文分为\(m\)块:\(P_{0},P_{1},P_2,…,P_{m-1}\),每一个块在密钥做用下执行相同的变换,生成\(m\)个密文块:\(C_0,C_1,C_2,…,C_{m-1}\),每块的大小能够是任意长度,但一般是每块的大小大于等于64位(块大小为1比特位时,分组密码就变为序列密码)。安全
以下图所示是通讯双方最经常使用的分组密码基本通讯模型。网络
一个分组密码系统(Block Cipher System,简称BCS)能够用一个五元组来表示:\(BCS=\{P,C,K,E,D\}\)。其中,P(plaintext)、C(ciphertext)、K(key)、E(encryption)、D(decode)分别表明明文空间、密文空间、密钥空间、加密算法、解密算法。app
设\(X=\{x_0,x_1,…,x_{n-2},x_{n-1}\}\)为一组长度为 \(n\) 的明文块,在密钥\(K=\{k_0,k_1,…,k_{t-1}\}\)的加密做用下获得密文块\(Y=\{y_0,y_1,…,y_{m-2},y_{m-1}\}\),其中\(x_i,y_j,k_r∈GF(2)\),且
\[ 0≤i≤n-1,0≤j≤m-1,0≤r≤t-1 \]
若\(n=m\),明文块长度等于密文块长度,称之为无数据扩展和压缩的分组密码;
若\(n>m\),明文块长度大于密文块长度,称之为有数据压缩的分组密码;
若\(n<m\),明文块长度小于密文块长度,称之为有数据扩展的分组密码。函数
为了保证分组密码的安全强度,设计分组密码时应遵循以下的基本原则:测试
分组长度足够长,防止明文穷举攻击,例如DES(Data Encryption Standard)、IDEA(International Data Encryption Algorithm)等分组密码算法,分组块大小为\(64\ bit\),在生日攻击下用\(2^{32}\)组密文,破解成功的几率为\(0.5\),同时要求\(2^{32}×64\ bit=2^{15}\ MB\)大小的存储空间,故在目前环境下采用穷举攻击DES、IDEA等密码算法是不可能的(\(2^{15}MB\),也便是\(32G\)内存,这个是作获得的。作不到的是穷举 \(2^{32}\) 组密文。);而AES明文分组为\(128\ bit\),一样在生日攻击下用\(2^{64}\)组密文,破解成功的几率为\(0.5\),同时要求存储空间大小为\(2^{64}×128\ bit=2^{48}\ MB\),因此采用穷举攻击AES算法在计算上就更不可行。加密
差错传播尽量小,加密或解密某明文或密文分组出错,对后续密文解密的影响也尽量小。spa
20世纪40年代末,香农在遵循柯克霍夫原则( 即便密码系统的任何细节已为人悉知,只要密匙(key)未泄漏,它也应是安全的。 )前提下,提出了设计密码系统的两个基本方法——扩散和混淆,目的是抗击攻击者对密码系统的统计分析。设计
1949年,香农在他的论文中提出了一种乘积密码,实现混淆和扩散。乘积密码一般伴随一系列置换与代替操做,常见的乘积密码是迭代密码。许多分组密码重复一个或几个步骤:代替而后换位,以后再代替,再换位等,而且每一个步骤的过程都由密钥来控制。目前的大多数分组密码同时使用代替-置换网络以达到混淆和扩散的目标。 代替-置换网络是由多重代替变换(S)和置换变换(P)构成,以下图所示,S代替操做起到混淆的做用,P置换操做起到扩散的做用。3d
最典型的乘积密码是在1973年由Feistel提出的,整个处理过程包括多轮的代替和置换操做,主密钥可生产一个子密钥集\(k_i\),每轮使用一个子密钥。在每轮中,明文被分为左右两部分,分别记为\(L_0\)和\(R_0\),两部分分别进行交换,其中一个部分与子密钥混合,进行相应变换(能够把F视为一个函数),其中 \(\oplus\) 是异或运算。
在进行完 \(n\) 轮迭代以后,左右两半合并在一块儿再产生密文。示意图以下
加密过程逻辑关系
\[ L_{i}=R_{i-1}\\ R_{i}=L_{i-1}\oplus F(R_{i-1},k_{i}) \]
解密过程逻辑关系
\[ R_{i-1}=L_i\\ L_{i-1}=R_{i}\oplus F(L_{i},k_{i}) \]
加密解密过程使用的是同一个F函数。
为了保证分组密码的安全性,与分组密码算法原则很是相似,Feistel网络结构实现与如下参数和特性有关:
初始置换 \(IP^{-1}\)。将64 bit明文的位置进行置换,获得一个乱序的64 bit明文组,以下图,将本来在第58位的字符放到第1位;将本来在第50位的字符放到第2位,依次。置换完成后分红左右两段,每段为32 bit,以\(L_0\)和\(R_0\)表示。
逆初始置换 \(IP^{-1}\)将16轮迭代后给出的64 bit组进行置换,获得输出的密文组。输出为阵中元素按行读得的结果。
是IP的逆操做,知足\(Y=IP^{-1}(X)=IP^{-1}(IP(M))\),好比刚才把第1位字符放到了第40位,如今就要换回来。
\(IP\) 和 \(IP^{-1}\) 在对加密意义上做用不大,它们的做用在于加密过程打乱原来输入的明文顺序。
密匙用于变换时参与F函数运算。
其中第八、1六、......64位是奇偶校验位,不参与DES运算。
PC表示缩小选择换位(置换选择),LS表示循环左移,C、D表示密匙两个部分。
DES采用了典型的Feistel结构,一次迭代过程图以下
知足
\[ L_{i}=R_{i-1}\\R_{i}=L_{i-1}\oplus F(R_{i-1},k_{i}) \]
F函数的变换过程以下,DES算法的安全性关键在于非线性函数F的性质。F以长度为32位的比特串做为输入,产生的中间结果为48位,并在最终产生长度为32位的比特串做为输出。
E-扩展运算是扩位运算,将32比特扩展为48比特,用方阵形式能够容易地看出其扩位其中粗方框中的为原始输入数据,边上的两列是扩展数据。最右列是第二列(原数据的第一列)向上循环移动一位,最左列是倒数第二列(原数据的最后一列)向下循环移动一位。
函数F将扩展置换获得的48位输出与子密钥 \(k_i\)(48位)进行异或运算。
S盒运算由8个S盒函数构成
\[ S(x_1,x_2,\cdots ,x_{48})=S_1(x_1\cdots x_6)||S_2(x_7\cdots x_{12})||\cdots||S_8(x_{43}\cdots x_{48}) \]
其中,每个S盒函数都是6比特的输入,4比特的输出。值就是对应表\(S_i\)中\((x_1x_6)_B\) (表示的二进制数)行和\((x_2x_3x_4x_5)_B\)列上的值。
S盒是函数F的核心所在,同时,也是DES算法的关键步骤。实际上除了S盒之外,DES的其余运算都是线性的,而S盒是非线性的,它决定了DES算法的安全性。48位的比特串(分为8个6位分组)在通过8个S盒进行代替运算后,获得8个4位的分组,它们从新组合在一块儿造成一个32位的比特串。这个比特串将进行下一步运算:P盒置换。
P置换是对8个S盒的输出进行变换,能够扩散单个S-盒的效果,以下图所示,规则同 \(IP\) 和 \(IP^{-1}\)。
最后再来看一眼总流程,在执行16轮后,执行逆初始置换。
因为使用了Feistel网络结构,所以DES的解密和加密使用同一算法,但子密钥使用的顺序相反。
DES运用了置换、替代、代数等多种密码技术,算法结构紧凑,条理清楚,并且加密与解密算法相似,便于工程实现。然而从DES诞生之日起人们就对它的安全性持怀疑态度,并展开了激烈的争论,主要的反对意见以下:
对DES的S盒,迭代次数,密钥长度等的设计准则有争议
由于DES算法中的参数都是固定的,人们担忧若在算法是否存在后门,在这些争议中,对S盒的设计准则的质疑最为强烈。由于:除了S盒之外,DES中的全部运算都是线性的(如计算两个输出的异或,先造成两个输入的异或计算输出其结果都是相同的)。所以,S盒做为DES的非线性组件对安全性是相当重要的。
S盒的设计准则尚未彻底公开,咱们仍然不知道S盒的构造中是否使用了进一步设计的准则。这也令人们的猜想没法获得消除,关于S盒的争议仍在继续。关于S盒的设计,密码学家在这方面作出了许多工做,发表了大量的文献,能够参考一些文献得到进一步的知识。
DES存在一些弱密钥和半弱密钥
DES的56位有效密钥没法知足安全性要求
1993年,R.Session和M.Wiener给出了一个很是详细的密钥搜索机器的设计方案,它基于并行的密钥搜索芯片,此芯片每秒测试\(5×10^7\)个密钥,当时这种芯片的造价是10.5美圆,5760个这样的芯片组成的系统须要10万美圆,这一系统平均1.5天便可找到密钥(最差状况:$ \dfrac {2^{56}-1}{24\times 60\times 60\times 5\times 10^{7}\times 5760} \approx 2.9 $,平均1.5),若是利用10个这样的系统,费用是100万美圆,但搜索时间能够降到2.5小时。可见这种机制是不安全的。
尽管DES有这样那样的不足,可是做为第一个公开密码算法的密码体制成功地完成了它的使命,它在密码学发展历史上具备重要的地位。
太多了,这一段暂时不整理了。
也叫电子码本模式,是最简单的模式,直接利用加密算法分别对分组数据组加密。明文分红64比特的分组进行加密,必要时填充,每一个分组用同一密钥加密,一样的明文分组获得相同的密文。
ECB模式的特性:
也叫密码分组连接模式,比ECB模式实现复杂、更安全,所以它是最广泛使用的对称密码运行模式。CBC模式中加密过程第一个明文分组与初始矢量IV(Initial Vector)进行异或运算,然后面的明文分组和前一密文分组也作异或运算,再使用相同的密钥送至加密算法加密,造成一条链,这样每一个明文分组的加密函数输入与明文分组之间再也不有固定的关系。
CBC模式的特性:
CBC模式各密文分组不只与当前明文组有关,并且经过反馈做用还与之前的明文组有关。在CBC模式下,最好是每发一个消息,都改变IV,好比将其值加1,这样即便是两个相同的明文使用相同的密钥,也将产生不一样的密文,这样大大提升了安全性。
错误传播:若某组密文组\(C_j\)出错时,则会影响到分组\(C_j\)和\(C_{j+1}\)的解密(由于\(P_j\)依赖\(C_{j-1}\)和\(C_j\),\(P_{j+1}\)依赖\(C_j\)和\(C_{j+1}\)),即该组恢复的明文\(P_j\)和下一组\(P_{j+1}\),通常来讲彻底随机的(50%有错),所以若密文\(C_j\)有错,但\(C_{j+1}\)以后没有错误,\(C_{j+2}\)及后面的分组解密将不会受中错误比特的影响。
DES是分组长为64比特的分组密码。下图是CFB(Cipher Feed Back)模式示意图。设传送的每一个单元(如一个字符)是\(j\)比特长,一般取\(j=8\),与CBC模式同样,明文单元被连接在一块儿,使得密文依赖是前面全部的明文。
CFB模式的特性 :
OFB(Output Feed Back)模式的结构相似于CFB,将分组密码算法做为一个密钥流产生器,其输出的j比特密钥直接反馈至分组密码的输入端,同时这j比特密钥和输入的j比特明文段进行异或运算,以下页图所示。不一样之处以下:OFB模式是将加密算法的输出反馈到移位寄存器,而CFB模式中是将密文单元反馈到移位寄存器,克服了CBC和CFB的错误传播所带来的问题。
OFB模式的特性:
计数器模式,与CFB、OFB模式相似,CTR(Counter)模式也可将分组密码转换为流密码,使用与明文分组规则相同的计数器长度产生密钥流,与明文分组进行异或。加密不一样的分组所使用的计数器值必须不一样,解密采用相同方案,可是使用加密函数而非解密函数。
CTR模式的特性: