openssl3.2 - exp - class warp for sha3-512
文章目录
- openssl3.2 - exp - class warp for sha3-512
- 概述
- 笔记
- 调用方代码
- 子类 - cipher_sha3_512.h
- 子类 - cipher_sha3_512.cpp
- 基类 - cipher_md_base.h
- 基类 - cipher_md_base.cpp
- 备注
- END
openssl3.2 - exp - class warp for sha3-512
概述
前面实验整了一个对buffer进行sha3-512算hash的函数。
实际用的时候,要对几个buffer连续做hash. 前面封装的统一做hash的函数不适用。
重新封装了一个类,只要在类的生命周期中,就可以随时对连续的buffer(可能不在一个函数中)做hash的update.
笔记
调用方代码
bool CPeFileCheck::calc_hash_SHA3_512()
{bool b_rc = false;CCipherSha3_512 hash;do {if (!hash.begin()){break;}// 如果buffer不在一个函数中,将hash的指针传给那些函数做hash.updateif (!hash.update(this->m_pu8_map_file, this->m_u32_file_size)){break;}if (!hash.end()){break;}m_digest_length = hash.get_md_len();if (m_digest_length > sizeof(m_ary_digest_value)){break;}memcpy(m_ary_digest_value, hash.get_md(), hash.get_md_len());b_rc = true;} while (false);return b_rc;
}
子类 - cipher_sha3_512.h
//! \file cipher_sha3_512.h#ifndef __CIPHER_SHA3_512_H__
#define __CIPHER_SHA3_512_H__#include "cipher_md_base.h"class CCipherSha3_512 : public CCipherMdBase
{
public:CCipherSha3_512();virtual ~CCipherSha3_512();
};#endif // #ifndef __CIPHER_SHA3_512_H__
子类 - cipher_sha3_512.cpp
//! \file cipher_sha3_512.cpp#include "pch.h"
#include "cipher_sha3_512.h"CCipherSha3_512::CCipherSha3_512()
{setCiphherName("SHA3-512");
}CCipherSha3_512::~CCipherSha3_512()
{
}
基类 - cipher_md_base.h
//! \file cipher_md_base.h#ifndef __CIPHER_MD_BASE_H__
#define __CIPHER_MD_BASE_H__#include <openssl/evp.h>
#include <string>//! \ref https://blog.csdn.net/LostSpeed/article/details/135581192
class CCipherMdBase
{
public:CCipherMdBase();virtual ~CCipherMdBase();bool begin();bool update(uint8_t* pBuf, int lenBuf);bool end();unsigned int get_md_len() { return m_digest_length; }uint8_t* get_md() { return m_p_digest_value; }void setCiphherName(const char* pszNmae) { m_strCipherName = ((NULL != pszNmae) ? pszNmae : ""); }private:void clear();private:std::string m_strCipherName;OSSL_LIB_CTX* m_ossl_lib_ctx;EVP_MD* m_evp_md;EVP_MD_CTX* m_evp_md_ctx;unsigned int m_digest_length;uint8_t* m_p_digest_value;
};#endif // #ifndef __CIPHER_MD_BASE_H__
基类 - cipher_md_base.cpp
//! \file cipher_md_base.cpp#include "pch.h"
#include "cipher_md_base.h"CCipherMdBase::CCipherMdBase(): m_ossl_lib_ctx(NULL),m_evp_md(NULL),m_evp_md_ctx(NULL),m_digest_length(0),m_p_digest_value(NULL)
{}CCipherMdBase::~CCipherMdBase()
{clear();
}void CCipherMdBase::clear()
{if (NULL != m_evp_md_ctx){EVP_MD_CTX_free(m_evp_md_ctx);m_evp_md_ctx = NULL;}m_digest_length = 0;if (NULL != m_p_digest_value){OPENSSL_free(m_p_digest_value);m_p_digest_value = NULL;}if (NULL != m_evp_md){EVP_MD_free(m_evp_md);m_evp_md = NULL;}if (NULL != m_ossl_lib_ctx){OSSL_LIB_CTX_free(m_ossl_lib_ctx);m_ossl_lib_ctx = NULL;}
}bool CCipherMdBase::begin()
{bool b_rc = false;const char* _psz_option_properties = NULL;do {clear();m_ossl_lib_ctx = OSSL_LIB_CTX_new();if (NULL == m_ossl_lib_ctx) {// fprintf(stderr, "OSSL_LIB_CTX_new() returned NULL\n");break;}/** Fetch a message digest by name* The algorithm name is case insensitive.* See providers(7) for details about algorithm fetching*/if (m_strCipherName.empty()){break;}m_evp_md = EVP_MD_fetch(m_ossl_lib_ctx, m_strCipherName.data(), _psz_option_properties);if (NULL == m_evp_md) {// fprintf(stderr, "EVP_MD_fetch could not find SHA3-512.");break;}/** Make a message digest context to hold temporary state* during digest creation*/m_evp_md_ctx = EVP_MD_CTX_new();if (NULL == m_evp_md_ctx) {// fprintf(stderr, "EVP_MD_CTX_new failed.\n");break;}/** Initialize the message digest context to use the fetched* digest provider*/if (EVP_DigestInit(m_evp_md_ctx, m_evp_md) != 1) {// fprintf(stderr, "EVP_DigestInit failed.\n");break;}b_rc = true;} while (false);return b_rc;
}bool CCipherMdBase::update(uint8_t* pBuf, int lenBuf)
{bool b_rc = false;do {if (EVP_DigestUpdate(m_evp_md_ctx, pBuf, lenBuf) != 1) {// fprintf(stderr, "EVP_DigestUpdate(hamlet_1) failed.\n");break;}b_rc = true;} while (false);return b_rc;}bool CCipherMdBase::end()
{bool b_rc = false;int digest_length = 0;do {/* Determine the length of the fetched digest type */m_digest_length = EVP_MD_get_size(m_evp_md);if (m_digest_length <= 0) {// fprintf(stderr, "EVP_MD_get_size returned invalid size.\n");break;}m_p_digest_value = (uint8_t*)OPENSSL_malloc(m_digest_length);if (NULL == m_p_digest_value) {// fprintf(stderr, "No memory.\n");break;}if (EVP_DigestFinal(m_evp_md_ctx, m_p_digest_value, &m_digest_length) != 1) {// fprintf(stderr, "EVP_DigestFinal() failed.\n");break;}b_rc = true;} while (false);return b_rc;
}
备注
这个封装类用的很舒服。
如果要做其他种类的hash, 只需要继承一个子类,给定新的hash算法名称就行。
END
相关文章:
openssl3.2 - exp - class warp for sha3-512
文章目录 openssl3.2 - exp - class warp for sha3-512概述笔记调用方代码子类 - cipher_sha3_512.h子类 - cipher_sha3_512.cpp基类 - cipher_md_base.h基类 - cipher_md_base.cpp备注END openssl3.2 - exp - class warp for sha3-512 概述 前面实验整了一个对buffer进行sha…...

cog predict docker unknown flag: --file
如图: 使用cog predict -i image“link-to-image” 出现docker unknown flag: --file的问题。 解决方法(对我可行):切换cog版本。 这个是我一开始的cog安装命令(大概是下的最新版?)࿱…...
SpringMVC接收参数方式讲解
PathVariable 该注解用于接收具有Restful风格的参数,如/api/v1/1001,最终userId的值为1001。 如下代码中,使用name属性可以指定GetMapping中的id名称与之对应,从而可以自定义参数名称userId,而不是使用默认名称id G…...
JavaScript 中arguments 对象详细解析与案例
在JavaScript中,每个函数都有一个内部对象arguments,它包含了函数调用时传递的所有参数。arguments对象类似一个数组,但是它并不是真正的数组,它没有数组的方法,只有length属性和索引访问元素的能力。 以下是对argume…...

消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测
Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测 摘要Introduction本文方法Single-Modal BEV Feature ExtractionSemantic-guided Flow-based AlignmentDissolved…...

【免安装的MATLAB--MATLAB online】
目录: 前言账号的注册图片处理的示例准备图片脚本函数 总结 前言 在计算机、数学等相关专业中,或多或少都会与MATLAB产生藕断丝连的联系,如果你需要使用MATLAB,但是又不想要安装到自己的电脑上(它实在是太大了啊&#…...

Flyway 数据库版本管理
一、Flyway简介 Flyway是一款开源的数据库迁移工具,可以管理和版本化数据库架构。通过Flyway,可以跟踪数据库的变化,并将这些变化作为版本控制的一部分。Flyway支持SQL和NoSQL数据库,并且可以与现有的开发流程无缝集成࿰…...

lua学习笔记19(面相对象学习的一点总结)
print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…...

视觉SLAM学习打卡【10】-后端·滑动窗口法位姿图
本节是对上一节BA的进一步简化,旨在提高优化实时性.难点在于位姿图部分的雅可比矩阵求解(涉及李代数扰动模型求导),书中的相关推导存在跳步(可能数学功底强的人认为过渡的理所当然),笔者参考了知…...

【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和
本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues,长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数…...

CSS核心样式-02-盒模型属性及扩展应用
目录 三、盒模型属性 常见盒模型区域 盒模型图 盒模型五大属性 1. 宽度 width 2. 高度 height 3. 内边距 padding 四值法 三值法 二值法 单值法 案例 4. 边框 border 按照属性值的类型划分为三个单一属性 ①线宽 border-width ②线型 border-style ③边框颜色 bo…...

在 Google Cloud 上轻松部署开放大语言模型
今天,“在 Google Cloud 上部署”功能正式上线! 这是 Hugging Face Hub 上的一个新功能,让开发者可以轻松地将数千个基础模型使用 Vertex AI 或 Google Kubernetes Engine (GKE) 部署到 Google Cloud。 Model Garden (模型库) 是 Google Clou…...

005Node.js模块URL的使用
引入 URL 模块 要使用 URL 模块,首先需要在代码中引入它。可以使用以下代码将 URL 模块导入到你的脚本中: const url require(url);实例代码 const urlrequire(url); var apihttp://www.baidu.com?nameshixiaobin&age20; console.log(url.parse(…...

美团笔试复盘
昨天做了美团的笔试,现在复盘一下。 1、将数组按照绝对值大小排序 有道算法题解决思路需要将数组按照绝对值大小进行排序,我使用的是sort方法Comparator比较器实现的,这里记录一下: public static void main(String[] args) {In…...

IntelliJ IDEA - Since Maven 3.8.1 http repositories are blocked
问题描述 新下载的 IDEA 在构建项目时,在下载引用的包时出现 “Since Maven 3.8.1 http repositories are blocked” 的问题。 原因分析 从 Maven 3.8.1 开始,不再支持 http 的包了。由于现在对网络安全的日益重视,都在向 https 转变&#…...
Django的APP应用更名(重命名)流程
将Django中的一个现有APP更名是一个需要谨慎操作的过程,因为它涉及到多个文件和配置的更新。下面是详细的步骤和一些补充细节,帮助你更顺利地完成APP重命名: 1. 修改APP名称及相关引用 更改APP目录名称: 首先,重命名…...

ChatGLM3-6B大语言模型离线执行
ChatGLM3-6B大语言模型离线执行 模型准备 一般而言,模型和模型参数可以通过如下三个模型源进行相应的下载: HuggingFace | ModelScope | WiseModel 本实例中,使用的是HuggingFace的源下载,相应的地址如下: HuggingFa…...

了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要…...
2024.4.14力扣每日一题——设计哈希集合
2024.4.14 题目来源我的题解方法一 链表数组 题目来源 力扣每日一题;题序:705 我的题解 方法一 链表数组 由于给定限制次数为10000,所以构造一个长度为10001的链表数组。对于add操作先看数组对应的位置是否为null或者为空,若是…...
SQL explain 显示子查询A类型为ALL怎么优化
当 SQL EXPLAIN 显示子查询 A 的类型为 ALL 时,这意味着数据库系统正在执行全表扫描,而不是使用索引来执行子查询。全表扫描可能会导致性能下降,特别是在大型表上。 为了优化这种情况,您可以考虑以下几点: 1. **索引…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...

【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...