定義結構體一定要用typedef嗎 typedef定義結構體的用法?
typedef定義結構體的用法?Typedef struct {}結構名稱;示例:typedefstruct { } null structC語言中typedefstruct和struct區(qū)別?例如:
typedef定義結構體的用法?
Typedef struct {}結構名稱;
示例:typedefstruct { } null struct
C語言中typedefstruct和struct區(qū)別?
例如:typedefstructabc { intxintyintz} ABC當結構的abc類型重命名為ABC,后面定義了同類型的變量時,可以寫成:ABCm,n;和:structabcm,n;效果是一樣的。復雜的數(shù)據類型可以簡化。
有用過國密算法SM4的嗎?
算法調用參數(shù)。算法需要一個結構sm4_context ctx來存儲上下文信息,即加密和每個輪的密鑰。
該結構定義如下
typedef結構
{
int模式
/*!lt加密/解密*/
無符號長sk[32]
/*!lt SM4子項*/
} sm4 _上下文
加密密鑰調度算法首先調用sm4_setkey_enc(ampctx,key)設置密鑰,這個函數(shù)會設置模式為加密,調用static void sm4 _ setkey(unsigned long sk[32],unsigned charkey [16])完成密鑰設置操作。
靜態(tài)void sm4_setkey(
unsigned long SK[32],unsigned char key[16]){ unsigned long MK[4]unsigned long k[36]unsigned long I 0 get _ ulong _ be(MK[0],key,0 ) GET_ULONG_BE( MK[1],key,4 ) GET_ULONG_BE( MK[2],key,8 ) GET_ULONG_BE( MK[3],key,12)k[0]mk[0]^fk[0]k[1]mk[1]^fk[1]k[2]mk[2]^fk[2]k[3]mk[3]^fk[3]
對于(ilt32 i ) {
k[I]k[I]^
SK[i] k[i 4]
}
}
與加密中的操作類似,首先通過宏將初始密鑰轉換成四個32位整數(shù)MK0、MK1和MK。2,MK3,并且預先準備初始值用于計算每一輪密鑰,其中FK陣列是系統(tǒng)參數(shù)。
mk[0]^fk[0 mk[1]^fk[1]
mk[2]^fk[2 mk[3]^fk[3]
此后,對于I輪密鑰SK[i],通過XOR k[i]和復數(shù)變換T 的K的K的K的CK的:SK的
其中CK為固定參數(shù),雖然代碼中直接給出了CK,但實際上有一定的計算方法:設CKij為CKi的第j個字節(jié),即CKi(cki0,cki1,cki2,cki3),則ckij(4i j)*7(mod 256)。
函數(shù)sm4CalciRK,即變換T ,與加密輪函數(shù)中的t基本相同,先進行Sbox的非線性代入,再進行線性變換,只是線性變換L改為:rkbb (rotl (bb,13)) (rotl (bb,23))。
靜態(tài)無符號長整型sm4CalciRK(無符號長整型ka)
{
unsigned long bb 0 unsigned long rk 0 unsigned char a[4]unsigned char b[4]put _ ulong _ be(ka,a,0)b[0]sm4sbox(a[0])b[1]sm4sbox(a[1])b[2]sm4sbox(a[2])b[3]sm4sbox(a[3])get _ ulong _ be(bb,b,0) rk bb^(ROTL(bb,13))^(ROTL(bb,23))返回rk
}
加密過程通過調用Void sm4 _ crypt _ ECB(sm4 _ context * CTX,int mode,int length,unsigned char * input,unsigned char * output)對密碼本模式下輸入的密文進行加密。加密的核心是調用加密每個密文:靜態(tài)void sm4 _ one _ round(unsigned long sk[32],unsigned char input [16],unsigned char output[16]);
靜電void sm4_one_round(
unsigned long sk[32]、unsigned char input[16]、unsigned char output[16]){ unsigned long I 0 unsigned long ul buf[36]memset(ul buf,0,sizeof(ul buf))get _ ulong _ be(ul buf[0],input,0 ) GET_ULONG_BE( ulbuf[1],input,4 ) GET_ULONG_BE( ulbuf[2],input,8 ) GET_ULONG_BE( ulbuf[3],input,12 ) while(ilt32