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;
}
相关推荐
Moonnnn.36 分钟前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr71 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen1 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法
布伦鸽3 小时前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
陳麦冬5 小时前
深入理解指针(二)
c语言·学习
普宁彭于晏7 小时前
CSS3相关知识点
前端·css·笔记·学习·css3
fen_fen8 小时前
学习笔记(25):线性代数,矩阵-矩阵乘法原理
笔记·学习·线性代数
xiaoxiaoxiaolll9 小时前
从理论崩塌到新路径:捷克科学院APL Photonics论文重构涡旋光技术边界
学习
抠脚学代码10 小时前
Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置
qt·学习·ubuntu
萌新小码农‍18 小时前
Spring框架学习day7--SpringWeb学习(概念与搭建配置)
学习·spring·状态模式