以下是按照 Markdown 格式整理的你所需要的代码和操作过程,使用中文描述:
任务详情
在 openEuler(推荐)、Ubuntu 或 Windows(不推荐)中完成以下任务。参考网内容以及 AI 给出的详细过程,否则不得分。
0. 根据 gmt0018 标准,如何调用接口实现基于 SM3 求你的学号姓名的 SM3 值?
#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 = "20211215";
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;
}
1. 使用 OpenSSL 实现 SDF 接口中的 hash 运算接口,至少支持 SM3 算法,把相关函数集成到 src 中的 sdf.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;
}
3. 在 test 中的 main.c 调用进行测试,至少测试计算你的学号(数字),你的学号(字符串)的 SM3 值
#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 = 20211215;
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 = "20211215";
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;
}
标签:rv,hash,int,SM3,openssl,unsigned,sdf,printf,20211215
From: https://www.cnblogs.com/lududuze/p/18227384