0%

crypto系列6-国产哈希算法SM3

SM3算法:中国国家密码局哈希标准详解

SM3算法是由国家密码管理局制定并发布的密码哈希函数标准,属于中国自主设计的商用密码算法体系(SM系列算法),主要用于数据完整性校验、数字签名、身份认证等场景,其安全性和性能经过严格评估,已广泛应用于金融、政务、通信等关键领域。

一、SM3的基本定位与核心作用

哈希函数(Hash Function)的核心是将任意长度的输入数据(称为“消息”)映射为固定长度的输出值(称为“哈希值”或“摘要”),且满足三大核心特性:

  1. 单向性:从哈希值无法反推原始消息;
  2. 抗碰撞性:不存在两条不同消息生成相同哈希值(强抗碰撞),也无法主动构造两条消息生成相同哈希值(弱抗碰撞);
  3. 雪崩效应:原始消息的微小变化(如1个比特的修改)会导致哈希值发生剧烈改变,确保篡改可被检测。

SM3作为国家推荐标准(GB/T 32905-2016《信息安全技术 SM3密码杂凑算法》),正是为满足上述特性设计,其输出哈希值固定为256比特(32字节),可有效抵御当前已知的密码分析攻击(如生日攻击、差分攻击等)。

二、SM3的算法流程

SM3的处理过程分为4个核心步骤,整体逻辑与国际主流哈希算法(如SHA-256)有相似之处,但在压缩函数、常量设计等细节上体现自主创新:

SM3_summary

1. 消息预处理

对输入消息进行“补位”和“分块”,确保消息长度满足后续压缩要求:

  • 步骤1:补位
    若消息长度为L比特,先在消息末尾添加1个“1”比特,再添加k个“0”比特,使得补位后的总长度满足 L + 1 + k ≡ 448 mod 512(即模512后余448)。
    例:若消息长度为448比特,补1个“1”后长度为449,需补511个“0”,使总长度为449+511=960 ≡ 448 mod 512

  • 步骤2:附加长度
    将原始消息的长度L(以64比特二进制数表示,不足64比特则高位补0)附加到补位后的消息末尾,最终消息总长度为512的整数倍,即被划分为N个512比特的消息块(记为M₀, M₁, …, Mₙ₋₁)。

2. 消息扩展:生成68个消息字与64个扩展字

对每个512比特的消息块Mᵢ,将其拆分为16个32比特的“基本消息字”(W₀~W₁₅),再通过特定变换生成后续的“扩展消息字”,最终得到132个32比特字(68个W字 + 64个W’字),为压缩函数提供输入:

  • W字生成(W₀~W₆₇)
    当0 ≤ j ≤ 15时,Wⱼ直接等于Mᵢ拆分后的第j个32比特字;
    当16 ≤ j ≤ 67时,Wⱼ = P₁(Wⱼ₋₄ ⊕ Wⱼ₋₅ ⊕ Wⱼ₋₆ ⊕ Wⱼ₋₁₄ ⊕ Wⱼ₋₁₅ ⊕ Wⱼ₋₁₆) ⊕ (Wⱼ₋₈ ≪ 15) ⊕ Wⱼ₁₆;
    其中P₁(X)是SM3定义的置换函数(P₁(X) = X ⊕ (X ≪ 15) ⊕ (X ≪ 23)),≪ s表示左移s比特。

  • W’字生成(W’₀~W’₆₃)
    W’ⱼ = Wⱼ ⊕ Wⱼ₄(0 ≤ j ≤ 63),用于压缩函数的轮运算。

3. 压缩函数:迭代更新哈希值

压缩函数是SM3的核心,其作用是将当前消息块的扩展字与“中间哈希值”(初始为固定初始值)进行64轮迭代运算,生成新的中间哈希值,直至所有消息块处理完成:

  • 初始哈希值(IV)
    SM3规定了固定的初始256比特哈希值,分为8个32比特寄存器(A~H),初始值为:
    A=7380166F, B=4914B2B9, C=172442D7, D=DA8A0600,
    E=A96F30BC, F=163138AA, G=E38DEE4D, H=B0FB0E4E(均为十六进制)。

  • 64轮迭代运算
    每轮迭代使用对应的Wⱼ和W’ⱼ,通过以下步骤更新A~H:

    1. 计算轮常量Tⱼ:当0 ≤ j ≤ 15时,Tⱼ=79CC4519;当16 ≤ j ≤ 63时,Tⱼ=7A879D8A(十六进制,用于增强抗攻击能力);
    2. 计算中间变量SS1 = ((A ≪ 12) + E + (Tⱼ ≪ j)) ≪ 7;
    3. 计算中间变量SS2 = SS1 ⊕ (A ≪ 12);
    4. 计算中间变量TT1 = FFⱼ(A,B,C) + D + SS2 + W’ⱼ;
    5. 计算中间变量TT2 = GGⱼ(E,F,G) + H + SS1 + Wⱼ;
    6. 更新寄存器:D=C, C=B≪9, B=A, A=TT1, H=G, G=F≪19, F=E, E=P₀(TT2);
      其中FFⱼGGⱼ是轮函数(j≤15时为简单异或,j>15时为复杂布尔运算),P₀(X)是置换函数(P₀(X)=X⊕(X≪9)⊕(X≪17))。
  • 迭代更新:每个消息块处理完成后,将新生成的A~H与处理前的中间哈希值进行异或,得到新的中间哈希值,作为下一个消息块的输入。

