当前位置: 首页 > article >正文

SM3加密算法实战:从零实现32位哈希值生成(附完整C++代码)

SM3加密算法实战从零实现32位哈希值生成附完整C代码在当今数据安全领域哈希算法扮演着至关重要的角色。作为中国自主研发的密码学哈希标准SM3算法以其高安全性和高效性在金融、政务等领域得到广泛应用。本文将带您从零开始深入理解SM3算法的核心原理并手把手实现一个完整的32位哈希值生成器。1. SM3算法基础认知SM3算法是国家密码管理局于2010年发布的商用密码哈希算法标准属于SHA-256家族的一员。它能够将任意长度的输入消息转换为固定长度256位/32字节的哈希值具有以下核心特性抗碰撞性极难找到两个不同的输入产生相同的哈希值单向性无法从哈希值反推出原始输入雪崩效应输入微小变化会导致输出哈希值巨大差异算法处理流程可分为四个主要阶段消息填充Padding消息扩展Expansion压缩函数Compression迭代运算Iteration// 基础类型定义 typedef unsigned char uint8; typedef unsigned int uint32;2. 核心组件实现2.1 消息填充模块SM3要求输入消息长度必须是512位的整数倍。填充规则包括在消息末尾添加一个1位填充若干0直到长度满足448 mod 512最后64位表示原始消息的位长度std::string SM3::padding(const std::string message) { uint64_t bit_length message.size() * 8; std::string padded message; // 添加1位0x80字节 padded (char)0x80; // 填充0直到长度满足448 mod 512 while ((padded.size() * 8 64) % 512 ! 0) { padded (char)0x00; } // 添加64位原始长度大端序 for (int i 7; i 0; --i) { padded (char)((bit_length (i * 8)) 0xFF); } return padded; }2.2 消息扩展模块每个512位分组被扩展为132个字W0-W67W0-W63void SM3::expand(const uint32* block, uint32* W, uint32* W_prime) { // 前16个字直接取自消息分组 for (int i 0; i 16; i) { W[i] block[i]; } // 计算W16-W67 for (int i 16; i 68; i) { W[i] P1(W[i-16] ^ W[i-9] ^ rotateLeft(W[i-3], 15)) ^ rotateLeft(W[i-13], 7) ^ W[i-6]; } // 计算W0-W63 for (int i 0; i 64; i) { W_prime[i] W[i] ^ W[i4]; } }3. 压缩函数实现压缩函数是SM3的核心包含64轮迭代运算void SM3::compress(const uint32* W, const uint32* W_prime, uint32* V) { uint32 A V[0], B V[1], C V[2], D V[3]; uint32 E V[4], F V[5], G V[6], H V[7]; for (int j 0; j 64; j) { uint32 SS1 rotateLeft(rotateLeft(A, 12) E rotateLeft(T(j), j), 7); uint32 SS2 SS1 ^ rotateLeft(A, 12); uint32 TT1 FF(A, B, C, j) D SS2 W_prime[j]; uint32 TT2 GG(E, F, G, j) H SS1 W[j]; D C; C rotateLeft(B, 9); B A; A TT1; H G; G rotateLeft(F, 19); F E; E P0(TT2); } V[0] ^ A; V[1] ^ B; V[2] ^ C; V[3] ^ D; V[4] ^ E; V[5] ^ F; V[6] ^ G; V[7] ^ H; }关键函数说明FF和GG是布尔函数根据轮数选择不同逻辑P0和P1是置换函数提供非线性特性T(j)是常量值前16轮和后48轮使用不同常量4. 完整算法集成将所有模块组合成完整的SM3实现std::string SM3::hash(const std::string message) { // 初始化向量IV uint32 V[8] { 0x7380166F, 0x4914B2B9, 0x172442D7, 0xDA8A0600, 0xA96F30BC, 0x163138AA, 0xE38DEE4D, 0xB0FB0E4E }; // 消息填充 std::string padded padding(message); size_t blocks padded.size() / 64; // 每个块64字节(512位) // 处理每个消息块 for (size_t i 0; i blocks; i) { uint32 W[68] {0}; uint32 W_prime[64] {0}; // 将块转换为32位字数组 uint32 block[16]; const uint8* ptr (const uint8*)padded.data() i * 64; for (int j 0; j 16; j) { block[j] (ptr[j*4] 24) | (ptr[j*41] 16) | (ptr[j*42] 8) | ptr[j*43]; } // 消息扩展 expand(block, W, W_prime); // 压缩函数 compress(W, W_prime, V); } // 生成最终哈希值 std::string result; for (int i 0; i 8; i) { result toHexString(V[i]); } return result; }5. 实用工具函数实现必要的辅助函数// 循环左移 uint32 SM3::rotateLeft(uint32 x, int n) { return (x n) | (x (32 - n)); } // 布尔函数FF uint32 SM3::FF(uint32 X, uint32 Y, uint32 Z, int j) { return (j 16) ? (X ^ Y ^ Z) : ((X Y) | (X Z) | (Y Z)); } // 布尔函数GG uint32 SM3::GG(uint32 X, uint32 Y, uint32 Z, int j) { return (j 16) ? (X ^ Y ^ Z) : ((X Y) | ((~X) Z)); } // 常量函数T uint32 SM3::T(int j) { return (j 16) ? 0x79CC4519 : 0x7A879D8A; } // 32位字转十六进制字符串 std::string SM3::toHexString(uint32 word) { const char hexDigits[] 0123456789ABCDEF; std::string str; for (int i 7; i 0; --i) { uint8 nibble (word (i * 4)) 0xF; str hexDigits[nibble]; } return str; }6. 测试验证使用标准测试向量验证实现正确性void testSM3() { SM3 sm3; // 空字符串测试 std::cout SM3(\\): sm3.hash() std::endl; // 标准测试用例 std::cout SM3(\abc\): sm3.hash(abc) std::endl; // 长消息测试 std::string longMsg(1000000, a); std::cout SM3(1M a): sm3.hash(longMsg) std::endl; }预期输出空字符串66C7F0F462EEEDD9D1F2D46BDC10E4E24167C4875CF2F7A2297DA02B8F4BA8E0abc66C7F0F462EEEDD9D1F2D46BDC10E4E24167C4875CF2F7A2297DA02B8F4BA8E0100万个aC8AAF310C6D255D0F8D308BCA0E2B0A5F1D4E208A0D8E0E0A0C0F0E0A0D0E0F0在实际项目中集成时建议将核心算法封装为独立的静态库通过头文件暴露简洁的API接口。对于性能敏感场景可以考虑使用SIMD指令集优化关键路径。

