文章目录
分组密码的基本概念
若明文流被分割成等长串,各串用相同的加密算法和相同的密钥进行加密,就是分组密码。
即,当:
1、明文和密文是固定长度位n的比特串m = m_1m_2m_3…m_n,c = c_1c_2c_3…c_n。
2、加密密钥和解密密钥相等,是固定长度为 j 的比特串z = z_1z_2z_3…z_j。
3、加密算法为c = E(m, c)。
4、解密算法为m = D(c, z) = D(E(m, z), z)。
则称这样的加解密算法为分组密码。
优势:
1、分组密码的加解密算法简洁快速,占用资源小,易于实现。一般来说,用硬件实现时:流密码比分组密码更简单快速;用软件实现时:分组密码则优于流密码。
2、加解密算法的参数固定,比流密码更容易实现标准化。
3、由于明文流被分段加密,因此容易实现同步,且传输错误不会向后扩散。
4、分组密码的安全性很难被证明,至多证明局部安全性。
主要威胁:z被重复使用。因此分组密码最害怕已知明文攻击,即通过明文和密文得到密钥z。
为抵抗这种攻击,分组密码应满足:
混淆性:所设计的密码应使得明文、密文、密钥之间的依赖关系相当复杂,以至于这种依赖关系对密码分析者来说是无法利用的。
扩散性:所设计的密码应使得(1)密钥的每一个比特影响密文的每一个比特,以防止对密钥的逐段破译。(2)明文的每一个比特对应密文的每一个比特,以便充分隐蔽明文。
分组密码的思想核心就是扩散与混淆。
混淆原则(替代):又称混乱原则,只密钥和明文以及密文之间的依赖关系尽可能地复杂化,以防通过统计分析法进行破译。
扩散原则(移位):密钥或明文的每一比特变化影响密文的许多比特的变化,以便隐蔽明文的统计特性。
注:混乱必须是可逆的!
非线性度:这一项属于混淆性。
基本数学原理:
1、如果明文与密文的关系是n维线性关系,系数是密钥,则n个明文/密文对(不是2n)就可破解密钥。
2、如果明文与密文的关系是n维r次函数关系,系数是密钥,则nr个明文/密文对就可破解密钥。
3、如果虽然次数r较大,但明文与密文的关系“非常逼近”一个n维线性关系,则n个明文/密文对就可“基本上”破解密钥。
以上是线性密码分析的思想,抵抗线性密码分析的强度就是非线性度。
分组密码的设计准则
安全性、简洁性、有效性、透明性和灵活性、加解密相似性。
安全性:
概括的说安全性就是从任何角度难以攻破,其中两个最重要的角度是:
1、对于一个正在使用的加密算法,即使攻击者获得许多精心选择的明文–密文对,让无法接近密钥。
2、即使攻击者获得许多精心选择的明文–密文对,他仍无法接近任何一个新密文所对应的明文。
简洁性:
分组密码算法再满足安全性的同时尽可能简单快速。
有效性:
1、分组密码的设计应使密钥最大限度地起到安全性作用。
2、在有效性差的分组密码算法中,一个长密钥的作用等效于另一个短密钥,或其作用在统计上逼近短密钥。
透明性和灵活性:
透明性即要求算法是可证明安全的。这就要求尽可能使用通用部件,避免黑盒。
灵活性即要求算法的实现可以适应多种计算环境;明文分组长度可以伸缩;算法可以移植和变形。
加解密相似性:
我们知道,加密算法是E(*, z),解密算法是D(*, z)。这里的E和D使用相同的密钥,不同的算法。如果D(*, z) = E(*, z’),其中z’是z经过简单的重新编排得到的,则称分组密码算法是加解密相似的。
注意:
1、加解密相似即加解密算法相同,仅仅密钥的编排不同。
2、一个加解密相似的分组密码算法,其加密机和解密机是同一个机件(加解密软件是同一个软件),仅仅临时输入的密钥不同。
3、好处是大大节省存储空间和其他计算资源,大幅降低成本。
分组密码的设计技巧
构成
计算部件、计算部件的组合、SPN(替换/置换网络)、多轮迭代与轮函数。
分组密码的设计这总是在安全性与简洁性之间回旋,希望一般的简单的计算部件安全性功能互补而不是相互抵消。
计算部件:
群加密:即明文块与密钥块进行群“乘法”运算,作用是一次性地掩盖明文。
S盒:在分组密码的计算部件中,必须有一个部件来实现高度的非线性。高度非线性函数的计算有两种途径:
1、用“解析表达式”,将自变量的值带入,计算出函数值。
2、用真值表,输入自变量的值作为地址,查出函数值。
比较发现,前者总是比较复杂,速度较慢,并且计算复杂度线性随输入长度增大。而后者计算量小,但复杂度指数随输入长度增大。此在分组密码算法中,高度非线性函数是用真值表来算的。不过输入/输出长度必须比较小,通常不超过8比特。
由上述得到结论:
1、输入/输出长度比较小的高度非线性函数仅仅实现高度非线性,混淆和扩散功能可以由的线性计算部件来完成。
2、输入/输出场部比较小的,用真值表来计算,仅仅实现高度非线性功能的计算部件称为S盒。
3、现有的大多数S盒是公开的,即是一个单表代换部件。
4、一少部分S盒是由密钥控制的,即是一个多表代换部件。
计算部件的组合:
SPN(替换/置换网络):这是一个集混淆、掩蔽、扩散为一体的综合性部件,由若干子部件组成。典型例子:Feistel网络。
代换网络:
代换是输入集A到输出A’上的双射变换:f_k: A -> A’。
k是控制输入变量,称为密钥。实现f_k的网络就是代换网络。
双射条件保证在给定k下可从密文唯一的恢复明文。
Feistel网络
Feistel网络的具体实现过程简单来说就是交替。
Feistel的解密结构与加密过程类似。
Feistel网络的实现与以下参数和特性有关:
1、分组大小:分组越大则安全性越高,但加密速度就越慢。
2、密钥大小:密钥越长则安全性越高,但加密速度就越慢。
3、轮数:单论结构远不足以保证安全性,但多轮结构可提供足够的安全性。DES轮数取为16。
4、子密钥产生算法:该算法的复杂性越大,则密码分析的困难性就越大。
5、F函数:F函数的复杂性越大,密码分析的困难性就越大。
多轮迭代与轮函数:
迭代型分组密码就是简单的、安全性弱的加密算法进行多轮迭代以获得强的安全性。单轮加密算法称为轮函数,所用的密钥称为单轮子密钥。
典型的分组密码算法
DES算法
DES算法:
Feistel型迭代分组密码算法。
分组长度为64bits,密文分组长度也是64bits。密钥长度为64bits,有8bits奇偶校验,有效密钥长度为56bits。
算法主要包括:初始置换IP、16轮迭代的乘积变换、逆初始置换IP-1以及16个子密钥产生器。
加解密算法相同,只是解密子密钥和加密子密钥的使用顺序相反。
加密过程
-> 输入,64bits明文数据 -> 初始置换IP -> 乘积变换(16轮迭代)-> 逆初始置换IP-1 -> 64bits密文数据,输出 ->
迭代过程利用Feistel,所以类似。
不过加密函数F分为几部分:E-拓展、密钥、8个S-盒变换、P-盒变换。
初始置换IP
给定IP表 8·8大小。
64bits的明文按位进行代换。
代换结束后,分成左右各32bits。对右半部分进行第一轮加密过程。
E-拓展
将右半部分的32bits拓展为48bits。
01 02 03 04 ———— 32|01 02 03 04|05
05 06 07 08 ———— 04|05 06 07 08|09
09 10 11 12 ———— 08|09 10 11 12|13
13 14 15 16 ———— 12|13 14 15 16|17
17 18 19 20 ———— 16|17 18 19 20|21
21 22 23 24 ———— 20|21 22 23 24|25
25 26 27 28 ———— 24|25 26 27 28|29
29 30 31 32 ———— 28|29 30 31 32|01
拓展方法:每个输入分组的4位作为6位输出分组的中间4位,左右分别由相邻两个4位分组最外面两位扩散进到本分组。其中第一个分组的左侧相邻分组位最后一个分组。
这部分结束得到的是48bits长。
轮秘钥异或
根据本轮生成的48bits子密钥,按位异或。
S-盒变换
结果分为8行,每一行分别记为b1-b6,取出b1b6、b2b3b4b5,组成两个数。前者作为行,后者作为列,在表中查找得到值。
实际上对应的有八个表,每一行组成的数字去对应的表里查找即可。
举例:
101100,b1=1,b2=0,b3=1,b4=1,b5=0,b6=0
b1b6 = 10 = 2
b2b3b4b5 = 0110 = 6
假设这是第三行,那么就去第三个表中查找对应的数字。
设计准则:
1、具有良好的非线性(输出的每个比特与全部输入比特有关)。
2、每一行包括16种4位二进制。
3、两个输入相差1比特时,输出相差2比特。
4、如果两个输入刚好在中间两个比特上不同,则输出至少由两个比特不同。
5、如果两个输入前两位不同而后两位相同,则输出一定不同。
6、相差6比特的输入共有32对,这32对中有不超过8对的输出相同。
P-置换
P-置换对8个S-盒的输出进行变换。
和IP置换类似,有一个表,把上一步得到的八个数字,每个数字变成二进制进行IP置换即可。
实际在实现时直接置换,即,把表中对应位置的放进来就行,不用管删掉的那些位。
这一步得到了32bits的明文。
交叉异或
把上一步得到的处理过的32bits右半部分明文和左半部分做异或并交叉。
举例:
做完IP置换部分的64bits分为了L和R两部分。
对R做上述变换,从P盒出来时记为R’。
此时L和R’按位异或,异或结果记为R_new,而R’记为L_new。
将L_new和R_new看做新一轮的L和R,进行第二轮迭代。
IP逆置换
和IP置换类似。
不过可以发现IP表和IP-1表相对应。
加密结束。
子密钥生成
子密钥生成实际上是建立在去掉了8,16,24,32,40,48,56,64位这些校验位剩下的56位密钥基础上的。
具体过程:
首先通过IP置换(PC-1)打乱并去掉8、16、…等8位的校验位,得到打乱的56位的字节串。
将之分为C、D两部分(对半)。根据迭代的轮数进行左移位。
在移位之后,保存当前状态(以便下一轮迭代继续生成子密钥),将当前的C、D拼接。再通过表2(PC-2)打乱并去掉9、18、…等8位,得到打乱的48位的字节串。这个字节串就是第一轮的子密钥。
在使用后应当保存以便解密使用。
第二至十六轮,则时利用之前的状态,继续移位并打乱得到新的子密钥。
PC1和PC2是两个单独的表。
解密过程
解密过程与加密类似,不过密钥的使用顺序相反。
DES的安全性
互补性:若明文组x逐位取补,密钥k逐位取补,即y = DES_k(x),则则有这种互补性会使DES在选择明文破译下所需的工作量减半。
算法上的互补性:对明文m逐位取补,记为m’,密钥k逐位取补,记为k’,若c = E_k(m),则有c’ = E_k’(m’),称为算法上的互补性。
弱密钥和半弱密钥:
DES算法在每次迭代时都有一个子密钥供加密用。如果给定初始密钥k,各轮的子密钥都相同,即k1=k2=…=k16,就称给定密钥k为弱密钥。
半弱密钥:
把明文加密成相同的密文,即存在两个不同的密钥k和k’,使得E_k(m) = E_k’(m)。
具有以下性质:若k和k’是一对弱密钥,m为明文组,则有D_k’(E_k(m)) = D_k(E_k’(m)) = m。
二重DES和三重DES
二重DES,即用DES进行两次加密。
这并不意味着加密两次的安全性就等于112bits密钥的密码的强度。
存在中途相遇攻击
因此表明:DES的分组长度和密钥长度是不够的
三重DES
D和E分别为DES的加解密算法。
三重DES则可表示为E_k1 D_k2 E_k1。
它的特点是:
1、分组长度仍是64bits,但密钥长度是112bits。
2、三个DES模块的级联。
3、第一个密钥与第三个密钥相同。
4、第二个DES模块是DES的逆模块。
加密:y = E_k1[ D_k2[ E_k1 [ x ]]]
解密:x = D_k1[ E_k2[ D_k1 [ y ]]]
称其为加密-解密-加密方案,简记为EDE(encrypt-decrypt-encrypt)。
Rijndael算法(AES)
数学基础:有限域GF(28)、系数在GF(28)上的多项式
设计标准:
1、抗所有已知的攻击。
2、在多个平台上速度快,编码紧凑。
3、设计简单。
算法说明
RIJNDAEL的明文分组称为状态,所有的操作都在状态之间进行。
状态可以用以字节为元素的矩阵阵列图表示,阵列有4行,列数为N_b,N_b等于分组长度除以32。
密钥种子(密码密钥)类似的用一个以字节为元素的矩阵阵列图表示,该阵列有4行,列数记为N_k,N_k等于分组长度除以32。
下表就是一个N_b=6的状态和N_k=4的密钥种子。一个明文分组按a00a10a20a30a01a11a21…的顺序影射到状态阵列中,同理,密钥种子按k00k10k20…的顺序影射到密钥种子阵列中。
a00 | a01 | a02 | a03 | a04 | a05 |
---|---|---|---|---|---|
a10 | a11 | a12 | a13 | a14 | a15 |
a20 | a21 | a22 | a23 | a24 | a25 |
a30 | a31 | a32 | a33 | a34 | a35 |
k00 | k01 | k02 | k03 |
---|---|---|---|
k10 | k11 | k12 | k13 |
k20 | k21 | k22 | k23 |
k30 | k31 | k32 | k33 |
加密过程
轮函数由四个部分组成:字节代替、行移位、列混合、加密钥。
字节代替
1、首先,将字节看作GF(28)上的元素,映射到自己的乘法逆;0字节影射到它自身。
2、其次,将字节看作GF(2)上的8维向量,做如下的(GF(2)上的;可逆的)仿射变换:
以上两个子变换所合成的字节代替采用一个8比特输入/8比特输出的S盒来实现。
行移位
是将状态阵列的隔行进行循环移位,不同状态行的位移量不同。第0行不移动,第一行循环左移C1个字节,第二行循环左移C2个字节,第三行循环左移C3个字节。位移量C1、C2、C3的选取与N_b有关,当N_b=4或6时,一般选取C1、C2、C3=1、2、3。
列混合
是将状态阵列的每个列视为系数在GF(28)上、次数小于4的多项式,被同一个固定的多项式c(x)进行模x4+1乘法。当然要求c(x)是模x4+1可逆的多项式,否则列混合变换是不可逆的,因而会使不同的明文分组具有相同的对应密文分组。
加密钥
是将单轮子密钥阵列简单的与课文阵列进行比特异或。要求同阶。
下附几张图示例:
字节代替
行移位
列混合
加密钥
迭代轮数N_r
N_r与N_b和N_k有关。其中前者是明文阵列的列数,后者是密钥种子阵列的列数。表如下:
N_r | N_b=4 | N_b=6 | N_b=8 |
---|---|---|---|
N_k=4 | 10 | 12 | 14 |
N_k=6 | 12 | 12 | 14 |
N_k=8 | 14 | 14 | 14 |
密钥拓展
RIJNDAEL的加密密钥的长度为4N_b(N_r+1)字节(32N_b(N_r+1)比特),这些加密密钥需要用4N_k字节的密钥种子经密钥扩展算法得到。
将密钥种子阵列的每一列称为一个字,则密钥种子共有N_k个字。要将其扩展为N_b(N_r+1) 个字的加密密钥,其中前N_k个字的加密密钥就是密钥种子阵列,后面的字是根据前面的字递归定义的。扩展算法有针对N_k≤6和针对N_k>6的两个版本。
解密过程
RIJNDAEL不是加解密相似的。
RIJNDAEL密码的设计显然忽视了解密算法的性能。
其中的原因有两个:一是解密算法性能的重要性远不如加密算法性能;在分组密码的许多应用中,解密算法是不使用的,比如消息认证码(MAC)、消息加密的CFB模式或OFB模式等。二是忽视解密算法性能会使加密算法的性能设计更加容易。