sdf 测试-2-openssl

在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

posted @ 2024-05-20 09:37  20211115fyq  阅读(42)  评论(0)    收藏  举报