带妹妹学密码系列三 ——分组密码(二)

在分组密码(一)(分组密码(一))中介绍了分组密码的基础知识,在该章节中,我将介绍具体的密码方案,希望通过具体方案的学习,对分组密码有更深的认识。对于使用到的基础知识,在该章不再累述,有需要的朋友请看一下分组密码(一)中的基础知识。

AES DES

在前面部分已有介绍,感兴趣的朋友可以看一下.
AES直通车:AES
DES直通车:DES

SM4 分组密码算法

中华人民共和国国密行业标准 GM/T 0002-2012
SM4分组密码算法是一种迭代分组密码算法,采用非平衡Feistel结构,分组长度为128bit,密钥长度为128bit。该算法由初始变量算法和密钥扩展算法组成,都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。SM4分组密码算法可以抵抗穷举攻击、差分攻击、线性攻击等攻击手段。
密钥及密钥参量
加密密钥长度是128bit,表示为 M K = ( M K 0 , M K 1 , M K 2 , M K 3 ) MK=\left (MK_{0},MK_{1},MK_{2},MK_{3} \right ) MK=(MK0,MK1,MK2,MK3), ,其中 M K i i = 0 , 1 , 2 , 3 MK_{i} i=0,1,2,3 MKii=0,1,2,3为字(字为32比特字符串)。
轮密钥表示为 ( r k 0 , r k 1 , r k 2 , r k 3 ) \left (rk_{0},rk_{1},rk_{2},rk_{3} \right ) (rk0,rk1,rk2,rk3),其中 r k i i = 0 , 1 , 2 , 3 rk_{i} i=0,1,2,3 rkii=0,1,2,3为32比特字。轮密钥由加密密钥生成。
F K = ( F K 0 , F K 1 , F K 2 , F K 3 ) FK=\left (FK_{0},FK_{1},FK_{2},FK_{3} \right ) FK=(FK0,FK1,FK2,FK3)为系统参数, C K = ( C K 0 , C K 1 , . . . , C K 31 ) CK=\left (CK_{0},CK_{1},...,CK_{31} \right ) CK=(CK0,CK1,...,CK31)为固定参数,用于密钥扩展算法,其中 F K i i = 0 , 1 , 2 , 3 FK_{i} i=0,1,2,3 FKii=0,1,2,3, C K i i = 0 , . . . , 31 CK_{i} i=0,...,31 CKii=0,...,31为字。
轮函数F
轮函数结构:
输入: ( X 0 , X 1 , X 2 , X 3 ) ∈ ( Z 2 32 ) 4 \left (X_{0},X_{1},X_{2},X_{3} \right )\in \left (Z_{2}^{32} \right )^{4} (X0,X1,X2,X3)(Z232)4,轮密钥为 r k ∈ Z 2 32 rk\in Z_{2}^{32} rkZ232
输出: F ( X 0 , X 1 , X 2 , X 3 , r k ) = X 0 ⊕ T ( X 1 ⊕ X 2 ⊕ X 3 ⊕ r k ) F\left (X_{0}, X_{1},X_{2},X_{3},rk\right )=X_{0}\oplus T\left ( X_{1}\oplus X_{2}\oplus X_{3}\oplus rk\right ) F(X0,X1,X2,X3,rk)=X0T(X1X2X3rk)
其中,T为合成置换函数。
T: Z 2 32 → Z 2 32 Z_{2}^{32}\rightarrow Z_{2}^{32} Z232Z232是一个可逆变换,由非线性变换 τ \tau τ 和线性变换L复合而成,即 T ( . ) = L ( τ ( . ) ) T(.)=L(\tau(.)) T(.)=L(τ(.))
(1)非线性变换 τ \tau τ由4个并行的S盒构成
输入: A = ( a 0 , a 1 , a 2 , a 3 ) ∈ ( Z 2 8 ) 4 A=\left ( a_{0},a_{1},a_{2},a_{3}\right )\in \left ( Z_{2}^{8} \right )^{4} A=(a0,a1,a2,a3)(Z28)4
输出: B = ( b 0 , b 1 , b 2 , b 3 ) ∈ ( Z 2 8 ) 4 B=\left ( b_{0},b_{1},b_{2},b_{3}\right )\in \left ( Z_{2}^{8} \right )^{4} B=(b0,b1,b2,b3)(Z28)4
其中, ( b 0 , b 1 , b 2 , b 3 ) = τ ( A ) = ( S b o x ( a 0 ) , S b o x ( a 1 ) , S b o x ( a 2 ) , S b o x ( a 3 ) ) \left ( b_{0},b_{1},b_{2},b_{3}\right )=\tau(A)=(Sbox(a_{0}),Sbox(a_{1}),Sbox(a_{2}),Sbox(a_{3})) (b0,b1,b2,b3)=τ(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3)),Sbox为S盒。

