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

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

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

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


源码在othertest目录。

目录

一、什么是SM3

二、函数介绍

[2.1 摘要](#2.1 摘要)

[2.2 SM3](#2.2 SM3)

三、测试代码

四、运行和输出


一、什么是SM3

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

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

二、函数介绍

2.1 摘要

主要是这么几个:

cpp 复制代码
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一次性生成摘要,如果数据量比较小就用这个就好了。

2.2 SM3

主要是这么几个:

cpp 复制代码
#define SM3_DIGEST_SIZE		32
#define SM3_BLOCK_SIZE		64
#define SM3_STATE_WORDS		8

void 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]);

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

三、测试代码

代码如下:

cpp 复制代码
//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:

cpp 复制代码
命令表
命令 组           名称          命令 说明
---- ------------ ------------- ---- --------
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,所以输出结果相同。


(这里是文档结束)

相关推荐
@小码农32 分钟前
2025年北京海淀区中小学生信息学竞赛第一赛段试题(附答案)
人工智能·python·算法·蓝桥杯
2301_7951672032 分钟前
玩转Rust高级应用 如何让让运算符支持自定义类型,通过运算符重载的方式是针对自定义类型吗?
开发语言·后端·算法·安全·rust
laocooon52385788636 分钟前
C语言 有关指针,都要学哪些内容
c语言·数据结构·算法
多多*1 小时前
牛客周赛 Round 114 Java题解
算法
他们叫我一代大侠1 小时前
Leetcode :模拟足球赛小组各种比分的出线状况
算法·leetcode·职场和发展
Nebula_g1 小时前
C语言应用实例:硕鼠游戏,田忌赛马,搬桌子,活动选择(贪心算法)
c语言·开发语言·学习·算法·游戏·贪心算法·初学者
AI科技星2 小时前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
海琴烟Sunshine2 小时前
leetcode 345. 反转字符串中的元音字母 python
python·算法·leetcode
geobuilding2 小时前
将大规模shp白模贴图转3dtiles倾斜摄影,并可单体化拾取建筑
算法·3d·智慧城市·数据可视化·贴图
jghhh013 小时前
基于高斯伪谱法的弹道优化方法及轨迹仿真计算
算法