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


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

    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)
    其中,<<

    算法描述
    加密算法:
    本加密算法由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);

  • 相关阅读:
    .NET 6+Semantic Kernel快速接入OpenAI接口
    回调函数机制
    GAN-Tutorial procedural record
    2020同济大学电子与信息工程学院计算机系夏令营机试题目【含题解、注释】
    LYVE1抗体丨Relia Tech LYVE1抗体解决方案
    Python 数据可视化解决方案之 集成 PyPlot 和 PySimpleGUI (教程含源码)
    【DP】大厂真题:小红书2023秋招提前批-连续子数组最大和
    HarmonyOS Stage模型 应用配置文件讲解
    环境变量的参数
    internship:改了需求
  • 原文地址:https://blog.csdn.net/qq_38324605/article/details/126046702