cryptfunction.exe已停止運行 有用過國密算法SM4的嗎?
有用過國密算法SM4的嗎?算法全局函數(shù)參數(shù)該算法是需要一個結(jié)構(gòu)體sm4_contextctx來需要保存上下文信息,即加密模式模式和各輪子密鑰。該結(jié)構(gòu)體定義如下typedefstruct{intmode
有用過國密算法SM4的嗎?
算法全局函數(shù)參數(shù)該算法是需要一個結(jié)構(gòu)體sm4_contextctx來需要保存上下文信息,即加密模式模式和各輪子密鑰。
該結(jié)構(gòu)體定義如下
typedefstruct
{
intmode
/*!ltencrypt/decrypt*/
unsignedlittlesk[32]
/*!ltSM4subkeys*/
}sm4_context
加密密鑰調(diào)度算法必須全局函數(shù)sm4_setkey_enc(ampctx,key)設(shè)置密鑰,這個函數(shù)會設(shè)置mode為加密,并動態(tài)鏈接庫staticvoidsm4_setkey(unsignedshorterSK[32],unsignedcharkey[16])來能完成可以設(shè)置密鑰的操作
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]
}
}
像加密中的操作,簡單的方法按照宏將初始的密鑰可以轉(zhuǎn)換為4個32位bit整數(shù),MK0,MK1,MK2,MK3,并為算出各輪密鑰預(yù)先打算好初始值,其中FK數(shù)組為系統(tǒng)參數(shù)
k[0]MK[0]^FK[0]k
有用過國密算法SM4的嗎?
MK有用過國密算法SM4的嗎?
^FK有用過國密算法SM4的嗎?
k[2]MK[2]^FK[2]k[3]MK[3]^FK[3]
數(shù)年后,對于第i輪的密鑰SK[i],其是由k[i]和對k[i1]^k[i2]^k[i3]^CK[i]的復(fù)合旋轉(zhuǎn)T'異或得到的:SK[i]k[i4]k[i]^(sm4CalciRK(k[i1]^k[i2]^k[i3]^CK[i]))
其中CK是固定參數(shù),雖說代碼中直接決定了CK,只不過,其是有一定的計算方法的:設(shè)CKij為CKi的第j字節(jié),即CKi(cki0,cki1,cki2,cki3),則ckij(4ij)*7(mod256)。
函數(shù)sm4CalciRK,也就是變化T',與加密輪函數(shù)中的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}
加了密過程是從全局函數(shù)voidsm4_crypt_ecb(sm4_context*ctx,intmode,intlength,unsignedchar*input,unsignedchar*outputs)對密文input并且電碼本模式的加密,加了密的核心是動態(tài)創(chuàng)建了對每那塊密文接受加密: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