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;
}
相关推荐
重庆小透明6 分钟前
力扣刷题记录【1】146.LRU缓存
java·后端·学习·算法·leetcode·缓存
许白掰2 小时前
【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
stm32·单片机·嵌入式硬件·学习·实时音视频
future14123 小时前
C#学习日记
开发语言·学习·c#
DIY机器人工房3 小时前
0.96寸OLED显示屏 江协科技学习笔记(36个知识点)
笔记·科技·stm32·单片机·嵌入式硬件·学习·江协科技
我是小哪吒2.05 小时前
书籍推荐-《对抗机器学习:攻击面、防御机制与人工智能中的学习理论》
人工智能·深度学习·学习·机器学习·ai·语言模型·大模型
✎ ﹏梦醒͜ღ҉繁华落℘5 小时前
WPF学习(四)
学习·wpf
✎ ﹏梦醒͜ღ҉繁华落℘6 小时前
WPF学习(动画)
学习·wpf
循环过三天6 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
生如夏花℡7 小时前
HarmonyOS学习记录3
学习·ubuntu·harmonyos
之歆7 小时前
Python-封装和解构-set及操作-字典及操作-解析式生成器-内建函数迭代器-学习笔记
笔记·python·学习