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

c++ 基于OpenSSL的EVP接口进行SHA3-512和SM3哈希计算

通过OpenSSL的EVP接口进行 SHA3-512SM3 哈希计算

#include <iostream>
#include <openssl/evp.h>
#include <cstring>using namespace std;void PrintHex(const std::string &hexStr)
{for (unsigned char c : hexStr){printf("%02x", c);}printf("\n");
}void TestEVP()
{unsigned char data[128] = "测试EVP SHA3 国密SM3";int data_size = strlen((char *)data);// 初始化EVP上下文auto ctx = EVP_MD_CTX_new();if (ctx == NULL) {cout << "EVP_MD_CTX_new failed!" << endl;return;}// 选择哈希算法,这里选择SHA3-512auto evp_md = EVP_sha3_512();// hash初始化if (EVP_DigestInit_ex(ctx, evp_md, NULL) != 1) {cout << "EVP_DigestInit_ex failed!" << endl;EVP_MD_CTX_free(ctx);return;}// 计算hash值if (EVP_DigestUpdate(ctx, data, data_size) != 1) {cout << "EVP_DigestUpdate failed!" << endl;EVP_MD_CTX_free(ctx);return;}// 获取结果unsigned char out[64] = {0};unsigned int out_size = 0;if (EVP_DigestFinal_ex(ctx, out, &out_size) != 1) {cout << "EVP_DigestFinal_ex failed!" << endl;EVP_MD_CTX_free(ctx);return;}// 打印SHA3-512哈希值cout << "SHA3-512:";cout << "(" << out_size << ")";PrintHex(string(out, out + out_size));// 清理上下文EVP_MD_CTX_free(ctx);// 使用EVP简化接口进行SM3计算EVP_Digest(data, data_size, out, &out_size, EVP_sm3(), NULL);// 打印SM3哈希值cout << "国密SM3:";cout << "(" << out_size << ")";PrintHex(string(out, out + out_size));
}int main() {TestEVP();return 0;
}

代码说明

1. 初始化数据:

unsigned char data[128] = "测试EVP SHA3 国密SM3";
int data_size = strlen((char *)data);

这里使用data数组存储待哈希的字符串 “测试EVP SHA3 国密SM3”,并通过strlen计算字符串的长度。

2. 初始化EVP上下文:

auto ctx = EVP_MD_CTX_new();

创建一个新的EVP上下文,用于管理哈希计算过程。

3. 选择哈希算法:

auto evp_md = EVP_sha3_512();

选择SHA3-512作为哈希算法。

4. 初始化哈希计算:

EVP_DigestInit_ex(ctx, evp_md, NULL);

初始化哈希计算,指定使用evp_md(SHA3-512算法)。

5. 更新哈希值:

EVP_DigestUpdate(ctx, data, data_size);

更新哈希计算的内容,这里是将data数据传入进行哈希。

6. 获取最终哈希结果:

unsigned char out[64] = {0};
unsigned int out_size = 0;
EVP_DigestFinal_ex(ctx, out, &out_size);

计算并获取最终的哈希值。结果会存储在out数组中,out_size会返回哈希结果的长度。

6. 打印SHA3-512哈希值:

cout << "SHA3-512:";
cout << "(" << out_size << ")";
PrintHex(string(out, out + out_size));

7. 清理上下文:

EVP_MD_CTX_free(ctx);

释放EVP上下文。

8. 简化接口调用进行SM3哈希计算:

EVP_Digest(data, data_size, out, &out_size, EVP_sm3(), NULL);

使用OpenSSL提供的简化接口对data进行SM3哈希计算,并将结果存储在out数组中。

9. 打印SM3哈希值:

cout << "国密SM3:";
cout << "(" << out_size << ")";
PrintHex(string(out, out + out_size));
http://www.lryc.cn/news/2401788.html

相关文章:

  • Vue3实现拖拽改变元素大小
  • Spring IoC 详解:原理、实现与实战
  • 深入Java NIO:构建高性能网络应用
  • 数据分析后台设计指南:实战案例解析与5大设计要点总结
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(1)
  • SSH/RDP无法远程连接?腾讯云CVM及通用服务器连接失败原因与超全排查指南
  • 网络测试实战:金融数据传输的生死时速
  • 数据库系统概论(十四)详细讲解SQL中空值的处理
  • 【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3
  • [蓝桥杯]三体攻击
  • 深入解析支撑向量机(SVM):原理、推导与实现
  • 一台电脑联网如何共享另一台电脑?网线方式
  • 面试题:SQL 中如何将 多行合并为一行(合并行数据为列)?
  • MacroDroid安卓版:自动化操作,让生活更智能
  • 力提示(force prompting)的新方法
  • 【Redis实战:缓存与消息队列的应用】
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.12 R语言解题
  • 基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战
  • 告别局域网:实现NASCab云可云远程自由访问
  • 25_05_29docker
  • Java-IO流之缓冲流详解
  • vscode code runner 使用python虚拟环境
  • Python实现markdown文件转word
  • NLP学习路线图(十七):主题模型(LDA)
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)
  • 综采工作面电控4X型铜头连接器 conm/4x100s
  • 用ApiFox MCP一键生成接口文档,做接口测试
  • 在compose中的Canvas用kotlin显示多数据波形闪烁的问题
  • 【学习笔记】MIME
  • 【深尚想】OPA855QDSGRQ1运算放大器IC德州仪器TI汽车级高速8GHz增益带宽的全面解析