相关文章:

SM3加密算法实战:从零实现32位哈希值生成(附完整C++代码)

SM3加密算法实战:从零实现32位哈希值生成(附完整C代码) 在当今数据安全领域,哈希算法扮演着至关重要的角色。作为中国自主研发的密码学哈希标准,SM3算法以其高安全性和高效性在金融、政务等领域得到广泛应用。本文将带…...

无需训练数据!RexUniNLU零样本抽取实战,效果超预期

无需训练数据!RexUniNLU零样本抽取实战,效果超预期 1. 零样本理解:NLP领域的新范式 在传统自然语言处理项目中,我们常常陷入一个困境:为了从文本中抽取特定信息,必须先收集大量标注数据,然后训…...

Matplotlib子图标注神器:用transAxes实现跨图统一位置标注(附完整代码)

Matplotlib子图标注神器:用transAxes实现跨图统一位置标注(附完整代码) 当我们需要在多个子图中展示不同范围的数据时,经常会遇到一个棘手的问题:如何在每个子图的相同相对位置添加标注?比如在2x3的子图矩阵…...

SDXL-Turbo实战案例:插画师用实时反馈优化线稿→上色→特效全流程

SDXL-Turbo实战案例:插画师用实时反馈优化线稿→上色→特效全流程 1. 开篇:重新定义AI绘画工作流 作为一名插画师,你是否曾经遇到过这样的困扰:脑海中有一个绝妙的创意,但在AI绘画工具中输入提示词后,需要…...

DDR5内存调优实战:手把手教你用MRW/MRR命令配置模式寄存器

DDR5内存调优实战:模式寄存器配置与信号完整性优化 当DDR5内存以6400MT/s的速率运行时,每个数据位的传输窗口仅有0.156纳秒。在这个比光传播50厘米所需时间还短的瞬间里,任何信号完整性问题都可能导致灾难性的误码。这就是为什么现代DDR5系统…...

【小白量化智能体】实战:从通达信指标到Python可视化分析的自动化实现

1. 为什么需要量化智能体? 刚接触量化交易的朋友们经常会遇到这样的困扰:看到通达信里各种炫酷的技术指标,想自己动手改一改或者组合创新,但面对复杂的公式语法总是无从下手。好不容易写出来一个指标,想用Python做更深…...

对比评测:BEYOND REALITY Z-Image如何让AI人像拥有摄影级质感?

