libgcrypt-1.10.2编程-计算摘要

2023-10-26


使用libgcrypt计算摘要

libgcrypt编程计算摘要的方式有2种,一种可用来计算小数据的摘要,如字符串; 一种可用来计算大数据的摘要,如文件、网络字节流等

下面的代码示例中用到了 cppcodec 工具库,用于将计算的摘要结果转换成hex十六进制字符串或者base64字符串

使用 libgcrypt 库有一个方便之处就是它已经支持国密算法 sm2、sm3、sm4,不过按照国密标准带公钥计算sm3摘要这种可能没支持,我暂时没找到官网源代码中有这样的示例或说明,这个就得自己封装了


一、计算少量数据摘要

计算少量数据摘要步骤较为简单,一般直接调用 gcry_md_hash_buffer API就行,参数中有一个指针参数作为输出参数。API gcry_md_get_algo_dlen 用于获取指定摘要算法的摘要长度,一般使用枚举 gcry_md_algos 作为摘要算法名,如
GCRY_MD_SHA1 GCRY_MD_SHA256 GCRY_MD_SM3

void calcWay1(const char* buffer) {
    int msg_len = strlen(buffer);
    int mdLen = gcry_md_get_algo_dlen(GCRY_MD_SHA1);
    uint8_t* hash = new uint8_t[mdLen];
    gcry_md_hash_buffer(GCRY_MD_SHA1, hash, buffer, msg_len);

    std::cout << "十六进制输出: " << hex::encode(hash, mdLen) << std::endl;
    std::cout << "base64输出: " << base64::encode(hash, mdLen) << std::endl;
    delete[] hash;
}

二、计算大量数据摘要

与 OpenSSL 库作类比,计算大量数据摘要步骤一般固定如下

  1. gcry_md_open 创建摘要计算处理器(上下文),这一点跟 OpenSSL 类似
  2. gcry_md_write 多次调用传入数据,如读取文件时,循环读取数据到缓存中,将缓存作为参数循环传入该函数
  3. gcry_md_read 获取计算的摘要值
  4. gcry_md_close 关闭摘要计算处理器
void calcWay2(const char *buffer) {
    gcry_md_algos md_algos = GCRY_MD_SHA1;
    int mdLen = gcry_md_get_algo_dlen(md_algos);

    gcry_md_hd_t hd = nullptr;
    gcry_error_t error = gcry_md_open(&hd, md_algos, 0);
    if (error != GPG_ERR_NO_ERROR) {
        fprintf(stderr, "gcry_md_open error\n");
        exit(1);
    }

    // 多次调用 gcry_md_write 函数,适用于大数据摘要计算
    size_t length = strlen(buffer);
    gcry_md_write(hd, buffer, length);
    gcry_md_write(hd, buffer, length);

    uint8_t* hash = gcry_md_read(hd, md_algos);
    std::cout << "十六进制输出: " << hex::encode(hash, mdLen) << std::endl;
    std::cout << "base64输出: " << base64::encode(hash, mdLen) << std::endl;
    gcry_md_close(hd);
}

在main函数中调用

cppcodec 见文章开头说明,是 github 上一个基于C++的 hex、base32、base64 转换工具

#include <gcrypt.h>
#include <iostream>
#include "cppcodec/base64_rfc4648.hpp"
#include "cppcodec/hex_upper.hpp"

using base64 = cppcodec::base64_rfc4648;
using hex = cppcodec::hex_upper;

void calcWay1(const char *buffer);
void calcWay2(const char *buffer);

