在openEuler(推薦)或Ubuntu或Windows(不推薦)中完成下面任務,參考網內容 和AI要給出詳細過程,否則不得分。
0. 根據gmt0018標準,如何呼叫介面實現基於SM3求你的學號姓名的SM3值?(5‘)
- 使用OpenSSL實現SDF介面中的hash運算介面,至少支援SM3演算法,把相關函式整合到src中的sdf.c中中(5')
- 在test中的main.c呼叫進行測試,至少測試計算你的學號(數字),你的學號(字串)的SM3值。(5‘)
- 提交程式碼(或程式碼連結)和執行結果截圖
首先,針對你的請求,我將提供一個簡化的步驟和示例程式碼來實現這些要求。需要注意的是,直接呼叫GMT 0018標準中描述的介面可能涉及特定的硬體或軟體庫,而這裡我將演示如何使用OpenSSL庫來支援SM3雜湊演算法,並將其整合到你的sdf.c和main.c檔案中。
-
實現SDF介面中的hash運算介面
在src/sdf.c中,新增一個新的函式來封裝SM3雜湊計算。`c // src/sdf.h #ifndef SDF_H #define SDF_H // ... 其他宣告 ... int SDF_SM3(const unsigned char *d, size_t n, unsigned char *md); // ... 其他宣告 ... #endif // SDF_H // src/sdf.c #include <stdio.h> #include <openssl/evp.h> #include "sdf.h" int SDF_SM3(const unsigned char *d, size_t n, unsigned char *md) { EVP_MD_CTX *mdctx; const EVP_MD *md_sm3; unsigned int mdlen; int ret = 1; ` OpenSSL_add_all_digests(); // 確保所有digests都被載入 md_sm3 = EVP_get_digestbyname("SM3"); if (!md_sm3) { fprintf(stderr, "Unknown message digest SM3\n"); return 0; } mdctx = EVP_MD_CTX_new(); if (!mdctx) { fprintf(stderr, "Failed to create context\n"); return 0; } if (EVP_DigestInit_ex(mdctx, md_sm3, NULL) != 1) { fprintf(stderr, "Failed to initialize context\n"); goto end; } if (EVP_DigestUpdate(mdctx, d, n) != 1) { fprintf(stderr, "Failed to update context\n"); goto end; } if (EVP_DigestFinal_ex(mdctx, md, &mdlen) != 1) { fprintf(stderr, "Failed to finalize context\n"); goto end; } ret = 0; // 成功 end: EVP_MD_CTX_free(mdctx); return ret; } // ... 其他函式的實現 ...
-
在test/main.c中呼叫進行測試
` c
// test/main.c
#include <stdio.h>
#include <string.h>
#include "../src/sdf.h"int main() { // 學號(數字形式)作為字串處理 const char *student_id_num = "20211115"; unsigned char md_num[32]; // SM3的雜湊值長度為256位(32位元組) // 學號(字串形式)直接就是字串 const char *student_id_str = "20211115"; unsigned char md_str[32]; if (SDF_SM3((const unsigned char *)student_id_num, strlen(student_id_num), md_num) == 0) { printf("學號(數字形式)的SM3雜湊值為: "); for (int i = 0; i < sizeof(md_num); i++) { printf("%02x", md_num[i]); } printf("\n"); } else { printf("計算學號(數字形式)的SM3雜湊值失敗\n"); } if (SDF_SM3((const unsigned char *)student_id_str, strlen(student_id_str), md_str) == 0) { printf("學號(字串形式)的SM3雜湊值為: "); for (int i = 0; i < sizeof(md_str); i++) { printf("%02x", md_str[i]); } printf("\n"); } else { printf
`