20231414_王仕琪_密码技术密码杂凑算法学习笔记

20231414_王仕琪_密码技术密码杂凑算法学习笔记

一、密码杂凑算法基础概念

1.1 单向函数(One-way Function)

定义:正向计算容易,逆向运算困难的函数
特性
给定输入,容易计算输出
给定输出,难以计算输入
类比:《应用密码学》中的"把盘子打碎和恢复"
平衡考量:计算性能与破解强度需要均衡

1.2 杂凑函数(Hash Function)

功能:将任意大小数据转换为固定长度数据
术语
杂凑值/哈希值:转换后的数据
确定性:相同输入必然产生相同输出
碰撞问题:不同输入映射到相同输出
解决方法
增加杂凑值长度
权衡性能与长度
提高杂凑函数质量

二、密码杂凑算法的应用

2.1 数据完整性验证

完整性核心:数据未经授权不得更改
验证原理:通过检查杂凑值变化检测数据篡改
验证流程

  1. 输入:数据D、原始杂凑值H、杂凑函数
  2. 运算:
    计算数据D的杂凑值H'
    对比H和H'
  3. 输出:判断数据是否完整

三、SM3密码杂凑算法详解

3.1 SM3算法概述

SM3是国家密码管理局发布的密码杂凑算法标准,输出长度为256比特(32字节)。

3.2 数据填充过程(重点)

填充目的:使数据块大小符合算法要求(512比特的倍数)

填充步骤

  1. 添加比特"1":在消息末尾添加一个"1"比特
  2. 添加k个"0":k是满足以下等式的最小非负整数:
    l + 1 + k ≡ 448 (mod 512)
    
    其中l是原始消息的比特长度
  3. 添加长度表示:添加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 实现函数

  1. sm3_hmac_starts
    初始化SM3 HMAC上下文
    处理密钥并填充内部缓冲区ipad和opad
    启动SM3计算

  2. hmac_update
    更新SM3 HMAC上下文
    将输入数据传递给底层SM3更新函数

  3. sm3_hmac_finish
    完成HMAC计算
    生成最终结果存储在输出缓冲区

  4. sm3_hmac
    完整HMAC-SM3计算函数
    调用上述三个函数完成整个过程

五、实践操作

5.1 编译运行步骤

1. 下载SM3实现代码

git clone https://gitee.com/rocedu/bestidiocs4stu.git
image

2. 编译代码

image

3. 使用gdb调试

image
image

5.2 与标准对照要点

根据GB/T 32905-2016标准,需要验证:
填充过程是否符合规范
杂凑值计算是否正确
边界条件处理是否恰当

5.3 测试雪崩效应:

image

六、个人理解与贡献

6.1 对SM3填充过程的深入理解

通过分析标准文档,我认识到SM3的填充方案设计巧妙:
比特"1"的添加:明确标识填充开始位置
模512运算:确保最终分组满足算法要求
长度编码:64位长度表示支持极大文件处理

6.2 实践中的发现

在代码实践中,需要注意:
字节序问题(大端序/小端序)
边界条件处理(空消息、恰好512比特倍数等情况)
内存管理(避免缓冲区溢出)

七、学习总结

密码杂凑算法是现代密码学的基础组件,SM3作为国密标准,在安全性、性能和标准化方面都有良好表现。通过本次学习,我深入理解了:

  1. 单向函数的数学基础和实际应用
  2. SM3算法的完整流程,特别是填充机制
  3. HMAC-SM3的实现原理和实际应用场景
  4. 密码学标准的严谨性和实现细节的重要性
posted @ 2025-09-30 09:38  20231414王仕琪  阅读(16)  评论(0)    收藏  举报