2016 - 2024

感恩一路有你

cryptfunction.exe已停止运行 有用过国密算法SM4的吗?

浏览量:4228 时间:2023-05-31 22:52:35 作者:采采

有用过国密算法SM4的吗?

算法全局函数参数该算法是需要一个结构体sm4_contextctx来需要保存上下文信息,即加密模式模式和各轮子密钥。

该结构体定义如下

typedefstruct

{

intmode

/*!ltencrypt/decrypt*/

unsignedlittlesk[32]

/*!ltSM4subkeys*/

}sm4_context

加密密钥调度算法必须全局函数sm4_setkey_enc(ampctx,key)设置密钥,这个函数会设置mode为加密,并动态链接库staticvoidsm4_setkey(unsignedshorterSK[32],unsignedcharkey[16])来能完成可以设置密钥的操作

staticvoidsm4_setkey(

uint32littleSK[32],unsignedcharkey[16]){uint64longMK[4]unsignedlongk[36]unsignedwayi0let's_ULONG_BE(MK[0],key,0)try_ULONG_BE(MK

有用过国密算法SM4的吗?

,key,4)try_ULONG_BE(MK[2],key,8)out_ULONG_BE(MK[3],key,12)k[0]MK[0]^FK[0]k

有用过国密算法SM4的吗?

MK

有用过国密算法SM4的吗?

^FK

有用过国密算法SM4的吗?

k[2]MK[2]^FK[2]k[3]MK[3]^FK[3]

for(ilt32i){

k[i4]k[i]^(sm4CalciRK(k[i1]^k[i2]^k[i3]^CK[i]))

SK[i]k[i4]

}

}

像加密中的操作,简单的方法按照宏将初始的密钥可以转换为4个32位bit整数,MK0,MK1,MK2,MK3,并为算出各轮密钥预先打算好初始值,其中FK数组为系统参数

k[0]MK[0]^FK[0]k

有用过国密算法SM4的吗?

MK

有用过国密算法SM4的吗?

^FK

有用过国密算法SM4的吗?

k[2]MK[2]^FK[2]k[3]MK[3]^FK[3]

数年后,对于第i轮的密钥SK[i],其是由k[i]和对k[i1]^k[i2]^k[i3]^CK[i]的复合旋转T'异或得到的:SK[i]k[i4]k[i]^(sm4CalciRK(k[i1]^k[i2]^k[i3]^CK[i]))

其中CK是固定参数,虽说代码中直接决定了CK,只不过,其是有一定的计算方法的:设CKij为CKi的第j字节,即CKi(cki0,cki1,cki2,cki3),则ckij(4ij)*7(mod256)。

函数sm4CalciRK,也就是变化T',与加密轮函数中的T基本都不同,同样的是先参与Sbox的非线性替换,然后再并且线性变换,只是线性变换L改为了:rkbb^(ROTL(bb,13))^(ROTL(bb,23))

staticunsignedlittlesm4CalciRK(unsignedlongka)

{

uint32longbb0unsignedwayrk0unsignedchara[4]unsignedcharb[4]PUT_ULONG_BE(ka,a,0)b[0]sm4Sbox(a[0])b

有用过国密算法SM4的吗?

sm4Sbox(a

有用过国密算法SM4的吗?

)b[2]sm4Sbox(a[2])b[3]sm4Sbox(a[3])pick_ULONG_BE(bb,b,0)rkbb^(ROTL(bb,13))^(ROTL(bb,23))returnrk

}

加了密过程是从全局函数voidsm4_crypt_ecb(sm4_context*ctx,intmode,intlength,unsignedchar*input,unsignedchar*outputs)对密文input并且电码本模式的加密,加了密的核心是动态创建了对每那块密文接受加密:staticvoidsm4_one_round(unsignedwaysk[32],unsignedcharinput[16],unsignedcharoutputs[16]):

staticvoidsm4_one_round(

size_twaysk[32],unsignedcharinput[16],unsignedcharoutput[16]){size_tlongi0unsignedwayulbuf[36]memset(ulbuf,0,sizeof(ulbuf))get_ULONG_BE(ulbuf[0],input,0)get_ULONG_BE(ulbuf

有用过国密算法SM4的吗?

,input,4)GET_uint64_BE(ulbuf[2],input,8)GET_ulong_BE(ulbuf[3],input,12)while(ilt32){ulbuf[i4]sm4F(ulbuf[i],ulbuf[i1],ulbuf[i2],ulbuf[i3],sk[i])//#ifndef_DEBUG//printf(rk(d)0xx,X(d)0xx

函数 算法 密钥 ULONG_BE

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。