實驗一 密碼引擎-2-OpenEuler-OpenSSL測試
阿新 • • 發佈:2022-04-10
在Ubuntu編寫程式碼測試OpenSSL功能,包含Base64,SM2,SM3,SM4演算法的呼叫,然後在OpenEuler中重現
提交程式碼連結和執行結果截圖
加分項:在Windows中重現
1.Base64程式碼如下
#include <stdio.h> #include <string.h> #include <openssl/evp.h> #include <openssl/x509.h> //Base64編碼 void tEVP_Encode() { EVP_ENCODE_CTX *ctx; ctx = EVP_ENCODE_CTX_new(); //EVP編碼結構體 unsigned char in[1024]; //輸入資料緩衝區 int inl; //輸入資料長度 char out[2048]={0}; //輸出資料緩衝區 int outl; //輸出資料長度 FILE *infp; //輸入檔案控制代碼 FILE *outfp; //輸出檔案控制代碼 infp = fopen("test.dat","rb");//開啟待編碼的檔案 if(infp == NULL) { printf("Open File \"Test.dat\" for Read Err.\n"); return; } outfp = fopen("test.txt","w");//開啟編碼後儲存的檔案 if(outfp == NULL) { printf("Open File \"test.txt\" For Write Err.\n"); return; } EVP_EncodeInit(ctx);//Base64編碼初始化 printf("檔案\"Test.dat\" Base64編碼後為:\n"); //迴圈讀取原文,並呼叫EVP_EncodeUpdate計算Base64編碼 while(1) { inl = fread(in,1,1024,infp); if(inl <= 0) break; EVP_EncodeUpdate(ctx,out,&outl,in,inl);//編碼 fwrite(out,1,outl,outfp);//輸出編碼結果到檔案 printf("%s",out); } EVP_EncodeFinal(ctx,out,&outl);//完成編碼,輸出最後的資料。 fwrite(out,1,outl,outfp); printf("%s",out); fclose(infp); fclose(outfp); printf("對檔案\"Test.dat\" Base64編碼完成,儲存到\"test.txt\"檔案.\n\n\n"); } //Base64解碼 void tEVP_Decode() { EVP_ENCODE_CTX *ctx; ctx = EVP_ENCODE_CTX_new(); //EVP編碼結構體 char in[1024]; //輸入資料緩衝區 int inl; //輸入資料長度 unsigned char out[1024]; //輸出資料緩衝區 int outl; //輸出資料長度 FILE *infp; //輸入檔案控制代碼 FILE *outfp; //輸出檔案控制代碼 infp = fopen("test.txt","r");//開啟待解碼的檔案 if(infp == NULL) { printf("Open File \"Test.txt\" for Read Err.\n"); return; } outfp = fopen("test-1.dat","wb");//開啟解碼後儲存的檔案 if(outfp == NULL) { printf("Open File \"test-1.txt\" For Write Err.\n"); return; } EVP_DecodeInit(ctx);//Base64解碼初始化 printf("開始對檔案\"Test.txt\" Base64解碼...\n\n"); //迴圈讀取原文,並呼叫EVP_DecodeUpdate進行Base64解碼 while(1) { inl = fread(in,1,1024,infp); if(inl <= 0) break; EVP_DecodeUpdate(ctx,out,&outl,in,inl);//Base64解碼 fwrite(out,1,outl,outfp);//輸出到檔案 } EVP_DecodeFinal(ctx,out,&outl);//完成解碼,輸出最後的資料。 fwrite(out,1,outl,outfp); fclose(infp); fclose(outfp); printf("對檔案\"Test.txt\" Base64解碼完成,儲存為\"test-1.dat\"\n\n\n"); } int main() { tEVP_Encode(); tEVP_Decode(); return 0; }
openeuler實現
Ubuntu實現
2.SM2程式碼連結:https://github.com/greendow/SM2-encrypt-and-decrypt
Ubuntu實現
openeuler實現
3.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; }
Ubuntu實現
openeuler實現
4.SM4程式碼如下
#include <stdio.h> #include <string.h> #include </usr/include/zconf.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; }
Ubuntu實現
openeuler實現