SM4密码算法实现(C语言只使用stdio.h库)

SM4算法分析与实现

目录

加密流程图点这里


SM4算法简介

SM4密码算法是一个分组算法。数据分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮迭代结构。SM4密码算法以字节(8位)和字(32位)为单位进行数据处理。SM4密码算法是对合运算,因此解密算法与加密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。


SM4算法原理

基本运算
SM4密码算法使用模2加和循环移位作为基本运算。
- 模2加:⊕,32位异或运算
- 循环移位:<<< i,把32位字循环左移i位。

基本密码部件

  • S盒

    SM4的S盒是一种以字节为单位的非线性代替变换,其密码学的作用起混淆作用。S盒的输入和输出都是8位的字节,它本质上是8位的非线性置换。设输入字节为a,输出字节为b,则S盒的运算可表示为:
    b = S b o x ( a ) b=Sbox(a) b=Sbox(a)
    S盒的代替规则如下表所示。例如,设S盒的输入为EF,则5盒的输出为表中第E行与第F列交点处的值84,即Sbox(EF)= 84
    在这里插入图片描述

  • 非线性变换τ

    SM4的非线性变换τ是一种以字为单位的非线性代替变换。它由4个S盒并置构成。本质上它是S盒的一种并行应用。

    设输入字为A=(a0,a1,a2,a3),输出字为B=(b0,b1,b2,b3),则
    B = τ ( 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 ) ) B=τ(A)=(Sbox(a_0),Sbox(a_1),Sbox(a_2),Sbox(a_3)) B=τ(A)=(Sbox(a0)Sbox(a1)Sbox(a2)Sbox(a3))

  • 线性变换部件L

    线性变换部件L是以字为处理单位的线性变换部件,其输入输出都是32位的字。其密码学的作用是起扩散的作用。
    设L的输入为字B,输出为字C,则
    C = L ( B ) = B ⊕ ( B < < < 2 ) ⊕ ( B < < < 10 ) ⊕ ( B < < < 18 ) ⊕ ( B < < < 24 ) C=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24) C=L(B)=B(B<<<2)(B<<<10)(B<<<18)(B<<<24)

  • 合成变换T

    合成变换T由非线性变换τ和线性变换L复合而成,数据处理的单位是字。设输入为字,则先对X进行非线性τ变换,再进行线性L变换。记为
    T ( X ) = L ( τ ( X ) ) T(X) = L(τ(X)) T(X)=L(τ(X))
    由于合成变换T是非线性变换τ和线性变换L的复合,所以它综合起到混淆和扩散的作用,从而可提高密码的安全性。

轮函数
SM4密码算法采用对基本轮函数进行迭代的结构。利用上述基本密码部件,便可构成轮函数。SM4密码算法的轮函数是一种以字为处理单位的密码函数。
设轮函数F的输入为(X0,X1,X2,X3),四个32位字,共128位。轮密钥为RK,RK也是一个32位的字。轮函数F的输出也是一个32位的字。轮函数F的运算如下:
F ( X 0 , X 1 , X 2 , X 3 , R K ) = X 0 ⊕ T ( X 1 ⊕ X 2 ⊕ X 3 ⊕ R K ) F(X_0,X_1,X_2,X_3,RK)= X_0 ⊕ T(X_1 ⊕ X_2 ⊕ X_3 ⊕ RK) F(X0X1X2X3RK)=X0T(X1X2X3RK)

加密算法

SM4密码算法是一个分组算法。数据分组长度为128比特,密钥长度为128比特。加密算法采用32轮迭代结构,每轮使用一个轮密钥。
设输入明文为(X0,X1,X2,X3),四个字,共128位。输入轮密钥为RKi,i=0,1,…,31,共32个字。输出密文为(Y0,Y1,Y2,Y3),四个字,128位。则加密算法可描述如下:
X i + 4 = F ( X 1 , X i + 1 , X i + 2 , X i + 3 , R K i ) = X i ⊕ T ( X i + 1 ⊕ X i + 2 ⊕ X i + 3 ⊕ R K i ) ,   i = 0 , 1 , . . . , 31 X_{i+4}=F(X_1,X_{i+1},X_{i+2},X_{i+3},RKi)\\=X_i⊕T(X_{i+1}⊕X_{i+2}⊕X_{i+3}⊕RK_i),~i=0,1,...,31 Xi+4=F(X1Xi+1Xi+2Xi+3RKi)=XiT(Xi+1X

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值