OpenEuler-OpenSSL測試
阿新 • • 發佈:2022-04-12
任務三 OpenEuler-OpenSSL測試
作者:20191322wyl
目錄任務詳情
-
在Ubuntu編寫程式碼測試OpenSSL功能,包含Base64,SM2,SM3,SM4演算法的呼叫,然後在OpenEuler中重現
-
提交程式碼連結和執行結果截圖
-
加分項:在Windows中重現
所有程式碼均在此
實現base64
在kali中實現base64
在openEuler中實現base64
和在kali中一樣的操作
實現SM2
在kali中實現SM2
在openEuler中實現SM2
實現SM3
程式碼
#include <stdio.h> #include <string.h> #include <openssl/evp.h> void tDigest() { unsigned char sm3_value[EVP_MAX_MD_SIZE]; //儲存輸出的摘要值的陣列 int sm3_len, i; EVP_MD_CTX *sm3ctx; //EVP訊息摘要結構體 sm3ctx = EVP_MD_CTX_new();//呼叫函式初始化 char msg1[] = "Test Message1"; //待計算摘要的訊息1 char msg2[] = "Test Message2"; //待計算摘要的訊息2 EVP_MD_CTX_init(sm3ctx); //初始化摘要結構體 EVP_DigestInit_ex(sm3ctx, EVP_sm3(), NULL); //設定摘要演算法和密碼演算法引擎,這裡密碼演算法使用sm3,演算法引擎使用OpenSSL預設引擎即軟演算法 EVP_DigestUpdate(sm3ctx, msg1, strlen(msg1));//呼叫摘要UpDate計算msg1的摘要 EVP_DigestUpdate(sm3ctx, msg2, strlen(msg2));//呼叫摘要UpDate計算msg2的摘要 EVP_DigestFinal_ex(sm3ctx, sm3_value, &sm3_len);//摘要結束,輸出摘要值 EVP_MD_CTX_reset(sm3ctx); //釋放記憶體 printf("原始資料%s和%s的摘要值為:\n",msg1,msg2); for(i = 0; i < sm3_len; i++) { printf("0x%02x ", sm3_value[i]); } printf("\n"); } int main() { OpenSSL_add_all_algorithms(); tDigest(); return 0; }
初始化函式EVP_MD_CTX_init
函式功能:初始化一個 EVP_MD_CTX 結構體。只有呼叫該函式初始化後,EVP_MD_CTX結構體才能在其他函式中呼叫。
函式定義:
void EVP_MD_CTxinit(EVP MD CTX *ctx):
在kali中實現SM3
在openEuler中實現SM3
實現SM4
在kali中實現SM4
程式碼
#include <stdio.h> #include <string.h> #include <windows.h> #include <openssl/evp.h> #include <openssl/x509.h> void tEVP_Encrypt() { unsigned char key[EVP_MAX_KEY_LENGTH]; //金鑰 unsigned char iv[EVP_MAX_KEY_LENGTH];//初始化向量 EVP_CIPHER_CTX* ctx;//EVP演算法上下文 unsigned char out[1024];//輸出密文緩衝區 int outl;//密文長度 int outltmp; const char *msg="Hello OpenSSL";//待加密的資料 int rv; int i; //初始化函式才能用! ctx = EVP_CIPHER_CTX_new(); //設定key和iv(可以採用隨機數和可以是使用者輸入) for(i=0;i<24;i++) { key[i]=i; } for(i=0;i<8;i++) { iv[i]=i; } //初始化密碼演算法結構體 EVP_CIPHER_CTX_init(ctx); //設定演算法和金鑰以 rv = EVP_EncryptInit_ex(ctx,EVP_sm4_cbc(),NULL,key,iv); if(rv!=1) { printf("Err\n"); return; } //資料加密 rv = EVP_EncryptUpdate(ctx,out,&outl,(const unsigned char*)msg,strlen(msg)); if(rv!=1) { printf("Err\n"); return; } //結束資料加密,把剩餘資料輸出。 rv = EVP_EncryptFinal_ex(ctx,out+outl,&outltmp); if(rv!=1) { printf("Err\n"); return; } outl = outl +outltmp; printf("原文為:%s\n",msg); //列印輸出密文 printf("密文長度:%d\n密文資料:\n",outl); for(i=0;i<outl;i++) { printf("0x%02x ",out[i]); } printf("\n"); } int main() { OpenSSL_add_all_algorithms(); tEVP_Encrypt(); return 0; }