cryptfunction.exe已停止运行 有用过国密算法SM4的吗?
有用过国密算法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版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。