sdf 測試-2-openssl

20211115fyq發表於2024-05-20

在openEuler(推薦)或Ubuntu或Windows(不推薦)中完成下面任務,參考網內容 和AI要給出詳細過程,否則不得分。
0. 根據gmt0018標準,如何呼叫介面實現基於SM3求你的學號姓名的SM3值?(5‘)

  1. 使用OpenSSL實現SDF介面中的hash運算介面,至少支援SM3演算法,把相關函式整合到src中的sdf.c中中(5')
  2. 在test中的main.c呼叫進行測試,至少測試計算你的學號(數字),你的學號(字串)的SM3值。(5‘)
  3. 提交程式碼(或程式碼連結)和執行結果截圖

首先,針對你的請求,我將提供一個簡化的步驟和示例程式碼來實現這些要求。需要注意的是,直接呼叫GMT 0018標準中描述的介面可能涉及特定的硬體或軟體庫,而這裡我將演示如何使用OpenSSL庫來支援SM3雜湊演算法,並將其整合到你的sdf.c和main.c檔案中。

  1. 實現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;  
    }  
      
    // ... 其他函式的實現 ...
    
  2. 在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
    

`
image

相關文章