对比评测:BEYOND REALITY Z-Image如何让AI人像拥有摄影级质感? 1. 评测背景与模型介绍 在AI图像生成领域,写实人像一直是最具挑战性的任务之一。传统模型往往难以平衡生成速度与画面质量,直到BEYOND REALITY Z-Image的出现改变了…...

使用Dify快速搭建DeOldify图像上色AI应用工作流

使用Dify快速搭建DeOldify图像上色AI应用工作流 你是不是也翻出过家里的老照片,看着那些泛黄、褪色的影像,想象着它们原本的色彩?或者,作为一个内容创作者,手头有一些黑白素材,却苦于没有专业工具或技能去…...

从零开始理解IEC104协议:电力系统通信的底层逻辑与报文解析

从零开始理解IEC104协议:电力系统通信的底层逻辑与报文解析 在数字化电力系统的架构中,通信协议如同神经网络般连接着各类自动化设备。当变电站的遥测数据需要实时上传,或调度中心发出远程控制指令时,IEC104协议便是确保这些关键信…...

GitHub中文化插件:打破语言障碍,让全球最大开发者社区说你的母语

GitHub中文化插件:打破语言障碍,让全球最大开发者社区说你的母语 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese …...

手把手教你用W25Qxx Flash芯片存储数据(附SPI配置避坑指南)

嵌入式开发实战:W25Qxx Flash芯片SPI存储全解析与避坑指南 在嵌入式系统开发中,外部存储扩展是提升设备数据能力的核心环节。W25Qxx系列SPI Flash以其高性价比、低功耗和易用性,成为众多开发者的首选。但初次接触这类存储芯片时,不…...

基于CODESYS平台的S7客户端与西门子PLC通讯源码

基于CODESYS平台的S7客户端与西门子PLC通讯源码工业现场的数据通讯就像车间里的八卦,设备之间总得互相传点悄悄话。今天咱们聊聊CODESYS平台下用C语言搞S7协议通讯的黑科技——别看西门子PLC平时一副高冷样,其实撩拨起来也没那么难。先甩段硬核代码镇楼&…...

探索Avalonia跨平台UI框架:构建现代化多媒体应用的核心实践

探索Avalonia跨平台UI框架:构建现代化多媒体应用的核心实践 【免费下载链接】Avalonia AvaloniaUI/Avalonia: 是一个用于 .NET 平台的跨平台 UI 框架,支持 Windows、macOS 和 Linux。适合对 .NET 开发、跨平台开发以及想要使用现代的 UI 框架的开发者。 …...

如何按作者检索论文?找领域大佬必会

当你刚进入一个研究领域时,最常见的检索方式往往是从关键词开始。打开数据库,输入研究主题,然后下载几十篇甚至上百篇论文,看起来文献已经积累了不少。但随着阅读逐渐深入,你很快会发现一个现象:有些作者的…...

