sdf 测试-2-openssl
在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. **提交代码(或代码链接)和运行结果截图**
根据 GMT 0018 标准,实现基于 SM3 求学号和姓名的 SM3 值需要以下步骤:
1. 初始化设备和会话。
2. 导入学号和姓名数据。
3. 调用 SM3 接口计算学号和姓名的 SM3 值。
4. 关闭会话和设备。
代码 sdf.h
#ifndef SDF_H
#define SDF_H
int sm3_hash(const unsigned char *data, size_t data_len, unsigned char *hash);
#endif /* SDF_H */
sdf.c
#include <openssl/evp.h>
#include "sdf.h"
int sm3_hash(const unsigned char *data, size_t data_len, unsigned char *hash) {
EVP_MD_CTX *md_ctx;
const EVP_MD *md;
unsigned int hash_len;
md = EVP_sm3(); // 使用SM3算法
md_ctx = EVP_MD_CTX_new();
if (md_ctx == NULL) {
return -1; // 初始化失败
}
if (1 != EVP_DigestInit_ex(md_ctx, md, NULL)) {
EVP_MD_CTX_free(md_ctx);
return -1; // 初始化哈希上下文失败
}
if (1 != EVP_DigestUpdate(md_ctx, data, data_len)) {
EVP_MD_CTX_free(md_ctx);
return -1; // 哈希更新失败
}
if (1 != EVP_DigestFinal_ex(md_ctx, hash, &hash_len)) {
EVP_MD_CTX_free(md_ctx);
return -1; // 哈希计算失败
}
EVP_MD_CTX_free(md_ctx);
return 0; // 哈希计算成功
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sdf.h"
int main() {
unsigned char hash[32]; // 用于存储哈希值的缓冲区,SM3长度为256位,即32字节
const char *student_id_str = "20211127"; // 学号字符串
const unsigned char student_id_bytes[] = {0x20, 0x21, 0x11, 0x27}; // 学号字节数组
// 计算学号字符串的哈希值
if (sm3_hash((const unsigned char *)student_id_str, strlen(student_id_str), hash) == 0) {
printf("SM3 hash of student ID (string): ");
for (int i = 0; i < 32; i++) {
printf("%02x", hash[i]);
}
printf("\n");
} else {
printf("Failed to calculate SM3 hash of student ID (string).\n");
}
// 计算学号字节数组的哈希值
if (sm3_hash(student_id_bytes, sizeof(student_id_bytes), hash) == 0) {
printf("SM3 hash of student ID (bytes): ");
for (int i = 0; i < 32; i++) {
printf("%02x", hash[i]);
}
printf("\n");
} else {
printf("Failed to calculate SM3 hash of student ID (bytes).\n");
}
return 0;
}