SM 3 加密算法:安全、高效、广泛应用的密码学利器

简介

SM3 密码杂凑算法是一种密码学哈希函数,被广泛应用于网络安全和数据完整性验证等领域。SM 3是中国国家密码管理局 2010 年公布的中国商用密码杂凑算法标准。适用于商用密码应用中的数字签名和验证。

SM3 是在 SHA-256 基础上改进实现的一种算法,其安全性和 SHA-256 相当。SM3 和 MD5 的迭代过程类似,也采用 MD(Merkle-Damgard)结构。消息分组长度为 512 位,摘要值长度为 256 位。

SM 3 算法的原理

哈希函数的基本原理:哈希函数是将输入的任意长度的消息转换为固定长度的输出,且输出值的变化应该因输入值的微小变化而发生剧烈变化。

SM 3 算法的设计思想:SM 3 算法采用分组密码结构设计,采用置换、非线性函数和模运算来实现数据的混淆和扩散,以确保数据的安全性。

SM 3 算法的加密流程:包括消息填充、初始向量设定、消息分组、迭代加密等步骤,最终生成哈希值作为数据的加密结果。SM 3 计算流程如下图所示:

消息填充

SM3 的消息扩展步骤是以512 位的数据分组作为输入的。因此,我们需要在一开始就把数据长度填充至 512 位的倍数。数据填充规则和 MD5 一样,具体步骤如下:

  1. 假设消息 <math xmlns="http://www.w3.org/1998/Math/MathML"> m m </math>m 的长度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> l l </math>l 比特,先填充一个"1",后面加上 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 个"0"。其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 满足 <math xmlns="http://www.w3.org/1998/Math/MathML"> ( l + 1 + k ) ≡ 448 m o d     512 (l+1+k)\equiv 448\mod512 </math>(l+1+k)≡448mod512 的最小的非负数整数。
  2. 追加表示数据长度的 64 位比特串,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> l l </math>l 的二进制表示。(bit 为单位,大端序列存放 1)
  3. 填充后的消息 <math xmlns="http://www.w3.org/1998/Math/MathML"> m ′ m' </math>m′ 的二进制长度为 512 的整数倍。

消息填充后的数据表示如下图所示:

消息分组

消息填充后需要按 512 bit 进行分组,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> m ′ = B 0 B 1 ⋅ ⋅ ⋅ B n − 1 m'=B^{0}B^1···B^{n-1} </math>m′=B0B1⋅⋅⋅Bn−1 ,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> n = l + k + 65 512 n=\frac{l+k+65}{512} </math>n=512l+k+65。

之后会迭代计算,迭代方式如下:

css 复制代码
// CF()为压缩函数,V(0)为256bit初始值IV,B(i)为填充后的消息分组
for i=0 to n-1
	V(i+1)=CF(V(i), B(i)))

若分组后只有一组,长度为512bit,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> n = 1 n=1 </math>n=1, <math xmlns="http://www.w3.org/1998/Math/MathML"> m ´ = B 0 m´=B_0 </math>m´=B0, <math xmlns="http://www.w3.org/1998/Math/MathML"> V 1 = C F ( V 0 , B 0 ) V_1=CF(V_0,B_0) </math>V1=CF(V0,B0),得到的 <math xmlns="http://www.w3.org/1998/Math/MathML"> V 0 V_0 </math>V0 即为最终的杂凑值。

若存在 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 个分组,则进行 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 次迭代,最终结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> V n V_n </math>Vn 为最终的杂凑值。

消息扩展

SM 3 的迭代压缩步骤没有直接使用数据分组进行运算,而是由消息分组 <math xmlns="http://www.w3.org/1998/Math/MathML"> B i B^i </math>Bi 产生的 132 个消息字。

消息扩展需要将一个消息分组扩展成 132 个字 <math xmlns="http://www.w3.org/1998/Math/MathML"> W 0 , W 1 , , , W 67 , W 0 ′ , W 1 ′ , , , W 63 ′ W_0,W_1,,,W_{67},W'_0,W'1,,,W'{63} </math>W0,W1,,,W67,W0′,W1′,,,W63′,那么如何处理一个消息分组呢?

  1. 先将一个 512 位数据分组划分为 16 个消息字 <math xmlns="http://www.w3.org/1998/Math/MathML"> W 0 , W 1 , , , W 15 W_0, W_1,,, W_{15} </math>W0,W1,,,W15,并且作为生成的 132 个消息字的前 16 个。
  2. 用这 16 个消息字迭代生成后续 52 个消息字。 for j=16 to 67 W(j) = P(W(j-16) ^ W(j-9) ^ (W(j-3) <<< 15) ^ (W(j-13)<<<7) ^ W(j-6))
  3. 通过异或得到后续的 64 个字。 for j=0 to 63 W'(j)=W(j)^W(j+4)