在这里插入图片描述
举例: a 0 = E F ∈ Z 2 8 a_{0}=EF\in Z_{2}^{8} a0=EFZ28,则 S b o x ( a 0 ) = 84 ∈ Z 2 8 Sbox(a_{0})=84\in Z_{2}^{8} Sbox(a0)=84Z28
方法:找表格的第E行第F列即为S盒输出。
(2)线性变换L
非线性变换 τ \tau τ的输出是线性变换L的输入。
输入: B ∈ Z 2 32 B\in Z_{2}^{32} BZ232
输出: C = L ( B ) = B ⊕ ( B < < < 2 ) ⊕ ( B < < < 10 ) ⊕ ( B < < < 18 ) ⊕ ( B < < < 24 ) C=L\left ( B \right )=B\oplus \left ( B<<<2 \right )\oplus \left ( B<<<10 \right )\oplus \left ( B<<<18 \right )\oplus \left ( B<<<24 \right ) C=L(B)=B(B<<<2)(B<<<10)(B<<<18)(B<<<24)
其中,<<<i为32位循环左移i位。

算法描述
加密算法:
本加密算法由32次迭代运算和1次反序变换R组成。
明文输入: ( X 0 , X 1 , X 2 , X 3 ) ∈ ( Z 2 32 ) 4 \left (X_{0},X_{1},X_{2},X_{3} \right )\in \left (Z_{2}^{32} \right )^{4} (X0,X1,X2,X3)(Z232)4
密文输出: ( Y 0 , Y 1 , Y 2 , Y 3 ) ∈ ( Z 2 32 ) 4 \left (Y_{0},Y_{1},Y_{2},Y_{3} \right )\in \left (Z_{2}^{32} \right )^{4} (Y0,Y1,Y2,Y3)(Z232)4
轮密钥为:轮密钥为 r k i ∈ Z 2 32 , i = 0 , 1 , . . . , 31 rk_{i}\in Z_{2}^{32},i=0,1,...,31 rkiZ232,i=0,1,...,31
加密流程:
(1)、32次迭代运算: X i + 4 = F ( X i , X i + 1 , X i + 2 , X i + 3 , r k i ) , i = 0 , 1 , . . . , 31 X_{i+4}=F\left ( X_{i},X_{i+1},X_{i+2},X_{i+3},rk_{i} \right ),i=0,1,...,31 Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1,...,31
(2)、反序变换: ( Y 0 , Y 1 , Y 2 , Y 3 ) = R ( X 32 , X 33 , X 34 , X 35 ) = ( X 35 , X 34 , X 33 , X 32 ) \left (Y_{0}, Y_{1},Y_{2},Y_{3} \right )= R\left ( X_{32},X_{33},X_{34},X_{35} \right )=\left ( X_{35},X_{34},X_{33},X_{32} \right ) (Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)
解密算法:
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序、解密时,使用轮密钥序 r k 31 , r k 30 , . . . , r k 0 rk_{31},rk_{30},...,rk_{0} rk31,rk30,...,rk0
在这里插入图片描述

密钥扩展算法
由加密密钥生成轮密钥的方法。
加密密钥为 M K = ( M K 0 , M K 1 , M K 2 , M K 3 ) ∈ ( Z 2 32 ) 4 MK=\left (MK_{0},MK_{1},MK_{2},MK_{3} \right )\in \left (Z_{2}^{32} \right )^{4} MK=(MK0,MK1,MK2,MK3)(Z232)4
轮密钥生成算法: ( K 0 , K 1 , K 2 , K 3 ) = ( M K 0 ⊕ F K 0 , M K 1 ⊕ F K 1 , M K 2 ⊕ F K 2 , M K 3 ⊕ F K 3 ) \left ( K_{0},K_{1},K_{2},K_{3}\right )=\left ( MK_{0}\oplus FK_{0},MK_{1}\oplus FK_{1},MK_{2}\oplus FK_{2},MK_{3}\oplus FK_{3} \right ) (K0,K1,K2,K3)=(MK0FK0,MK1FK1,MK2FK2,MK3FK3),
r k i = K i + 4 = K i ⊕ T ′ ( K i + 1 ⊕ K i + 2 ⊕ K i + 3 ⊕ C k i ) , i = 0 , 1 , . . . , 31 rk_{i}=K_{i+4}=K_{i}\oplus T'\left ( K_{i+1}\oplus K_{i+2}\oplus K_{i+3}\oplus Ck_{i} \right ),i=0,1,...,31 rki=Ki+4=KiT(Ki+1Ki+2Ki+3Cki),i=0,1,...,31
其中,T’为前面加密算法介绍的函数T中线性变换L代替成L’
L ′ ( B ) = B ⊕ ( B < < < 13 ) ⊕ ( B < < < 23 ) L'\left ( B \right )=B\oplus \left ( B<<<13 \right )\oplus \left ( B<<<23 \right ) L(B)=B(B<<<13)(B<<<23)
FK初始值: F K 0 FK_{0} FK0=(A3B1BAC6), F K 1 FK_{1} FK1=(56AA3350), F K 2 FK_{2} FK2=(677D9197), F K 3 FK_{3} FK3=(B27022DC);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘橘的成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值