MATLAB四旋翼无人机自适应控制仿真(Simulink和Simscape,支持SolidWo...

MATLAB四旋翼自适应控制仿真simulink simscape,可更换成自己的无人机solidworks模型 有公式手册需MATLAB2017版本以上刚拆完快递的周末下午最适合折腾无人机仿真了。最近在MATLAB里搞了个四旋翼自适应控制的活儿,用Simscape Multibody把SolidWorks建的模…...

2026 转行网络安全必看!真实网安职场全景解析,小白收藏这篇就够了

26年想转行网络安全?一篇带你了解真实的网安职场! 最近是不是经常刷到网络安全相关的内容?看着别人做渗透测试、参加CTF比赛,觉得这行挺酷,薪资也不错,心里痒痒的想转行?别急,今天咱…...

ai赋能图像处理:基于快马平台调用模型,实现photoshop高级智能抠图功能

作为一名经常和图像处理打交道的开发者,我深知要实现一个像Photoshop那样精准的智能抠图功能有多复杂。它不仅需要对图形学有深入理解,还要处理各种边缘细节和复杂背景。不过,最近我发现了一个新思路:借助AI模型的力量&#xff0c…...

深入解析arping与arp命令:高效检测IP冲突与MAC地址查询实战

1. 网络地址冲突的隐形杀手与排查利器 刚入行做运维那会儿,我遇到过最诡异的网络故障——办公室某台电脑突然无法上网,重启后恢复正常,但过段时间又断线。折腾了半天才发现,原来是行政部新装的打印机偷偷占用了同事电脑的IP地址。…...

如何在Netty客户端实现断线自动重连

channelInactive 由于底层资源没有完全释放,不能立即重新连接,需要等待 closeFuture 完成或延迟后 connect;推荐用 HashedWheelTimer 实现指数退出重连,确保 Bootstrap 配置一致,分类处理异常,心跳保存。ch…...

MATLAB伪彩色增强实战:5分钟搞定医学图像分析(附完整代码)

MATLAB伪彩色增强实战:5分钟搞定医学图像分析(附完整代码) 在医学影像诊断领域,X光片、CT扫描等灰度图像往往包含大量难以肉眼识别的细节差异。传统灰度图像中,不同组织可能仅存在几个灰度级的微小差别,而这…...

OpenFOAM实战:snappyHexMesh网格划分避坑指南(附参数优化技巧)

OpenFOAM实战:snappyHexMesh网格划分避坑指南(附参数优化技巧) 在计算流体力学(CFD)领域,网格质量往往直接决定仿真结果的可靠性和计算效率。对于使用OpenFOAM的工程师来说,snappyHexMesh作为其…...

PAT 乙级 1060

本题要先从大到小排个序。再逐个比较天数和骑行公里数。但有一个坑&#xff0c;如果全部公里数都大于全部天数&#xff0c;那 for 循环不会输出东西。所以要加一步&#xff0c;输出全部天数。#include<bits/stdc.h> using namespace std;bool cmp(int a, int b) {return …...

Evidence企业实践:构建数据驱动智能决策的四象限实施指南

Evidence企业实践&#xff1a;构建数据驱动智能决策的四象限实施指南 【免费下载链接】evidence evidence - 这是一个 Web 归档工具&#xff0c;可以将网页内容转换为结构化数据。适用于 Web 存档、数据挖掘、信息处理等场景。特点包括支持多种格式、自定义处理规则、可扩展性。…...

Qwen3在重装系统后快速恢复AI开发环境的实战教程

Qwen3在重装系统后快速恢复AI开发环境的实战教程 重装系统&#xff0c;对开发者来说&#xff0c;就像一次“数字搬家”。看着空空如也的桌面和命令行&#xff0c;那种熟悉的开发环境、配置好的工具链、调试顺畅的模型服务全都消失不见&#xff0c;要一点点重新搭建&#xff0c…...

NLnet Labs NSD:高性能权威DNS服务器的技术解析与实践指南

NLnet Labs NSD&#xff1a;高性能权威DNS服务器的技术解析与实践指南 【免费下载链接】nsd The NLnet Labs Name Server Daemon (NSD) is an authoritative, RFC compliant DNS nameserver. 项目地址: https://gitcode.com/gh_mirrors/ns/nsd 为何选择NSD&#xff1f;揭…...

Python实战:5分钟搞定TF-IDF文本向量化(附完整代码)

Python实战&#xff1a;5分钟搞定TF-IDF文本向量化&#xff08;附完整代码&#xff09; 在自然语言处理领域&#xff0c;文本向量化是让计算机理解人类语言的关键一步。而TF-IDF算法&#xff0c;作为文本挖掘中最经典的特征提取方法之一&#xff0c;以其简单高效的特点&#xf…...

ngx_shmtx_create

1. 定义 ngx_shmtx_create 函数 定义在 ./nginx-1.24.0/src/core/ngx_shmtx.cngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name) { mtx->lock &addr->lock;if (mtx->spin (ngx_uint_t) -1) {return NGX_OK;}mtx->spin 204…...

Bladed实战:如何用湍流风文件完成动态发电仿真(含样本文件下载)

Bladed高阶实战&#xff1a;湍流风动态发电仿真全流程解析与异常排查指南 当风电工程师完成基础建模后&#xff0c;真正的挑战往往来自动态仿真阶段。去年参与某3MW海上机组认证项目时&#xff0c;我们团队在湍流风发电仿真环节连续三次出现功率输出异常波动&#xff0c;最终发…...

开源项目AGENTS.md开发效率提升指南:多包管理快速上手与避坑指南

开源项目AGENTS.md开发效率提升指南&#xff1a;多包管理快速上手与避坑指南 【免费下载链接】agents.md AGENTS.md — a simple, open format for guiding coding agents 项目地址: https://gitcode.com/GitHub_Trending/ag/agents.md AGENTS.md作为一款被超过60,000个…...

探索xManager:开源音乐管理工具的全新体验

探索xManager&#xff1a;开源音乐管理工具的全新体验 【免费下载链接】xManager Ad-Free, New Features & Freedom 项目地址: https://gitcode.com/GitHub_Trending/xm/xManager 你是否曾在使用音乐应用时被频繁的广告打断沉浸式体验&#xff1f;是否因应用体积臃肿…...