20231414_王仕琪_密码技术密码杂凑算法学习笔记
20231414_王仕琪_密码技术密码杂凑算法学习笔记
一、密码杂凑算法基础概念
1.1 单向函数(One-way Function)
定义:正向计算容易,逆向运算困难的函数
特性:
给定输入,容易计算输出
给定输出,难以计算输入
类比:《应用密码学》中的"把盘子打碎和恢复"
平衡考量:计算性能与破解强度需要均衡
1.2 杂凑函数(Hash Function)
功能:将任意大小数据转换为固定长度数据
术语:
杂凑值/哈希值:转换后的数据
确定性:相同输入必然产生相同输出
碰撞问题:不同输入映射到相同输出
解决方法:
增加杂凑值长度
权衡性能与长度
提高杂凑函数质量
二、密码杂凑算法的应用
2.1 数据完整性验证
完整性核心:数据未经授权不得更改
验证原理:通过检查杂凑值变化检测数据篡改
验证流程:
- 输入:数据D、原始杂凑值H、杂凑函数
- 运算:
计算数据D的杂凑值H'
对比H和H' - 输出:判断数据是否完整
三、SM3密码杂凑算法详解
3.1 SM3算法概述
SM3是国家密码管理局发布的密码杂凑算法标准,输出长度为256比特(32字节)。
3.2 数据填充过程(重点)
填充目的:使数据块大小符合算法要求(512比特的倍数)
填充步骤:
- 添加比特"1":在消息末尾添加一个"1"比特
- 添加k个"0":k是满足以下等式的最小非负整数:
其中l是原始消息的比特长度l + 1 + k ≡ 448 (mod 512) - 添加长度表示:添加64位比特串,表示原始消息长度l的二进制表示
数学公式:
l + 1 + k ≡ 448 (mod 512)
示例分析(消息"abc"):
原始消息:01100001 01100010 01100011
长度l = 24比特
计算k:24 + 1 + k ≡ 448 (mod 512)
解得:k = 423
填充结果:01100001 01100010 01100011 1 [423个0] [64位的长度表示000...011000]
3.3 填充标准对比
PKCS #7
ISO/IEC 9797-1 Padding Method 2
ANSI X.923
Zero Padding
SM3采用自定义填充方案
四、HMAC-SM3实现
4.1 HMAC结构
HMAC(Hash-based Message Authentication Code)是基于杂凑函数的消息认证码
4.2 实现函数
-
sm3_hmac_starts:
初始化SM3 HMAC上下文
处理密钥并填充内部缓冲区ipad和opad
启动SM3计算 -
hmac_update:
更新SM3 HMAC上下文
将输入数据传递给底层SM3更新函数 -
sm3_hmac_finish:
完成HMAC计算
生成最终结果存储在输出缓冲区 -
sm3_hmac:
完整HMAC-SM3计算函数
调用上述三个函数完成整个过程
五、实践操作
5.1 编译运行步骤
1. 下载SM3实现代码
git clone https://gitee.com/rocedu/bestidiocs4stu.git

2. 编译代码

3. 使用gdb调试


5.2 与标准对照要点
根据GB/T 32905-2016标准,需要验证:
填充过程是否符合规范
杂凑值计算是否正确
边界条件处理是否恰当
5.3 测试雪崩效应:

六、个人理解与贡献
6.1 对SM3填充过程的深入理解
通过分析标准文档,我认识到SM3的填充方案设计巧妙:
比特"1"的添加:明确标识填充开始位置
模512运算:确保最终分组满足算法要求
长度编码:64位长度表示支持极大文件处理
6.2 实践中的发现
在代码实践中,需要注意:
字节序问题(大端序/小端序)
边界条件处理(空消息、恰好512比特倍数等情况)
内存管理(避免缓冲区溢出)
七、学习总结
密码杂凑算法是现代密码学的基础组件,SM3作为国密标准,在安全性、性能和标准化方面都有良好表现。通过本次学习,我深入理解了:
- 单向函数的数学基础和实际应用
- SM3算法的完整流程,特别是填充机制
- HMAC-SM3的实现原理和实际应用场景
- 密码学标准的严谨性和实现细节的重要性
浙公网安备 33010602011771号