任务详情
在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,参考网内容 和AI要给出详细过程,否则不得分。 0. 根据gmt0018标准,如何调用接口实现基于SM3求你的学号姓名的SM3值?(5‘) 1. 使用OpenSSL实现SDF接口中的hash运算接口,至少支持SM3算法,把相关函数集成到src中的sdf.c中中(5') 3. 在test中的main.c调用进行测试,至少测试计算你的学号(数字),你的学号(字符串)的SM3值。(5‘) 4. **提交代码(或代码链接)和运行结果截图**
根据gmt0018标准,我们可以使用SDF(Security Device Function)中的 SM3Hash 函数来实现基于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 = "20211128";
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;
}
在上面的代码中,我们使用 SDF_Hash
函数计算了学号和姓名的SM3哈希值,并将结果打印出来。需要注意的是,我们将学号和姓名拼接成一个字符串,并将其作为输入缓冲区传递给 SDF_Hash
函数。
- 使用OpenSSL实现SDF接口中的hash运算接口,至少支持SM3算法,把相关函数集成到src中的sdf.c中
为了支持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值。
在 main.c
中,我们可以使用 SDF_Hash
函数计算学号的SM3值。下面是计算学号(数字)和学号(字符串)的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 = 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;
}
在上面的代码中,我们先计算了学号(数字)的SM3值,然后计算了学号(字符串)的SM3值,并将结果打印出来。
- 提交代码(或代码链接)和运行结果截图
下面是完整的代码:
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;
}
标签:hash,int,SM3,openssl,unsigned,sdf,20211128,printf,EVP
From: https://www.cnblogs.com/ljxbl/p/18201254