文章目录

  • 使用OpenSSL推荐的EVP高级接口计算摘要
  • 样例代码
    • 推荐阅读 OpenSSL 官方 wiki
    • 摘要实现类简要说明
    • handleErrors 函数
  • 总结

使用OpenSSL推荐的EVP高级接口计算摘要

OpenSSL 源代码中低级接口被标记为废弃 deprecated,为了与 OpenSSL 保持同步,记录一下 OpenSSL 高级接口计算摘要的方法。低级接口的使用请参考前面的文章——OpenSSL-3.0.3编程—计算数据摘要

直接使用openssl API 计算摘要一般包含如下三个步骤,与低级接口类似,多了一步分配空间

  1. 创建摘要上下文,分配空间
  2. 初始化指定摘要算法的上下文
  3. 更新数据。可以添加多次,比如"hello, world" 可以分两次更新,可以参考如下代码
  4. 计算摘要值。对第3步更新的所有的数据计算摘要,通过传出参数返回摘要值
  5. 使用 EVP_MD_CTX_free 释放资源(重要)
  6. 将第4步计算的二进制摘要值转换为十六进制或Base64输出,本步骤可省略,看具体需要采用合适的方式

样例代码

#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/md5.h>
#include <string.h>
#include <iostream>
#include "CommonFun.h"int main(int argc, char* argv[]) {// 1.创建摘要上下文,分配空间EVP_MD_CTX* mdctx = EVP_MD_CTX_new();if (mdctx == nullptr) {handleErrors();}// 2.用指定摘要算法初始化上下文指针int retInit = EVP_DigestInit_ex(mdctx, EVP_sha384(), nullptr);if (retInit != 1) {handleErrors();}const char* data = "123456";// 3.传入待计算摘要的原始数据,update。可以调用多次 updateint retUpdate = EVP_DigestUpdate(mdctx, data, strlen(data));if (retUpdate != 1) {handleErrors();}unsigned char* md = new unsigned char[MD5_DIGEST_LENGTH];unsigned int digestLength = MD5_DIGEST_LENGTH;// 4.计算哈希值int retFinal = EVP_DigestFinal_ex(mdctx, md, &digestLength);if (retFinal != 1) {handleErrors();}// 5.将二进制哈希值转换为十六进制输出char* mdHex = new char[digestLength * 2 + 1];for (int i = 0; i < digestLength; ++i) {sprintf(&mdHex[i * 2], "%02x", md[i]);}std::cout << "摘要值: " << mdHex << std::endl;delete[] mdHex;EVP_MD_CTX_free(mdctx);return 0;
}

推荐阅读 OpenSSL 官方 wiki

这个 OpenSSL wiki 网站包含一些简单的 sdk api 使用,它的更新好像不是很及时,不过初学者可以借鉴


摘要实现类简要说明

函数 EVP_DigestInit_ex 的第二个参数可以指定摘要算法,如 EVP_sha1、EVP_sha224、EVP_sha256、EVP_sha3_256、EVP_sm3……另外,EVP_sha256 与 EVP_sha3_256 有啥区别还没明白,以后明白了再补充

特别说明: OpenSSL3 里面包含国密算法,如 sm2、sm3、sm4,若要使用sm3计算摘要,可以在函数 EVP_DigestInit_ex 第二个参数传入 EVP_sm3()

几个函数的使用步骤

  • 步骤1: 使用 EVP_MD_CTX_new 函数给摘要上下文指针分配空间
  • 步骤2: 使用 EVP_DigestInit_ex 函数指定摘要算法,并初始化上下文指针
  • 步骤3: 使用 EVP_DigestUpdate 函数更新数据,可以调用多次
  • 步骤4: 使用 EVP_DigestFinal_ex 计算摘要
  • 步骤5: 补充一个比较重要的步骤,使用 EVP_MD_CTX_free 释放资源
  • 步骤6: (可省略)将二进制摘要值转换为十六进制输出

handleErrors 函数

#include <iostream>
#include <openssl/err.h>void handleErrors(void) {ERR_print_errors_fp(stderr);abort();
}

总结

