当前位置: 首页 > news >正文

sdf 测试-2-openssl

任务详情

在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,参考网内容 和AI要给出详细过程,否则不得分。
0. 根据gmt0018标准,如何调用接口实现基于SM3求你的学号姓名的SM3值?(5‘)

  1. 使用OpenSSL实现SDF接口中的hash运算接口,至少支持SM3算法,把相关函数集成到src中的sdf.c中中(5’)
  2. 在test中的main.c调用进行测试,至少测试计算你的学号(数字),你的学号(字符串)的SM3值。(5‘)
  3. 提交代码(或代码链接)和运行结果截图

根据gmt0018标准,如何调用接口实现基于SM3求你的学号姓名的SM3值?(5‘)

#include "sdf.h"
#include <string.h>#define BUFFER_SIZE 1024int 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 1024int 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 1024int 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;
}
http://www.lryc.cn/news/355024.html

相关文章:

  • 头歌springboot初体验
  • 矩阵对角化在机器学习中的奥秘与应用
  • 操作MySQL数据库
  • Linux shell 文件生成文件脚本(模拟生成文件、生成大量文件)
  • theharvester一键收集域名信息(KALI工具系列十)
  • 「动态规划」删除并获得点数
  • MongoDB CRUD操作:内嵌文档数组查询
  • 【C++】每日一题 50 Pow(x,n)
  • HG/T 6088-2022 透水道路用涂料检测
  • linux定时清理docker日志脚本
  • ROS学习笔记(16):夹缝循迹
  • 【MySQL精通之路】SQL语句(3)-锁和事务语句
  • 211大学计算机专业不考408,新增的交叉专业却考408!南京农业大学计算机考研考情分析!
  • 利用java8 的 CompletableFuture 优化 Flink 程序,性能提升 50%
  • 香橙派 AIpro综合体验及AI样例运行
  • 通过域名接口申请免费的ssl多域名证书
  • 【JAVA WEB实用与优化技巧】如何自己封装一个自定义UI的Swagger组件,包含Swagger如何处理JWT无状态鉴权自动TOKEN获取
  • 理解大语言模型(二)——从零开始实现GPT-2
  • SSH远程登录时常见问题解决
  • 工业级3D开发引擎HOOPS:创新与效率的融合!
  • IDEA创建Spring Boot项目
  • mysql实战——xtrabackup全量备份/增量备份及恢复
  • 探索演进:了解IPv4和IPv6之间的区别
  • Python 实现Word (DOC或DOCX)与TXT文本格式互转
  • anaconda install on CentOS 7
  • git管理Codeup云效平台
  • Pycharm最新安装教程(最新更新时间2024年5月27日)
  • 医院门诊互联电子病历|基于SSM+vue的医院门诊互联电子病历管理信息系统的设计与实现(源码+数据库+文档)
  • H3CNE-8-ARP工作原理
  • 上交提出TrustGAIN,提出6G网络中可信AIGC新模式!