赞
踩
分组密码(block cipher)是现代密码学广泛应用的重要体制之一,主要提供数据保密性,也可用于构造伪随机数生成器、流密码、认证码和哈希函数等方面。分组密码分为对称分组密码和非对称分组密码(公钥密码),分组密码在很多场合一般指是对称分组密码。由于分组密码加解密速度较快、安全性好,得到许多密码芯片的广泛支持与应用。
分组密码本质是一个从明文空间 P P P( m m m长的比特串集合)到密文空间 C C C( n n n长的比特串集合)的一一映射(一般 m = n = t m=n=t m=n=t)。
将明文消息经编码表示后的二进制序列
p
0
,
p
1
,
…
,
p
i
,
…
p0,p1,…,pi, …
p0,p1,…,pi,…划分成若干固定长度的组(或块)
p
=
(
p
0
,
p
1
,
…
,
p
m
−
1
)
p=(p_0,p_1,…,p_{m-1})
p=(p0,p1,…,pm−1),各组分别在密钥
k
=
(
k
0
,
k
1
,
…
,
k
t
−
1
)
k=(k_0,k_1,…,k_{t-1})
k=(k0,k1,…,kt−1)的控制下转换成长度为
n
n
n的密文分组
c
=
(
c
0
,
c
1
,
…
,
c
n
−
1
)
c=(c_0,c_1,…,c_{n-1})
c=(c0,c1,…,cn−1)。
(1)扩散 指算法使每一比特明文的变化尽可能多地影响到输出密文序列的变化,以便隐蔽明文的统计特性;并且每一位密钥的影响也尽可能迅速地扩展到较多的输出密文比特中去。即扩散的目的是希望密文中的任一比特都要尽可能与明文、密钥相关联,或者说,明文和密钥中任何一比特值得改变,都会在某种程度上影响到密文值的变化(又称雪崩效应),以防止将密钥分解成若干个孤立的小部分,然后各个击破。
(2)混乱 指在加密变换过程中是明文、密钥以及密文之间的关系尽可能地复杂化,以防密码破译者采用统计分析法进行破译攻击。混乱可以用“搅拌”来形象地解释,将一组明文和一组密文输入到算法中,经过充分混合,最后变成密文。同时要求,执行这种“混乱”作业的每一步都必须是可逆的,即明文混乱以后能得到密文,反之,密文经过逆向混乱操作后能恢复出明文。
乘积密码就是以某种方式连续执行两个或多个密码,使得最后结果或乘积从密码编码的角度比其任意一个组成密码都更强。
设 S 1 = ( M 1 , C 1 , K 1 , E 1 , D 1 ) S_{1}=\left(M_{1}, C_{1}, K_{1}, E_{1}, D_{1}\right) S1=(M1,C1,K1,E1,D1) 和 S 2 = ( M 2 , C 2 , K 2 , E 2 , D 2 ) S_{2}=\left(M_{2}, C_{2}, K_{2}, E_{2}, D_{2}\right) S2=(M2,C2,K2,E2,D2) 是两个密码体制, S 1 × S 2 S_{1} \times S_{2} S1×S2定义了乘积密码体制: ( M 1 × M 2 , C 1 × C 2 , K 1 × K 2 , E 1 × E 2 , D 1 × D 2 ) \left(M_{1} \times M_{2}, C_{1} \times C_{2}, K_{1} \times K_{2}, E_{1} \times E_{2}, D_{1} \times D_{2}\right) (M1×M2,C1×C2,K1×K2,E1×E2,D1×D2)实际应用中,明文空间和密文空间往往相同, 即 M 1 = M 2 = C 1 = C 2 M_{1}=M_{2}=C_{1}=C_{2} M1=M2=C1=C2 , 则乘积密码体制 S 1 × S 2 S_{1} \times S_{2} S1×S2 可简化为 ( M , M , K 1 × K 2 , E , D ) \left(M, M, K_{1} \times K_{2}, E, D\right) (M,M,K1×K2,E,D) 其中, E = E 1 × E 2 , D = D 1 × D 2 E=E_{1} \times E_{2}, D=D_{1} \times D_{2} E=E1×E2,D=D1×D2
对任意明文 x ∈ M x \in M x∈M和密钥 k = ( k 1 , k 2 ) ∈ K 1 × K 2 k=\left(k_{1}, k_{2}\right) \in K_{1} \times K_{2} k=(k1,k2)∈K1×K2, 加密变换为: E k ( x ) = E k 2 ( E k 1 ( x ) ) E_{k}(x)=E_{k 2}\left(E_{k 1}(x)\right) Ek(x)=Ek2(Ek1(x)) 对任意密文 y ∈ M y \in M y∈M和密钥 k = ( k 1 , k 2 ) ∈ K 1 × K 2 k=\left(k_{1}, k_{2}\right) \in K_{1} \times K_{2} k=(k1,k2)∈K1×K2, 解密变换为: D k ( x ) = D k 1 ( D k 2 ( y ) ) D_{k}(x)=D_{k 1}\left(D_{k 2}(y)\right) Dk(x)=Dk1(Dk2(y)) 设 S S S是一个明文空间和密文空间相同的密码体制 S n = def S × S × ⋯ × S ⏟ n S^{n} \stackrel{\text { def }}{=} \underbrace{S \times S \times \cdots \times S}_{n} Sn= def n S×S×⋯×S则 S n S^{n} Sn称为迭代密码体制。
如果 S 2 = S S^{2}=S S2=S, 则称 S S S是等幂的密码体制。置换密码、仿射密码、Vigenere 密码以及 Hill 密码等许多传统密码体制都是幂等的密码体制。对于幂等的密码体制, 则没有必要使用迭代密码体制 S 2 S^{2} S2, 因为 S 2 S^{2} S2需要更多的密钥但其安全强度与 S S S一样。
如果 S S S不是幂等的密码体制, 则对 n > 1 n>1 n>1 ,迭代密码体制 S n S^{n} Sn的安全强度会比 S S S高, 这种通过对一个密码体制进行迭代来提高其安全强度的思想被广泛应用于对称密码体制的设计中, 通常称之为密码体制的迭代结构。具体地, 就是在密钥控制下扩散和混乱两种基本密码操作的多次迭代,每次迭代中的各种基本密码操作总体,称之为轮函数。
(1) SP网络
代换-置换网络(Subsituation Permutation Network) 简称SP网络,是由多重**S变换(S盒,混乱)和P变换(P盒,扩散)**组合成的变换网络,是乘积密码的一种常见表现形式。
SP网络中的S盒是许多密码算法唯一的非线性部件,其密码强度决定了整个密码算法的强度。
SP网络具有雪崩效应,即输入(明文或密钥)即使只有很小的变化,也会导致输出(密文)产生巨大变化。
(2)Feistel网络
Feistel网络由Feistel提出,保证了算法可逆性,即加密和解密可以采用同一算法实施。
长度为
n
n
nbit(
n
n
n为偶数)的明文分组分为左右各长为
n
/
2
n/2
n/2的两部分:
L
L
L和
R
R
R。定义迭代算法如下:
L
i
=
R
i
−
1
L_i = R_{i-1}
Li=Ri−1
R
i
=
L
i
−
1
⊕
f
(
R
i
−
1
,
K
i
)
R_i = L_{i-1}\oplus f(R_{i-1},K_i)
Ri=Li−1⊕f(Ri−1,Ki)其中,
K
i
K_i
Ki是第
i
i
i轮使用的子密钥,
f
f
f是任意轮函数。
(1)算法要求
(2)设计准则
美国国家标准局(NBS,National Bureau of Standards)于1973年开始征集联邦数据加密标准,许多公司提交了算法,IBM公司的Lucifer加密系统最终胜出。经过两年多的公开讨论,1977年1月15日NBS决定利用这个算法,并将其更名为数据加密标准(DES,Data Encryption Standards)。
DES是第一个广泛应用于商用数据保密的密码算法,当时确定有效期为5年,随后在1983年、1988年、1993年三次再度授权该算法续用五年,直到1997年开始征集高级加密标准,2000年选定比利时人设计的Rijndael算法作为新标准。
DES加密主要分为三个阶段:
形式化描述如下:
i
i
i:迭代次数
⊕
\oplus
⊕:逐位模2求和
f
f
f:加密函数
初始置换
I
P
IP
IP及逆初始置换
I
P
−
1
IP^{-1}
IP−1按照置换表进行换位,无密码意义。
DES的轮函数 F F F由三部分组成:扩展置换(E盒)、非线性代换(S盒)、线性置换(P盒)。
(1)扩展置换
扩展置换(E盒)将32位输入扩展为48位输出。扩展方法为:将48位输出按8行6列的次序排列,排列时,将输入位序号按32、1、2、…、31的次序依次排列,但上一行的后两位依次在下一行的起始位置重用。
E盒产生与子密钥相同长度的数据使得能进行异或运算,同时,扩展后的数据在S盒的作用下能进行压缩,实现了非线性变换。此外,由于E盒输入的1位影响2个S盒的输入,所以输出对输入的依赖性将传播更快,从而快速实现雪崩效应。
(2)压缩代换
代换盒(S盒)的功能是进行非线性代换,它是DES中唯一的非线性部分,DES的安全强度主要取决于S盒的安全强度。S盒是一个查表运算,8个S盒分别对应8个非线性的代换表。输入的48位数据分成8组,每组6位作为分别进入8个S盒进行运算。每个S盒的输入均为6位,输出为4位。这样,经过S盒代换之后,E盒扩展生成的48位数据又重新被压缩成32位数据。
S盒的查表方法:假设S盒的6位输人为
b
1
b
2
b
3
b
4
b
5
b
6
b_1b_2b_3b_4b_5b_6
b1b2b3b4b5b6,则将
b
1
b_1
b1
b
6
b_6
b6组合,形成1个两位数,这两位数可以转换成十进制的
0
−
3
0-3
0−3的某个数,它对应表的行号,其余4位
b
2
b
3
b
4
b
5
b_2b_3b_4b_5
b2b3b4b5构成了1个4位数,可转化为
0
−
15
0-15
0−15的某个数,对应表的号,通过6位输人确定的行号和列号所对应位置的值作为输出。
S盒的设计特点:
此外,S盒的设计标准被列入官方机密,并未公开,因此无法确信DES内部结构没有陷门,美国国家安全局有可能利用这些陷门在没有密钥的情况下解密。
(3)置换运算
置换运算(P盒)按照列表进行简单位置置换。
初始密钥64位通过置换选择PC-1得到有效的56位密钥,然后分为2个28位数据 C 0 C_0 C0和 D 0 D_0 D0。每轮迭代中, C i − 1 C_{i-1} Ci−1和 D i − 1 D_{i-1} Di−1分别循环左移1位或2位,移位后的值作为下一轮输入,同时也作为置换选择PC-2的输入,通过置换选择PC-2产生48位的输出,即为一个子密钥。
(1)互补性
对明文
m
m
m逐位取补,记为
m
ˉ
\bar{m}
mˉ,密钥
k
k
k逐位取补,记为
k
ˉ
\bar{k}
kˉ,若
c
=
E
k
(
m
)
c=E_k(m)
c=Ek(m),则
c
ˉ
=
E
k
ˉ
(
m
ˉ
)
\bar{c}=E_{\bar{k}}(\bar{m})
cˉ=Ekˉ(mˉ)。其中
m
ˉ
、
k
ˉ
、
c
ˉ
\bar{m}、\bar{k}、\bar{c}
mˉ、kˉ、cˉ分别表示对
m
、
k
、
c
m、k、c
m、k、c按位取反。
则该特性被称为算法的互补性,互补性表明,如果用某个密钥加密一个明文分组得到一个密文分组,那么用该密钥的补密钥加密该明文分组的补得到的是该密文分组的补。
由于DES算法中的两次异或运算(1次在S盒之前,1次在P盒之后)使其具有互补性,因此DES在选择明文攻击下所需工作量减半,仅需测试 2 55 2^{55} 255个密钥( 2 56 2^{56} 256个密钥的一半)。
(2)弱密钥
给定初始密钥 K K K,若子密钥生成器得到各个子密钥都相同,即 K 1 = K 2 = . . . K 16 K_1 = K_2 = ... K_{16} K1=K2=...K16则称初始密钥 K K K为弱密钥(Weak Key)。
若 K K K为弱密钥,则对任意64位数据 M M M,有 E K ( E K ( M ) ) = M , D K ( D K ( M ) ) = M E_K(E_K(M))=M,D_K(D_K(M))=M EK(EK(M))=M,DK(DK(M))=M即加密和解密没有区别。
弱密钥的产生是由于密钥生成器中的C和D的存数载循环移位时没有发生变化,DES的弱密钥共4个。
给定初始密钥 K K K,若子密钥生成器得到子密钥只有2种,且每种都出现8次,则称 K K K为半弱密钥(Semi-weak Key)。半弱密钥是成对出现的,且是互补的。此外还有 1 / 4 1/4 1/4弱密钥和 1 / 8 1/8 1/8弱密钥。
DES共有256个安全性较差的密钥,包括所有的弱密钥、半弱密钥、 1 / 4 1/4 1/4弱密钥和 1 / 8 1/8 1/8弱密钥,这相对于密钥空间 2 256 2^{256} 2256是一个很小的数,且是能够识别的。
为了提高DES的安全性能,并充分利用有关DES的现有软件和硬件资源,可以使用多重DES。多重DES就是使用多个密钥利用DES对明文进行多次加密。使用多重DES可以增加密钥量,从而大大提高抵抗对密钥的穷举搜索攻击的能力。已经证明多重DES并不等价于使用一个56位密钥的单重DES,常用的为三重DES。
为确定一个安全性能更好的分组密码算法以取代DES,1997年美国国家标准与技术研究院(NIST,National Institute of Standards and Technology)公开征集高级加密标准(AES,Advanced Encryption Standard)。AES的基本要求是安全性能不低于三重DES,性能比三重DES快。NIST特别提出了高级加密标准必须是分组长度为128位的对称分组密码,且支持长度为128位、192位、256位的密钥。此外,如果算法被选中,在世界范围内须是可免费获得的。
2000年10月2日,NIST宣布最终评选结果,根据安全性(稳定的数学基础、无算法弱点、可抗密码分析)、性能(速度快)、大小(内存与存储空间占用小)、易实现(良好的软硬件适应性)等标准,比利时密码学家Joan Daemen和Vincent Rijmen提出的“Rijndael数据加密算法”最终获胜。修改的Rijndael算法成为高级加密标准AES,2001年11月26日,NIST正式公布高级加密标准AES,并于2002年5月26日正式生效。
AES分组长度只能是128位,密钥的长度可以使用128位、192位或256位三者中的任意一种。密钥长度不同,则加密轮数不同,如表所示。
密钥长度(32比特字) | 分组长度(32比特字) | 加密轮数 | |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
AES处理单位是字节,128位输入明文分组 P P P和输入密钥 K K K都被分成16个字节( 4 × 4 4\times 4 4×4)。明文分组用以字节为单位的正方形矩阵描述,称为状态(State)矩阵。
AES由四个的阶段组成:字节代换、行位移、列混淆、轮密钥加,未使用Feistel结构,解密过程与加密过程并不一致。
(1)字节代换
AES的字节代换可以简化成一个简单的查表操作,定义了一个S盒用于加密查表,一个逆S盒用于解密查表,都是由 16 × 16 16\times 16 16×16字节组成的矩阵,即矩阵共有 256 256 256元素,每元素的内容是一个1个字节(8bit)的值,且每元素各不相同。
状态矩阵中的元素按照以下方式映射为一个新的字节:该字节的高4位作为行值,低4位作为列值,取出S盒(或逆S盒)中对应列的元素作为输出。
(2)行移位
行移位操作用于S盒的输出,将列的4个行螺旋地左移,即第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示。
行移位使得列完全进行了重排,即在移位后的每列中,都包含有未移位前每个列的一个字节。接下来就可以进行列内混合了。(逆向行移位变换将中间态数据的后三行执行相反方向的移位操作)
(3)列混合
列混合变换由经移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵。
列混淆变换的矩阵系数是基于在码字间有最大距离的线性编码,这使得在每列的所有字节中有良好的混淆性。列混淆变换和行移位变换使得在经过几轮变换后,所有的输出位均与所有的输入位相关。
(4)轮密钥加
轮密钥加是将128位轮密钥 K i K_i Ki同状态中的数据进行逐位异或操作,密钥 K i K_i Ki中每个字 w [ 4 i ] , w [ 4 i + 1 ] , w [ 4 i + 2 ] , w [ 4 i + 3 ] w[4i],w[4i+1],w[4i+2],w[4i+3] w[4i],w[4i+1],w[4i+2],w[4i+3]为32bit,包含4个字节( w [ 4 i ] , i = 0.1. … , 10 w[4i],i=0.1.…,10 w[4i],i=0.1.…,10)的生成过程。该过程可以看成字逐位异或的结果,也可以看成字节级别或者位级别的操作。
AES将初始密钥输入到 4 × 4 4 \times 4 4×4的矩阵中,矩阵每一列的4个自己组成一个字,一次命名为 w [ 0 ] w [ 1 ] w [ 2 ] w [ 3 ] w[0]w[1]w[2]w[3] w[0]w[1]w[2]w[3],构成一个以字为单位的数组 w w w。
然后以递归的反噬产生40的新列,对 w w w数组进行扩充:
其中, T T T是一个复杂函数,有3部分组成:字循环、字节代换和轮常量异或
密钥扩展的设计标准:
(1)相似之处
(2)不同之处
国际数据加密算法(IDEA, International Data Encryption Algorithm)由瑞士的来学嘉(Xuejia Lai)和 James Massey于1990年公布,当时称为推荐加密标准(PES, Proposed Encryption Standard)。1991年,为抗击差分密攻击,他们对算法进行了改进,称为改进推荐加密标准(IPES,Im proved PES),并于1992年改名为国际数据加密算法IDEA。
IDEA受专利保护,要先获得许可证之后才能在商业应用程序中使用,著名的电子邮件隐私技术PGP就是基于IDEA的。
IDEA的明文分组也是64位,密钥为128位,其加解密也是相似的,即可以用相同算法加密和解密。
64位输人明文块分成4个部分,各16位, P 1 , P 2 , P 3 , P 4 P_1,P_2,P_3,P_4 P1,P2,P3,P4为算法第1轮的输人。每一轮从原先的128密钥产生6个子密钥,各为16位。这6个子密钥作用于4个状态块。第8轮之后是输出变换,用4个子密钥 K 49 , K 50 , K 51 , K 52 K_{49},K_{50},K_{51},K_{52} K49,K50,K51,K52,产生的最后输出,即密文块 C 1 , C 2 , C 3 , C 4 C_1,C_2,C_3,C_4 C1,C2,C3,C4(各16位)构成64位密文块。
IDEA共有8轮,每一轮输入为6个子密钥
K
1
−
K
6
K_1 - K_6
K1−K6和4个状态数据块
P
1
,
P
2
,
P
3
,
P
4
P_1,P_2,P_3,P_4
P1,P2,P3,P4。
⊞
\boxplus
⊞:表示模
2
16
2^{16}
216加
⨀ \bigodot ⨀:表示模 2 16 + 1 2^{16}+1 216+1乘
⨁ \bigoplus ⨁:表示异或
IDEA使用128位密钥,没有DES意义下的弱密钥,能够抗差分分析和相关分析。
实际消息长度一般大于分组密码的分组长度,分组密码将消息分为固定长度的数据块来逐块处理。人们设计了许多不同的块处理方式,称为分组密码的工作模式,通常是基本密码模块、反馈和一些简单运算的组合。这些工作模式同时为密文分组提供了一些其他性质,如隐藏明文的统计特性、错误传播控制、流密码的密钥流生成等。
NIST在FIPS 81中定义了4种工作模式,由于新的应用和要求的出现,在800-38A中将推荐模式扩展为5个,可用于包括三重DES和AES在内的任何分组密码。
模式 | 描述 | 典型应用 |
---|---|---|
电子密码本(ECB) | 用相同的密钥分别对明文组加密 | 单个数据的安全传输(如一个加密密钥) |
密码分组链接(CBC) | 算法输人是上一个密文组和下一个明文组的异或 | 普通目的面向分组的传输 认证 |
密码反馈(CFB) | 一次处理j位,上一分组密文作为加密算法的输入,用产生一个伪随机数输出与密文异或作为下一分组的输入 | 普通目的面向分组的传输 认证 |
输出反馈(OFB) | 与CFB基本相同,只是加密算法的输人是上一次加密的输出 | 噪声频道上的数据流的传输(如卫星通信) |
计数器(CTR) | 每个明文分组都与一个加密技术器相异或。对每个后续分组计数器递增 | 普通目的面向分组的传输 高速需求 |
电子密码本(ECB, Electronic Code Book)模式一次处理一个明文分组,各个明文分组被独立加密成相应的密文分组,主要用于**内容较短且随机的报文(如密钥)**的加密传递。
密码分组链接(CBC, Cipher Block Chaining)模式应用了反馈机制,明文在加密之前需要与前面的密文进行异或,即每个密文分组不仅依赖于产生它的明文分组,还依赖于它前面的所有分组。CBC适合文件加密,是软件加密的最佳选择。
密码反馈(CFB, Cipher Feedback Block)将消息看作比特流,无需接受完整个数据分组后才能进行加解密,是自同步序列密码算法的典型例子,通常用于加密字符序列。
输出反馈(OFB, Output Feedback Block)是基于分组密码的同步序列密码算法的一种例子。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。