sdf 测试-2-openssl

任务详情

在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,参考网内容 和AI要给出详细过程,否则不得分。

  1. 根据gmt0018标准,如何调用接口实现基于SM3求你的学号姓名的SM3值?(5')

  2. 使用OpenSSL实现SDF接口中的hash运算接口,至少支持SM3算法,把相关函数集成到src中的sdf.c中中(5')

  3. 在test中的main.c调用进行测试,至少测试计算你的学号(数字),你的学号(字符串)的SM3值。(5')

  4. 提交代码(或代码链接)和运行结果截图

根据gmt0018标准,如何调用接口实现基于SM3求你的学号姓名的SM3值?(5')

c 复制代码
#include "sdf.h"
#include <string.h>

#define BUFFER_SIZE 1024

int main() {
    int rv;
    unsigned char buffer[BUFFER_SIZE];
    unsigned int bufferLen;
    unsigned char hash[32]; // SM3哈希结果为32字节

    // 计算学号和姓名的SM3哈希值
    char *id = "20211119";
    char *name = "陈俊积";

    bufferLen = strlen(id) + strlen(name);
    memcpy(buffer, id, strlen(id));
    memcpy(buffer + strlen(id), name, strlen(name));

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 会话句柄,可以为空
        buffer,
        bufferLen,
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for %s%s: ", id, name);
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    return 0;
}

使用OpenSSL实现SDF接口中的hash运算接口,至少支持SM3算法,把相关函数集成到src中的sdf.c中中(5')

为了支持SM3算法,我们可以使用 OpenSSL 库中的 EVP_Digest 函数来计算哈希值。下面是修改后的 SDF_Hash 函数的实现:

c 复制代码
int SDF_Hash(
    void *hSessionHandle,
    unsigned char *pucData,
    unsigned int uiDataLength,
    unsigned char *pucHash)
{
    if (pucData == NULL || uiDataLength == 0 || pucHash == NULL) {
        return SDR_INVALID_PARAMETER;
    }

    const EVP_MD *md;
    EVP_MD_CTX *mdctx;

    md = EVP_sm3();
    mdctx = EVP_MD_CTX_new();

    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, pucData, uiDataLength);
    EVP_DigestFinal_ex(mdctx, pucHash, NULL);

    EVP_MD_CTX_free(mdctx);

    return SDR_OK;
}

在上面的代码中,我们使用 OpenSSL 库中的 EVP_Digest 函数计算了哈希值,并将结果存储在 pucHash 缓冲区中。需要注意的是,在使用 EVP_Digest 函数之前,我们需要先初始化 EVP_MD_CTX 结构体,并指定要使用的哈希算法(这里使用 EVP_sm3() 函数)。然后,我们通过 EVP_DigestUpdate 函数传递要计算哈希值的数据,最后通过 EVP_DigestFinal_ex 函数获取哈希结果。

需要将修改后的代码集成到 sdf.c 文件中,如下所示:

c 复制代码
#include "sdf.h"
#include <string.h>
#include <openssl/evp.h>

int SDF_Hash(
    void *hSessionHandle,
    unsigned char *pucData,
    unsigned int uiDataLength,
    unsigned char *pucHash)
{
    if (pucData == NULL || uiDataLength == 0 || pucHash == NULL) {
        return SDR_INVALID_PARAMETER;
    }

    const EVP_MD *md;
    EVP_MD_CTX *mdctx;

    md = EVP_sm3();
    mdctx = EVP_MD_CTX_new();

    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, pucData, uiDataLength);
    EVP_DigestFinal_ex(mdctx, pucHash, NULL);

    EVP_MD_CTX_free(mdctx);

    return SDR_OK;
}

在test中的main.c调用进行测试,至少测试计算你的学号(数字),你的学号(字符串)的SM3值。(5')

c 复制代码
#include "sdf.h"
#include <stdio.h>

#define BUFFER_SIZE 1024

int main() {
    int rv;
    unsigned char buffer[BUFFER_SIZE];
    unsigned char hash[32]; // SM3哈希结果为32字节

    // 计算学号(数字)的SM3哈希值
    unsigned int id = 20211128;

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 会话句柄,可以为空
        (unsigned char *)&id,
        sizeof(id),
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for student ID (%u): ", id);
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    // 计算学号(字符串)的SM3哈希值
    char *idStr = "20211128";

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 会话句柄,可以为空
        (unsigned char *)idStr,
        strlen(idStr),
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for student ID (string): ");
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    return 0;
}

提交代码(或代码链接)和运行结果截图

sdf.c

c 复制代码
#include "sdf.h"
#include <string.h>
#include <openssl/evp.h>

int SDF_Hash(
    void *hSessionHandle,
    unsigned char *pucData,
    unsigned int uiDataLength,
    unsigned char *pucHash)
{
    if (pucData == NULL || uiDataLength == 0 || pucHash == NULL) {
        return SDR_INVALID_PARAMETER;
    }

    const EVP_MD *md;
    EVP_MD_CTX *mdctx;

    md = EVP_sm3();
    mdctx = EVP_MD_CTX_new();

    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, pucData, uiDataLength);
    EVP_DigestFinal_ex(mdctx, pucHash, NULL);

    EVP_MD_CTX_free(mdctx);

    return SDR_OK;
}

main.c

c 复制代码
#include "sdf.h"
#include <stdio.h>

#define BUFFER_SIZE 1024

int main() {
    int rv;
    unsigned char buffer[BUFFER_SIZE];
    unsigned char hash[32]; // SM3哈希结果为32字节

    // 计算学号(数字)的SM3哈希值
    unsigned int id = 20211128;

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 会话句柄,可以为空
        (unsigned char *)&id,
        sizeof(id),
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for student ID (%u): ", id);
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    // 计算学号(字符串)的SM3哈希值
    char *idStr = "20211128";

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 会话句柄,可以为空
        (unsigned char *)idStr,
        strlen(idStr),
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for student ID (string): ");
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    return 0;
}
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习