OpenSSL-3.0.3编程—采用EVP方式计算数据摘要
文章目录
- 使用OpenSSL推荐的EVP高级接口计算摘要
- 样例代码
- 推荐阅读 OpenSSL 官方 wiki
- 摘要实现类简要说明
- handleErrors 函数
- 总结
使用OpenSSL推荐的EVP高级接口计算摘要
OpenSSL 源代码中低级接口被标记为废弃 deprecated,为了与 OpenSSL 保持同步,记录一下 OpenSSL 高级接口计算摘要的方法。低级接口的使用请参考前面的文章——OpenSSL-3.0.3编程—计算数据摘要
直接使用openssl API 计算摘要一般包含如下三个步骤,与低级接口类似,多了一步分配空间
- 创建摘要上下文,分配空间
- 初始化指定摘要算法的上下文
- 更新数据。可以添加多次,比如"hello, world" 可以分两次更新,可以参考如下代码
- 计算摘要值。对第3步更新的所有的数据计算摘要,通过传出参数返回摘要值
- 使用 EVP_MD_CTX_free 释放资源(重要)
- 将第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方式计算数据摘要相关推荐
- OpenSSL-3.0.3编程—封装EVP摘要计算为C++类EvpDigest
文章目录 使用OpenSSL推荐的EVP高级接口计算摘要 EvpDigest 类定义 1.EvpDigest 头文件接口 2.EvpDigest 类函数实现 3.使用 EvpDigest 类计算摘要, ...
- TP驱动调试分享——基于Qualcomm SDM710平台Android9.0,TP 采用I2C方式和CPU进行通信
目录 1 厂商驱动代码的添加 1.1 synaptics_dsx代码放到SDM710 kernel input相应目录 1.2 修改input/touchscreen目录下的Makefile和Kcon ...
- 循环彩灯编程c语言环境,如何用汇编语言写一个循环彩灯的程序,采用定时器方式1工作...
如何用汇编语言写一个循环彩灯的程序,采用定时器方式1工作 关注:120 答案:2 信息版本:手机版 解决时间 2019-01-09 23:07 遮云壑 2019-01-09 14:42 由89C5 ...
- 【51单片机】串行口连接74LS164进行串行/并行转换,输出到一个七段数码管。数码管循环显示0-9。采用串行通信方式0,定时间隔1秒。
实验内容:51单片机的串行口连接74LS164进行串行/并行转换,然后输出到一个七段数码管.数码管循环显示0-9这10个数字.要求采用串行通信方式0,定时间隔1秒. 工具:proteus+keil # ...
- 基于openEuler的OpenSSL编译安装和编程基础
文章目录 基于openEuler的OpenSSL编译安装和编程基础 OpenSSL编译安装 OpenSSL命令的使用 OpenSSL编程 简单测试 BASE64算法 作业 参考资料 基于openEul ...
- 【转】使用 OpenSSL API 进行安全编程 - 创建基本的安全连接和非安全连接
Table of Contents 先决条件 什么是 SSL? 什么是 OpenSSL? 您需要什么 头文件和初始化 建立非安全连接 打开连接 与服务器进行通信 关闭连接 建立安全连接 为安全连接进行 ...
- Visual C++串口通信编程---多线程异步方式
Visual C++串口通信编程---多线程异步方式 1. 串口通信基础 提到串口让人想起并口,它们是计算机中两个比较重要的通信方式. 串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占 ...
- RxJava2.x是一个非常棒的流式编程,采用的观察者模式思想,事件的产生者产生事间之后发送给绑定的接受者,接受顺序与发送顺序一致.但是 是独立于RxJava1.x存在,本文讲解RxJava2.x的简
RxJava2.x是一个非常棒的流式编程,采用的观察者模式思想,事件的产生者产生事间之后发送给绑定的接受者,接受顺序与发送顺序一致.但是 是独立于RxJava1.x存在,本文讲解RxJava2.x的简 ...
- 任务1、采用面向对象方式求三角形面积
文章目录 任务1.采用面向对象方式求三角形面积 (一)编程实现 1.采用面向过程的思路 2.采用面向对象的思路 (二)讲解知识点 (三)拓展练习 任务1.创建学生类并测试 任务2.采用面向对象求解一元 ...
最新文章
- 吐血整理:24种可视化图表优缺点对比,一图看懂!
- 一场“交通进化”将至: 5G带给车联网与自动驾驶哪些升级?
- 后缀数组的学习(三):SA数组实现代码分析
- 给自己提个醒:关于document.getElementsByName无法获取非表单元素
- SMMU学习这一篇就够了
- php 使用sendgrid api 发送邮件_linux - 使用命令发送邮件
- 【转】 Android 屏幕切换总结
- oracle说明性弹性域,ORACLE EBS 基础和提高 - 说明弹性域(ZHENGANG.ZHU).pdf
- 人人想健康!但,健康的,最主要因素,是什么?
- 【mysql】join的用法和修改数据表
- linux第五单元作业,第五单元《微型计算机系统》教案
- 微信投票python脚本_微信投票python脚本
- 泛函分析笔记(七) 连续线性算子和连续多重线性映射
- 基于web的仿Steam游戏网
- MATLAB中plot函数使用
- Gin显示静态文件如图片,音频
- java星星图案总结
- Flutter 页面更新流程剖析
- XMLWorkerHelper生成pdf文件添加页眉页脚
- vue element-ui之分页组件的封装
热门文章
- 1998世界杯主题曲[生命之杯]Ricky.Martin
- PLC中ST编程的基础知识
- OpenDDS系列(3) —— 第一个OpenDDS程序
- 【优化控制】基于遗传算法实现优化LQR控制器含Matlab源码
- 1950-2021《中国统计年鉴》超长时间跨度动态面板数据 (70w+)实际统计年份1949-2020
- 【程序源代码】毕业设计源码推荐
- 论文阅读 Local Differential Privacy-Based Federated Learning for Internet of Things
- App图标不显示:Xcode项目在Xcode9中运行会出现AppIcon不显示的 BUG
- matlab抛物偏微分方程,抛物型方程差分求解 跪求MATLAB解抛物型偏微分方程的程序...
- socket.io搭建聊天室