int main(int argc, char** argv){
    if (argc < 3) {
        fprintf(stderr, "Usage: %s arg1 arg2\n", argv[0]);
        exit(1);
    }

    int way = atoi(argv[1]);
    if (way == 1) {
        calcWay1(argv[2]);
    } else if (way == 2) {
        calcWay2(argv[2]);
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libgcrypt-1.10.2编程-计算摘要 的相关文章

随机推荐

  • javanio应用场景,从理论到实践!

    直击面试 反正我是带着这些问题往下读的 说一下 JVM 运行时数据区吧 都有哪些区 分别是干什么的 Java 8 的内存分代改进 举例栈溢出的情况 调整栈大小 就能保存不出现溢出吗 分配的栈内存越大越好吗 垃圾回收是否会涉及到虚拟机栈 方法
  • moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color详解

    前往老猿Python博文目录 注意 本文为收费专栏文章 对应免费专栏文章为 moviepy音视频剪辑 颜色相关变换函数blackwhite colorx fadein out gamma corr invert colors lum con
  • Java 匿名对象

    一 简介 1 1 含义 没有名字的对象 以常规的创建对象的方法 AtomicInteger atomicInteger new AtomicInteger 100000 格式 类名 变量名 new 类名 这样就完成了对象的创建 注意 内可以
  • windows系统启动服务一直不成功,查看windows日志方法

    今天遇到一个问题 windows系统部署了spring cloud的服务 手动执行start bat文件可以启动服务 用服务的方式启动就一直启动不了 通过 控制面板 gt 管理工具 在 事件查看器 gt windows日志 gt 应用程序
  • 遮罩和蒙版有什么区别,视频遮罩怎么用

    在制作短视频时 好多小伙伴分不清遮罩与蒙版的区别 甚至有的人认为它们就是一个东西 要说起来 这两个看似一样的概念 其实还是有很大的区别 今天就来带各位了解一下遮罩和蒙版有什么区别 视频遮罩怎么用 希望对各位认识并理解蒙版和遮罩有一定的帮助
  • 根据java实体类生成创建表sql步骤

    根据java实体类生成创建表sql步骤 根据java实体类生成创建表sql语句时 方法是利用java反射 AOP注解 主要步骤如下 1 注解类 一般在生成表的时候 需要表名 主键名 字段名 对应到注解上至少要体现出这三部分 1 1表名 主键
  • 【Flutter 组件】004-基础组件:图片及 ICON

    Flutter 组件 004 基础组件 图片及 ICON 一 图片 1 Image 概述 Flutter 中 我们可以通过 Image 组件来加载并显示图片 Image 的数据源可以是 asset 文件 内存以及网络 Image 是一个用于
  • FLINK SQL实战案例之商品销量实时统计

    问题导读1 本文的业务包含哪些流程 2 本文难点在什么地方 3 如何通过flink sql实现商品销量实时统计 1 案例背景介绍互联网电商往往需要对订单商品销量实时统计 用于实时大屏展示 库存销量监控等等 本文主要介绍如何通过flink s
  • Vim/Vi中保存文件并退出编辑器

    Vim Vi模式 启动Vim编辑器时 处于正常模式 在这种模式下 可以使用vim命令并浏览文件 0 打开package json 终端命令vim package json 1 进入编辑模式 按 i键 2 按 Esc可返回正常模式 3 打开文
  • 如何给数据库中的表插入数据?

    R星校长 为表的所有字段插入数据 向表中插入数据最简单的方法就是使用INSERT语句 INSERT语句需要你声明要插入内容的表 table 名和内容 values 语法规则为 INSERT INTO 表名 字段名 VALUES 内容 举个例
  • uni-app引入web3在真机运行下兼容性处理方法

    uni app开发跨平台应用程序 项目搭建主要前端框是Uni app Vue3 TS Vite 项目搭建参考文章Uni app Vue3 TS Vite 创建项目 Hbuilderx版本是3 6 17 安装web3 yarn add web
  • WebRTC音频系统 peerconnection初始化

    文章目录 2 1 peerconnection conductor 2 2 PeerConnectionFactory和PeerConnection 2 2 1 CreatePeerConnectionFactory 2 2 2 PeerC
  • vue之tab栏切换

    一个简单的tab栏切换组件 由tabs以及tab pane组成 效果图 使用
  • 物联网LoRa系列-32:LoRaWAN无线智能水表如何进行水量数据采集?脉冲采集、双干簧管、磁性元件、光电转换、霍尔元件

    目录 1 无线远传智能水表概述 2 常用智能水表的发展与类型 3 智能水表数据的采集的基本原理 3 1 光电转换型原理 3 2 双干簧管数据采集的基本原理 3 3 霍尔元件型原理 4 干簧管脉冲检测的基本原理 4 1 干簧管概述 干簧管是一
  • 一种比较省内存的稀疏矩阵Python存储方案

    原文 http www pythontab com html 2014 pythonhexinbiancheng 0522 788 html 推荐系统中经常需要处理类似user id item id rating这样的数据 其实就是数学里面
  • js的数据交互

    JSP 几个内置对象 out request response session 一 application 1 介绍 application 他是代表的整个项目的全局对象 application 所有项目下面的页面共享 所有的浏览器用户 访
  • 【问题解决】VSCode ESLint 保存格式化时不生效

    问题描述 VSCode 中安装了 Prettier 和 ESLint 插件 在项目中使用了 eslintrc js 文件规范项目代码 但是保存代码时格式化并不是按该文件的配置而是按 Prettier 的配置 问题解决 修改 Settings
  • 力扣的题库突然打不开的解决办法

    问题 力扣的题目打开很慢 然后题目那是灰色 解决方案 换个浏览器 清楚浏览器缓存 如果上述方法都不可以 检查一下自己有没有安装 脚本 如果有的话可以停用他 在浏览器右上角 有管理扩展的地方 停用一下油猴这个扩展 我下面的是已经删除之后的图
  • batocera 完整包_Batocera Plus 可能是现如今最强最全最好用的模拟器集成系统!

    Btocera PLUS系统开机界面 相信玩Batocera的圈子里面Batocera Plus 绝对是青出于蓝而胜于蓝的超级强劲改版 我们来细说为什么Batocera Plus如何受众人爱戴 甚至超过了原版的Batocera 自batoc
  • libgcrypt-1.10.2编程-计算摘要

    文章目录 使用libgcrypt计算摘要 一 计算少量数据摘要 二 计算大量数据摘要 在main函数中调用 使用libgcrypt计算摘要 libgcrypt编程计算摘要的方式有2种 一种可用来计算小数据的摘要 如字符串 一种可用来计算大数