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;
}
相关推荐
zhuyixiangyyds3 小时前
day21和day22学习Pandas库
笔记·学习·pandas
每次的天空3 小时前
Android学习总结之算法篇四(字符串)
android·学习·算法
背影疾风4 小时前
C++学习之路:指针基础
c++·学习
苏克贝塔5 小时前
CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法
c++·vscode·学习
odoo中国6 小时前
深度学习 Deep Learning 第15章 表示学习
人工智能·深度学习·学习·表示学习
电星托马斯6 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
清晨朝暮6 小时前
【算法学习计划】贪心算法(下)
学习
yanxy5127 小时前
【TS学习】(18)分发逆变推断
前端·学习·typescript
Hellyc7 小时前
SpringMVC响应数据:页面跳转与回写数据
java·前端·学习
Qian_ShouYi8 小时前
MATLAB 代码学习
学习·算法·matlab