带妹妹学密码系列三 ——分组密码(一)
经典密码:http://t.csdn.cn/bj95q。
分组密码算法(Block Cipher Algorithm)是将输入数据划成固定长度的组进行加密和解密的一类对称密码算法。安全性依赖于密钥安全,在这里我们将主要介绍DES,AES以及SM4算法
分组密码概述
利用分组密码对明文加密时,首先需要对明文进行分组,每组长度相同,然后最每组密文分别加密得到密文。
其中,x为明文,k为密钥,y为密文。E为加密算法,D为解密算法。
注:分组密码与流密码均为对称密码,区别在于分组密码输出的每一位数字不是只与对应时刻输入的明文数字有关,而是与一组长为n的明文数字有关。通常x,y等长,在存在数据扩展与数据压缩的情况下数据不等。
分组密码基本原理
代换
定义:明文分组到密文分组的可逆变换称为代换
为了满足加密算法的可逆性,即加密后可正确解密,每组明文都会产生唯一的一组密文,这样的变换是可逆的。
典型代表:S盒
该S盒为DES使用的S盒,该S盒为DES算法中唯一的非线性部件,是整个算法的安全性所在。该S盒为6bit输入4bit输出的变换。若给定该S盒的输入
b
0
b
1
b
2
b
3
b
4
b
5
b_{0}b_{1}b_{2}b_{3}b_{4}b_{5}
b0b1b2b3b4b5,其输出对应该矩阵第L行n列对应数的二进制数。L为由
b
0
b
5
b_{0}b_{5}
b0b5形成的十进制数表示,n为由
b
1
b
2
b
3
b
4
b_{1}b_{2}b_{3}b_{4}
b1b2b3b4形成的十进制数表示,这样每个S盒可用一个4×16矩阵来表示。例如,
S
1
S_{1}
S1的输入为011001,行选为01(第1行),列选为1100(第12列),行列交叉位置的数为9,其4位二进制数表示为1001,所以S的输出为1001。
扩散与混淆
目的:扩散(Diffusion)和混淆(Confusion)是由Shannon提出的设计密码系统的两种基本方法,目的是抗击攻击者对密码系统的统计分析。如果攻击者知道明文的某些统计特性,如消息中不同字母出现的频率、可能出现的特定单词或短语,而且这些统计特性以某种方式在密文中反映出来,那么攻击者就有可能得出加密密钥或其中一部分,或者得出包含加密密钥的一个可能的密钥集合。在被 Shannon称为理想密码的密码系统中,密文的所有统计特性都与所使用的密钥独立。
扩散:扩散是将明文的统计特性散布到密文中去,使明文的每位影响密文中多位的值,等价于密文中每位均受明文中多位的影响,即从密文中不能获得明文的统计特性。当然,理想的情况是让明文中的每位影响密文中的所有位,或者说让密文的每位受明文中的所有位的影响。
扩散的目的:使明文和密文之间的统计关系变得尽可能复杂,以使攻击者无法得到密钥。
混淆:使密文和密钥之间的统计关系变得尽可能复杂,以使攻击者无法得到密钥。
分组密码结构
Feistel加密结构
1:平衡的Feistel结构
设x为长度为2m的明文,其加密过程为:将x分为长度为m的两部分,分别记为
L
0
,
R
0
L_{0},R_{0}
L0,R0,即
x
=
L
0
R
0
x=L_{0}R_{0}
x=L0R0,对于
1
⩽
i
⩽
r
1\leqslant i\leqslant r
1⩽i⩽r有:
{
L
i
=
R
i
−
1
R
i
=
L
i
−
1
⊕
F
(
R
i
−
1
,
K
i
)
\left\{\begin{matrix} L_{i}=R_{i-1} \\ R_{i}=L_{i-1}\oplus F\left ( R_{i-1},K_{i} \right ) \end{matrix}\right.
{Li=Ri−1Ri=Li−1⊕F(Ri−1,Ki)
其中,F为一个加密函数,称为圈函数,
K
i
K_{i}
Ki是由密钥K产生的长度为tbit的子密钥,r为迭代次数,最后密文为
y
=
R
r
L
r
y=R_{r}L_{r}
y=RrLr。
解密过程为加密过程的逆过程。
2:非平衡的Feistel结构
Feistel结构同样存在弊端。众所周知,过去的分组密码都是64bit分组长度,而随着计算能力的提高,现在设计的分组密码都要求至少128bit分组长度。对于传统的Feistel网络,分组长度的增加意味着轮函数f规模的增加,而构造大规模的轮函数又是比较困难的,因此便提出了采用非平衡Feistel网络对较大的明文分组进行加密的方法。将明文分为n个运算字,进行n次迭代就能将明文全部覆盖一遍。
设x为长度为2m的明文,其加密过程为:将x分为长度为
n
1
,
n
2
n_{1},n_{2}
n1,n2的两部分,满足
n
1
+
n
2
=
2
m
n_{1}+n_{2}=2m
n1+n2=2m,分别记为
L
0
,
R
0
L_{0},R_{0}
L0,R0,即
x
=
L
0
R
0
x=L_{0}R_{0}
x=L0R0,对于
1
⩽
i
⩽
r
1\leqslant i\leqslant r
1⩽i⩽r有:
{
X
i
L
=
R
i
−
1
X
i
R
=
L
i
−
1
⊕
F
(
R
i
−
1
,
K
i
)
X
i
=
X
i
L
X
i
R
\left\{\begin{matrix} X_{i}^{L}=R_{i-1} \\ X_{i}^{R}=L_{i-1}\oplus F\left ( R_{i-1},K_{i} \right ) \\ X_{i}=X_{i}^{L}X_{i}^{R} \end{matrix}\right.
⎩
⎨
⎧XiL=Ri−1XiR=Li−1⊕F(Ri−1,Ki)Xi=XiLXiR
其中,
L
i
L_{i}
Li为
n
1
n_{1}
n1bit,
R
i
R_{i}
Ri为
n
2
n_{2}
n2bit。
K
i
K_{i}
Ki是由密钥K产生的长度为tbit的子密钥,r为迭代次数;F为一个加密函数,称为圈函数,为
G
F
(
2
)
2
n
GF(2)^n_{2}
GF(2)2nX
G
F
(
2
)
t
GF(2)^t
GF(2)t到
G
F
(
2
)
1
n
GF(2)^n_{1}
GF(2)1n的函数,最后密文为
y
=
X
r
L
X
r
R
y=X_{r}^{L}X_{r}^{R}
y=XrLXrR。
Feistel型分组密码的优点是加密过程与解密过程相似。在Feistel型分组密码的加密过程的最后一轮没有进行“左右交换”,目的就是可以利用同一个算法来实现加密和解密。
第一种非平衡Feistel网络如图所示
第二种非平衡Feistel网络如图所示,SM4分组密码算法所采用的网络结构与第二种非平衡Feistel 网络类似。
SP网络
SP型分组密码的圈变换如图所示。其中,x为长度为nbit的明文,
K
i
K_{i}
Ki为子密钥,首先对明文做非线性S变换,然后做线性变换P变换,共进行r轮迭代。在SP型分组密码中,代换S一般被称为混淆层,主要起混淆作用;置换或可逆的线性变换Р一般被称为扩散层,主要起扩散作用。
SP网络可以看作 Feistel网络的推广,但SP型分组密码的加密过程与解密过程一般不相似,即不能用同一个算法来实现加密和解密。(可以根据加解密过程是否相似来判断设计结构)
在后面章节中,我将介绍DES,AES以及SM4分组密码,欢迎指教!
补充:分组密码运行模式
分组密码在加密时,明文分组的长度是固定的,而在实际应用中待加密消息的数据量是不固定的,数据格式可能多种多样。为了能在各种应用场合使用DES,1980年NIST公布了DES的4种工作模式:电子密码本(Electronic Code Book,ECB)模式、密码分组链接(Cipher BlockChaining,CBC)模式、密码反馈(Cipher Feedback,CFB)模式和输出反馈(Output Feedback,OFB)模式。2000年3月,NIST为 AES公开征集工作模式,并在2001年12月公布了AES的5种工作模式,即 ECB、CBC、CFB、OFB和CTR(计数器模式,Counter Mode)。