4. 输出最终哈希值

当所有N个消息块均处理完成后,最终的中间哈希值(A~H拼接)即为SM3的输出结果——256比特(32字节)的哈希值,通常以64位十六进制字符串形式展示(1字节=2位十六进制)。

三、SM3的安全性与优势

1. 安全性评估

SM3的设计充分考虑了当前密码分析技术,经过国内外密码学界多年验证,具备以下安全特性:

  • 抗碰撞性:目前尚无公开方法能在多项式时间内构造碰撞(即找到两条不同消息生成相同哈希值),其抗碰撞强度与SHA-256相当(理论生日攻击复杂度为2¹²⁸);
  • 抗差分攻击:压缩函数的轮函数和置换函数设计能有效抵御差分攻击,降低算法被破解的风险;
  • 合规性:作为国家密码标准,SM3已通过国家密码管理局的安全性审查,满足关键信息基础设施的密码应用要求(符合《密码法》和《信息安全技术 密码应用基本要求》)。

2. 核心优势

  • 自主可控:完全由中国自主设计,避免依赖国外算法可能存在的“后门”或技术卡脖子风险;
  • 性能均衡:算法流程简洁,硬件实现(如芯片、FPGA)和软件实现(如编程语言库)均具备较高效率,适合高并发场景(如区块链交易验证、大规模数据校验);
  • 场景适配:输出256比特哈希值,既能满足安全性需求,又不会因长度过长导致存储和传输成本过高,适配金融、政务、物联网等多领域。

四、SM3的典型应用场景

SM3的特性使其在需要“数据完整性校验”和“身份认证”的场景中广泛应用:

  1. 数字签名:与SM2椭圆曲线公钥算法配合,构成“SM2+SM3”签名方案——将消息用SM3生成摘要后,再用私钥对摘要签名,接收方用公钥验签,确保消息未被篡改且来源可信(如电子合同、公文签署);
  2. 区块链:作为区块链的“哈希算法”,用于生成区块哈希(如中国自主区块链平台“长安链”采用SM3),确保区块数据不可篡改;
  3. 数据校验:对文件、传输数据生成SM3哈希值,接收方重新计算哈希值并比对,验证数据是否在传输或存储过程中被篡改(如软件安装包校验、云存储数据完整性检查);
  4. 身份认证:将用户密码通过SM3哈希后存储(而非明文存储),登录时比对哈希值,保障用户密码安全(避免密码泄露风险)。

五、SM3与国际主流哈希算法(SHA-256)对比

SM3常与国际标准SHA-256(SHA-2系列算法)比较,二者在安全性和应用场景上有相似之处,但存在关键差异:

对比维度 SM3 SHA-256
制定机构 中国国家密码管理局 美国国家标准与技术研究院(NIST)
输出长度 256比特(32字节) 256比特(32字节)
消息块大小 512比特 512比特
迭代轮数 64轮 64轮
核心函数 自定义P₀、P₁置换函数,FFⱼ、GGⱼ轮函数 自定义Ch、Maj函数,Σ₀、Σ₁轮函数
主要应用场景 中国政务、金融、国企等合规场景 国际通用场景(如互联网、跨境业务)
合规性要求 符合中国《密码法》强制要求 符合国际NIST标准

六、SM3的实现与工具

1. 编程语言支持

主流编程语言均已通过官方或第三方库支持SM3算法:

  • Python:可通过pycryptodome库(Crypto.Hash.SM3)或gmssl库(国密专用库)实现;
  • Java:通过BouncyCastle加密库(需添加国密算法支持)或gmssl-jdk库;
  • **C/C++**:可使用国家密码管理局发布的“SM3算法参考实现代码”,或开源库OpenSSL(1.1.1及以上版本支持SM3);
  • Go:标准库crypto无直接支持,需通过第三方库如github.com/tjfoc/gmsm

2. 常用工具

  • 命令行工具OpenSSL(命令:openssl dgst -sm3 文件名)、gmssl(国密专用工具,命令:gmssl sm3 文件名);
  • 在线工具:多个国密合规平台提供在线SM3哈希计算(如“国密算法在线测试平台”),适合快速验证小规模数据。

总结

SM3作为中国自主可控的密码哈希标准,不仅在安全性上达到国际先进水平,更在合规性上满足国内关键领域的密码应用要求。随着《密码法》的实施和“自主可控”战略的推进,SM3已成为金融、政务、区块链等领域的核心密码算法之一,是保障数据安全和信息主权的重要技术支撑。


行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。

欢迎关注

博客地址: https://fishmwei.github.io

掘金主页: https://juejin.cn/user/2084329776486919