點擊上方藍字可直接關注!方便下次閱讀。如果對你有幫助,麻煩點個在看或點個讚,感謝~
最近0基礎在學習國密算法的相關應用,故此和大家分享下自己的一些經歷。
程序平臺: Ubuntu16.04 x64
一、國密SM3與SM4
國產密碼算法(國密算法)是指國家密碼局認定的國產商用密碼算法,目前主要使用公開的SM2、SM3、SM4三類算法,分別是非對稱算法、哈希算法和對稱算法。不懂也沒關係,以後別人說SM2、SM3、SM4知道它們是幹啥的就行。這次主要和大家從簡單的SM3、SM4說起。
SM3算法:SM3雜湊算法是我國自主設計的密碼雜湊算法,適用於商用密碼應用中的數字籤名和驗證消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。為了保證雜湊算法的安全性,其產生的雜湊值的長度不應太短,例如MD5輸出128比特雜湊值,輸出長度太短,影響其安全性SHA-1算法的輸出長度為160比特,SM3算法的輸出長度為256比特,因此SM3算法的安全性要高於MD5算法和SHA-1算法。
SM4算法:SM4分組密碼算法是我國自主設計的分組對稱密碼算法,用於實現數據的加密/解密運算,以保證數據和信息的機密性。要保證一個對稱密碼算法的安全性的基本條件是其具備足夠的密鑰長度,SM4算法與AES算法具有相同的密鑰長度分組長度128比特,因此在安全性上高於3DES算法。
裡面的一些術語不知道也沒關係,以後會再梳理的.
二、信息摘要(SM3)一些特性
消息摘要或者哈希函數以任意消息(任意內容或者任何長度)作為輸入,然後產生一個固定長度大小的哈希值作為結果輸出。具體來說,該函數具有以下特性:
· 對於任意給定的消息,生成哈希值很簡單
· 從任意給定的哈希值去計算出一條消息是不可行的(即函數是單向的)
· 修改消息而不修改哈希值是不可行的
· 找到兩條具有相同哈希值的消息是不可行的
三、開源程序使用舉例
測試文件結構如圖:
測試源碼:
#include <SM3.h>#include <stdio.h>#include <stdlib.h>#include <string.h>
# define EVP_MAX_MD_SIZE 32#define ALLOC_OBJ(type, size) (type *)calloc(1, (sizeof(type)*size))
int main(){ unsigned char msgbuf[] = "abc"; unsigned char msgbuf1[] = "abc"; unsigned char dgst[EVP_MAX_MD_SIZE]; unsigned int dgstlen = (unsigned int)sizeof(dgst);
SM3_state *ctx = ALLOC_OBJ(SM3_state, 1); SM3_Init(ctx); SM3_Update(ctx, msgbuf, sizeof(msgbuf)-1); SM3_Final(dgst, dgstlen, ctx, sizeof(msgbuf)-1);
printf("Digest1 is: "); for (int i = 0; i < dgstlen; i++) printf("%02x", dgst[i]); printf("\n");
SM3_Hash(msgbuf1 , sizeof(msgbuf1)-1, dgst, dgstlen); printf("Digest2 is: "); for (int i = 0; i < dgstlen; i++) printf("%02x", dgst[i]); printf("\n");
free(ctx); return 0;}測試效果:
SM4簡單舉例:
int main(){ unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; unsigned char iv[] = {1,2,3,4,5,6,7,8}; unsigned char plain_text[] = "hello world!"; unsigned char out_plain_text[sizeof(plain_text)]; unsigned char cipher_text[16];
SM4_EncCBC(key, iv, plain_text, cipher_text, sizeof(plain_text)-1);
SM4_DecCBC(key, iv, cipher_text, out_plain_text, sizeof(plain_text)-1); printf("%s\n",cipher_text);
printf("%s\n",out_plain_text);
return 0;}四、小結與資源連結
①國密C語言實現的git連結:
https://github.com/JulongChain/julongchain-csp-sdt
②相關術語連結:
http://gmssl.org/docs/evp-api.html
③純初學入門,為了快速應用。最開始用的GmSSL,這個文檔相對全一些,對初學者會友好一些,但是還是需要一點兒密碼學的基礎,我是兩個結合一起看的。
需要完整程序的可在公眾號後臺留言說明。
每日××× :有機會一定要體驗不同的生活方式與工作方式!