OpenSSL-3.0.3编程—采用EVP方式计算数据摘要相关推荐

  1. OpenSSL-3.0.3编程—封装EVP摘要计算为C++类EvpDigest

    文章目录 使用OpenSSL推荐的EVP高级接口计算摘要 EvpDigest 类定义 1.EvpDigest 头文件接口 2.EvpDigest 类函数实现 3.使用 EvpDigest 类计算摘要, ...

  2. TP驱动调试分享——基于Qualcomm SDM710平台Android9.0,TP 采用I2C方式和CPU进行通信

    目录 1 厂商驱动代码的添加 1.1 synaptics_dsx代码放到SDM710 kernel input相应目录 1.2 修改input/touchscreen目录下的Makefile和Kcon ...

  3. 循环彩灯编程c语言环境,如何用汇编语言写一个循环彩灯的程序,采用定时器方式1工作...

    如何用汇编语言写一个循环彩灯的程序,采用定时器方式1工作 关注:120  答案:2  信息版本:手机版 解决时间 2019-01-09 23:07 遮云壑 2019-01-09 14:42 由89C5 ...

  4. 【51单片机】串行口连接74LS164进行串行/并行转换,输出到一个七段数码管。数码管循环显示0-9。采用串行通信方式0,定时间隔1秒。

    实验内容:51单片机的串行口连接74LS164进行串行/并行转换,然后输出到一个七段数码管.数码管循环显示0-9这10个数字.要求采用串行通信方式0,定时间隔1秒. 工具:proteus+keil # ...

  5. 基于openEuler的OpenSSL编译安装和编程基础

    文章目录 基于openEuler的OpenSSL编译安装和编程基础 OpenSSL编译安装 OpenSSL命令的使用 OpenSSL编程 简单测试 BASE64算法 作业 参考资料 基于openEul ...

  6. 【转】使用 OpenSSL API 进行安全编程 - 创建基本的安全连接和非安全连接

    Table of Contents 先决条件 什么是 SSL? 什么是 OpenSSL? 您需要什么 头文件和初始化 建立非安全连接 打开连接 与服务器进行通信 关闭连接 建立安全连接 为安全连接进行 ...

  7. Visual C++串口通信编程---多线程异步方式

    Visual C++串口通信编程---多线程异步方式 1. 串口通信基础 提到串口让人想起并口,它们是计算机中两个比较重要的通信方式. 串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占 ...

  8. RxJava2.x是一个非常棒的流式编程,采用的观察者模式思想,事件的产生者产生事间之后发送给绑定的接受者,接受顺序与发送顺序一致.但是 是独立于RxJava1.x存在,本文讲解RxJava2.x的简

    RxJava2.x是一个非常棒的流式编程,采用的观察者模式思想,事件的产生者产生事间之后发送给绑定的接受者,接受顺序与发送顺序一致.但是 是独立于RxJava1.x存在,本文讲解RxJava2.x的简 ...

  9. 任务1、采用面向对象方式求三角形面积

    文章目录 任务1.采用面向对象方式求三角形面积 (一)编程实现 1.采用面向过程的思路 2.采用面向对象的思路 (二)讲解知识点 (三)拓展练习 任务1.创建学生类并测试 任务2.采用面向对象求解一元 ...

最新文章

  1. 吐血整理:24种可视化图表优缺点对比,一图看懂!
  2. 一场“交通进化”将至: 5G带给车联网与自动驾驶哪些升级?
  3. 后缀数组的学习(三):SA数组实现代码分析
  4. 给自己提个醒:关于document.getElementsByName无法获取非表单元素
  5. SMMU学习这一篇就够了
  6. php 使用sendgrid api 发送邮件_linux - 使用命令发送邮件
  7. 【转】 Android 屏幕切换总结
  8. oracle说明性弹性域,ORACLE EBS 基础和提高 - 说明弹性域(ZHENGANG.ZHU).pdf
  9. 人人想健康!但,健康的,最主要因素,是什么?
  10. 【mysql】join的用法和修改数据表
  11. linux第五单元作业,第五单元《微型计算机系统》教案
  12. 微信投票python脚本_微信投票python脚本
  13. 泛函分析笔记(七) 连续线性算子和连续多重线性映射
  14. 基于web的仿Steam游戏网
  15. MATLAB中plot函数使用
  16. Gin显示静态文件如图片,音频
  17. java星星图案总结
  18. Flutter 页面更新流程剖析
  19. XMLWorkerHelper生成pdf文件添加页眉页脚
  20. vue element-ui之分页组件的封装

热门文章

  1. 1998世界杯主题曲[生命之杯]Ricky.Martin
  2. PLC中ST编程的基础知识
  3. OpenDDS系列(3) —— 第一个OpenDDS程序
  4. 【优化控制】基于遗传算法实现优化LQR控制器含Matlab源码
  5. 1950-2021《中国统计年鉴》超长时间跨度动态面板数据 (70w+)实际统计年份1949-2020
  6. 【程序源代码】毕业设计源码推荐
  7. 论文阅读 Local Differential Privacy-Based Federated Learning for Internet of Things
  8. App图标不显示:Xcode项目在Xcode9中运行会出现AppIcon不显示的 BUG
  9. matlab抛物偏微分方程,抛物型方程差分求解 跪求MATLAB解抛物型偏微分方程的程序...
  10. socket.io搭建聊天室