在最终得到的 132 个消息字中,前 68 个消息字构成数列 <math xmlns="http://www.w3.org/1998/Math/MathML"> W j W_j </math>Wj,后 64 个消息字构成数列 <math xmlns="http://www.w3.org/1998/Math/MathML"> W j ′ W'_j </math>Wj′ ,其中下标 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j 从0开始计数。

迭代压缩

SM3 的迭代过程和 MD5 类似,也是 MD(Merkle-Damgard)结构。但 SM3与 MD5 不同的是,SM3 使用消息扩展得到的消息字进行运算。

迭代压缩是如何计算的呢?

  1. 初始值 <math xmlns="http://www.w3.org/1998/Math/MathML"> I V IV </math>IV 被分配到字寄存器 <math xmlns="http://www.w3.org/1998/Math/MathML"> A , B , C , D , E , F , G , H {A,B,C,D,E,F,G,H} </math>A,B,C,D,E,F,G,H 中。字的存储采用的大端模式
  2. 之后就是通过迭代去计算最终值,并寄存在 <math xmlns="http://www.w3.org/1998/Math/MathML"> A , B , C , D , E , F , G , H {A,B,C,D,E,F,G,H} </math>A,B,C,D,E,F,G,H 中。 for j=0 to 63 SS1 = ((A <<< 12) + E + (Ti <<< (j % 32))) <<< 7 SS2 = SS1 ^ (A <<< 12) TT1 = FFi(A,B,C) + D + SS2 + W' TT2 = GGi(E,F,G) + H + SS1 + W(i) D = C B = A A = TT1 H = G G = F <<< 19 F = E E = P0(TT2) V(i+1) = ABCDEFG ^ V(i)

整个算法中最核心、也最复杂的地方就在于压缩函数,压缩函数将这八个变量进行 64 轮相同的计算,其中一轮的计算过程如下图所示:

将最后迭代的 <math xmlns="http://www.w3.org/1998/Math/MathML"> A 、 B 、 C 、 D 、 E 、 F 、 G 、 H A、B、C、D、E、F、G、H </math>A、B、C、D、E、F、G、H 拼接起来,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> A B C D E F G H = V n ABCDEFGH=V_n </math>ABCDEFGH=Vn 为最后的杂凑值。

SM 3 算法的特点

  • 安全性:SM 3 算法具有很高的抗碰撞能力和抗第二原像攻击能力,能够保障数据的完整性和安全性。
  • 高效性:SM 3 算法具有较高的计算效率,适用于大规模数据加密和验证场景。
  • 适用性:SM 3 算法适用于数字签名、消息认证码、随机数生成等多种密码学应用场景。

SM 3 算法的应用

在网络安全中的应用:SM 3 算法被广泛应用于网络数据传输的完整性验证和身份认证,保障了网络通信的安全性。

在密码学中的应用:SM 3 算法可用于密码学协议、数字证书、密钥交换等场景,提供了可靠的数据安全保障。

在数字签名中的应用:SM 3 算法能够生成数字签名的哈希值,用于验证文档的完整性和真实性,为电子商务和电子合同提供了安全的基础支持。

结论

SM 3 算法作为一种安全、高效的哈希函数,在密码学和网络安全领域具有重要的地位和应用前景。 随着技术的不断发展,SM 3 算法将不断完善,为数据安全和隐私保护做出更大的贡献。

参考文献

国家密码管理局关于发布《SM3密码杂凑算法》公告(国密局公告第22号)_国家密码管理局

相关推荐
2401_857622666 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589366 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没8 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch8 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
杨哥带你写代码9 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries10 小时前
读《show your work》的一点感悟
后端
A尘埃10 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-230710 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code10 小时前
(Django)初步使用
后端·python·django
代码之光_198010 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端