任务详情
在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,参考网内容 和AI要给出详细过程,否则不得分。
0. 根据gmt0018标准,如何调用接口实现基于SM3求你的学号姓名的SM3值?(5‘)
- 使用OpenSSL实现SDF接口中的hash运算接口,至少支持SM3算法,把相关函数集成到src中的sdf.c中中(5’)
- 在test中的main.c调用进行测试,至少测试计算你的学号(数字),你的学号(字符串)的SM3值。(5‘)
- 提交代码(或代码链接)和运行结果截图
根据gmt0018标准,如何调用接口实现基于SM3求你的学号姓名的SM3值?(5‘)
#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 函数的实现:
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 文件中,如下所示:
#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‘)
#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
#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
#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;
}