基于 SM3 算法的 HMAC 快速实现
Presented by R.G.
如不想阅读详细实现原理,请直接阅 读SM3hmac快速上手(使用手册) 部分,本文所有的代码文件见我的github仓库RG_SM3hmac,欢迎关注~
注:
-
本README有少量数学公式需要LaTeX支持,github貌似没有原生支持LaTeX,若您在阅读本README时无法正确显示数学公式,请安装支持LaTeX显示的浏览器插件,我推荐 MathJax Plugin for Github 插件
-
注:如果你的github无法看到图片的话,请参考我的这篇文章
目录大纲
文章目录
作品内容摘要
本作品致力于快速实现基于我国政府采用的由国家密码管理局发布的 SM3 密码 散列函数标准的 HMAC 哈希运算消息认证码。
作品主要包含一个欢迎界面和以下三个功能模块:SM3 文档示例、样例测试、 自定义。
-
欢迎界面:欢迎用户,引导用户进行功能选择,以及一些使用提示。
-
SM3 文档示例:校验本程序生成的《SM3 密码杂凑算法》标准文档所提供的2 个样例的杂凑值,同时给出样例的 HMAC 值。
-
样例测试:选取1K-100MB八个不同量级的消息文件,计算对应HMAC以及其生成时间和速率。
-
自定义:用户自定义消息输入,对用户输入的消息计算HMAC值。
为了提高程序计算 HMAC 的性能,减少程序计算用时、提升计算速率,本作品 由纯 C 语言编写完成,并在 Linux 环境下运行测试。
同时,为了进一步提升程序执行速度,在用 C 编写相应功能模块时,将 SM3 的 主要几个运算函数均写成宏函数。此外,采取了使用 register 关键字定义部分变量、 拆解小循环 for、移位代替乘除法运算、使用复合赋值表达式、把频繁使用的指针 型参数拷贝到本地变量、使用并行代码等一系列编写优化方式,以此提升程序运行 性能。
测试显示: 本程序对消息的HMAC计算基本维持在毫秒级别,计算速率维持在 72MBps左右。对10MB以下消息进行HMAC运算基本可以忽略计算延时,对于百KB量级 的消息计算速率最佳。
关键词: HMAC、SM3、哈希摘要、消息验证码、快速实现
作品功能与性能说明
作品设计目标: 快速实现基于 SM3 哈希函数的 HMAC 哈希运算消息认证码
作品内容及其作用:
文件/文件夹名 | 作用 |
---|---|
SampleTest | 存储 1K-100MB 样例消息文件以及测试结果截图的文件夹 |
RandMsgGen.py | 生成足够随机的样例消息文件 |
SM3hmac.c | 作品主程序 |
sm3hmac.out | Linux 下 gcc 编译 SM3hmac.c 生成的可执行文件 |
README.md | README 文件,作品说明以及使用说明 |
作品功能: 作品程序 SM3hmac 主要包含一个欢迎界面和以下三个功能模块: SM3 文档示例、样例测试、自定义。
- 欢迎界面:欢迎用户,引导用户进行功能选择,以及一些使用提示。
- SM3 文档示例:校验本程序生成的《SM3 密码杂凑算法》标准文档所提供的 2 个样例的杂凑值,同时给出样例的 HMAC 值。
- 样例测试:选取 1K-100MB 八个不同量级的消息文件,计算对应 HMAC 以及其生成时间和速率。
- 自定义:用户自定义消息输入,对用户输入的消息计算 HMAC 值。
下面是作品主要功能模块的框架图:
作品性能: 通过对 1KB-100MB 共计 8 个样例消息文件的测试,得出测试数据与相应分析图。由测试结果可知,本程序对消息的 HMAC 计算基本维持在毫秒级 别,计算速率维持在 72MBps 左右。对 10MB 以下消息进行 HMAC 运算基本可以忽 略计算延时,对于百 KB 量级的消息计算速率最佳。
设计原理与实现方案
SM3 算法流程图
SM3 算法描述
-
初始值
IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
-
常量
T j = { 79 c c 4519 0 ≤ j ≤ 15 7 a 879 d 8 a 16 ≤ j ≤ 63 T_{j}=\left\{\begin{array}{ll}79 c c 4519 & 0 \leq j \leq 15 \\ 7 a 879 d 8 a & 16 \leq j \leq 63\end{array}\right. Tj={ 79cc45197a879d8a0≤j≤1516≤j≤63 -
布尔函数
F F j ( X , Y , Z ) = { X ⊕ Y ⊕ Z 0 ≤ j ≤ 15