国密起步3:GmSSL3使用SM3(哈希)

embedded/2024/12/21 12:21:02/

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        源码在othertest目录。

目录

SM3-toc" style="margin-left:0px;">一、什么是SM3

二、函数介绍

2.1 摘要

SM3-toc" style="margin-left:40px;">2.2 SM3

三、测试代码

四、运行和输出


SM3">一、什么是SM3

        SM3算法>哈希算法,对应SHA和MD5。

        sm3头文件sm3.h。digest.h是摘要,包含了sm3、sha等算法

二、函数介绍

2.1 摘要

        主要是这么几个:

const DIGEST *digest_from_name(const char *name);
const char *digest_name(const DIGEST *digest);
int digest_init(DIGEST_CTX *ctx, const DIGEST *algor);
int digest_update(DIGEST_CTX *ctx, const uint8_t *data, size_t datalen);
int digest_finish(DIGEST_CTX *ctx, uint8_t *dgst, size_t *dgstlen);
int digest(const DIGEST *digest, const uint8_t *data, size_t datalen, uint8_t *dgst, size_t *dgstlen);

        digest_from_name根据算法名获得全局的DIGEST指针,sm3算法的名字是“sm3”。

        digest一次性生成摘要,如果数据量比较小就用这个就好了。

SM3">2.2 SM3

        主要是这么几个:

#define SM3_DIGEST_SIZE		32
#define SM3_BLOCK_SIZE		64
#define SM3_STATE_WORDS		8void sm3_init(SM3_CTX *ctx);
void sm3_update(SM3_CTX *ctx, const uint8_t *data, size_t datalen);
void sm3_finish(SM3_CTX *ctx, uint8_t dgst[SM3_DIGEST_SIZE]);

        很简单,不断地提供数据就可以生成摘要。

三、测试代码

        代码如下:

//myGmSSL_sm3.h 文件编码:UTF-8无签名#pragma once#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <gmssl/sm3.h>
#include <gmssl/digest.h>
#include <vector>
#include "Buffer.h"
#include "mimetype.h"
using namespace std;namespace ns_my_std
{class CMyGmSSL_sm3{private:static unsigned char getVer() { return 1; }static void show_buf(char const* title, unsigned char const* buf, int len){cout << title << " ";for (int i = 0; i < len; ++i){cout << hex << setw(2) << setfill('0') << (unsigned int)buf[i] << " ";}cout << endl;}public:static bool sm3_test(){if (true){thelog << "SM3摘要测试" << endi;uint8_t dgst[SM3_DIGEST_SIZE];size_t dgstlen;const DIGEST* algor = digest_from_name("sm3");digest(algor, (uint8_t*)"abc", 3, dgst, &dgstlen);printf("算法:%s 长度(%zu) \n", digest_name(algor), dgstlen);show_buf("digest",dgst, dgstlen);}if (true){SM3_CTX sm3_ctx;uint8_t dgst[SM3_DIGEST_SIZE];sm3_init(&sm3_ctx);sm3_update(&sm3_ctx, (uint8_t*)"abc", 3);sm3_finish(&sm3_ctx, dgst);show_buf("sm3   ", dgst, SM3_DIGEST_SIZE);}return true;}};
}

        分别用digest接口和sm3接口计算哈希,因为digest用的也是sm3,输出应该是相同的。 

四、运行和输出

        在othertest目录下执行run.sh,执行命令3:

命令表
命令 组           名称          命令 说明
---- ------------ ------------- ---- --------
a    未命名命令组 TestGmSSL     a    国密测试
x    未命名命令组 TestGmSSL_sm4 x    国密测试
3    未命名命令组 TestGmSSL_sm3 3    国密测试
---- ------------ ------------- ---- --------请选择命令:(--group选择命令组 b=break)(q=exit default=3):[08-26 17:06:46][应用][信息] 用户输入的是:3
[08-26 17:06:46][应用][信息][myGmSSL_sm3.h           :  38(sm3_test)][  0.00]SM3摘要测试
sm3 (32)
digest 66 c7 f0 f4 62 ee ed d9 d1 f2 d4 6b dc 10 e4 e2 41 67 c4 87 5c f2 f7 a2 29 7d a0 2b 8f 4b a8 e0
sm3    66 c7 f0 f4 62 ee ed d9 d1 f2 d4 6b dc 10 e4 e2 41 67 c4 87 5c f2 f7 a2 29 7d a0 2b 8f 4b a8 e0
[08-26 17:06:46][应用][信息][CommandSet.h            : 129(doCommand)][  0.00]
命令 TestGmSSL_sm3 执行完毕 返回码 0

        因为digest用的也是sm3,所以输出结果相同。


(这里是文档结束)


http://www.ppmy.cn/embedded/103921.html

相关文章

5Kg负重30分钟长航时多旋翼无人机详解

5Kg负重、30分钟长航时的多旋翼无人机&#xff0c;在设计和应用上都有着特定的要求和优势。以下是对这种无人机的详细解析&#xff1a; 一、设计与结构 运输无人机稳定版&#xff0c;采用环抱式四旋翼折叠&#xff0c;搭载悬挂式电池及搭载运输平台&#xff0c;机身中心连接固…

Spring Cloud Eureka与Kubernetes的集成:服务发现的混合方案

Spring Cloud Eureka与Kubernetes的集成&#xff1a;服务发现的混合方案 引言 随着微服务架构的流行&#xff0c;服务发现&#xff08;Service Discovery&#xff09;已经成为构建分布式系统的关键组件之一。在分布式系统中&#xff0c;服务实例的数量和位置是动态变化的&…

SpringBoot集成MybatisPlus

1. 初始化 Spring Boot 项目 首先&#xff0c;使用 Spring Initializr 生成一个 Spring Boot 项目&#xff0c;并添加以下依赖&#xff1a; <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</grou…

Call openai-node in the backend or call https in the frontend?

题意&#xff1a;在后端调用 openai-node 还是在前端调用 https&#xff1f; 问题背景&#xff1a; I have a web application by ReactJS and Nodejs. This application calls OpenAI APIs. 我有一个使用 ReactJS 和 Node.js 开发的 Web 应用程序。这个应用程序调用 OpenAI …

C语言 | Leetcode C语言题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b))int lengthLongestPath(char * input){int n strlen(input);int pos 0;int ans 0;int * level (int *)malloc(sizeof(int) * (n 1));memset(level, 0, sizeof(int) * (n 1));while (po…

docker加速配置 daemon.json

配置docker 加速 提高下载速度 在某些地区&#xff0c;尤其是中国&#xff0c;Docker Hub 的访问速度可能较慢&#xff0c;导致镜像下载时间过长。通过配置加速器&#xff0c;可以显著提高镜像的拉取速度&#xff0c;减少等待时间。 减少网络不稳定带来的影响 网络不稳定可能导…

HTML基本标签

文章目录 HTML介绍HTML标签介绍标题标签段落标签换行标签span标签div标签img标签超链接标签特殊字符格式化标签 HTML介绍 HTML&#xff08;HyperText Markup Language&#xff09;是超文本标记语言。它由一系列的元素&#xff08;即标签&#xff09;组成&#xff0c;每个标签都…

单元测试、系统测试和集成测试知识详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单元测试的概念 单元测试是对软件基本组成单元进行的测试&#xff0c;如函数或一个类的方法。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff…