密码学05-Hash函数
Hash函数的定义
Hash函数的定义
- Hash函数的定义
- 将任意长的消息
映射为较短的、 固定长度的一个值 。 - Hash函数也称为哈希函数、散列函数、压缩函数、杂凑函数、指纹函数等。
为哈希值、散列值、杂凑码、指纹、消息摘要等。 - Hash函数
一般是公开的。
- 将任意长的消息
例
Hash函数满足的条件
- Hash函数的目的是为需认证的数据产生一个“指纹”
- Hash函数应满足以下条件:
- Hash函数函数的输入可以是任意长
- Hash函数函数的输出是固定长
- 在软件和硬件上易于实现
- Hash函数满足的安全条件
- Hash函数为了实现安全认证,需要满足如下安全条件:
- 单向性: 已知x,求
较为容易;但是,已知 ,求使得 的 在计算上是不可行的。 - 抗弱碰撞性: 已知
,找出 使得 在计算上是不可行的。 - 抗强碰撞性: 找出任意两个不同的输入
,使得 在计算上是不可行的 - 关系:抗强碰撞性
抗弱碰撞性 单向性
- 单向性: 已知x,求
迭代型杂凑函数的一般结构
![[迭代型杂凑函数的一般结构.png]]
比特长的初值
生日攻击
问题1---第 类生日攻击问题
已知一杂凑函数
- 为叙述方便,称对杂凑函数H寻找上述y的攻击为第
类生日攻击
因为
有 个可能的输出,所以输入 产生的输出 等于特定输出 的概率是 ,反过来说 的概率是 。
取 个随机值而函数的 个输出中没有一个等于 ,其概率等于每个输出都不等于 的概率之积,为 ,所以y取k个随机值得到函数的 个输出中至少有一个等于 的概率为 。 由当
, ,可得
若使上述概率等于,则 。特别地,如果 的输出为 比特长,即可能的输出个数 ,则
问题2---生日悖论
-
[?] 在
个人中至少有两个人的生日相同的概率大于0.5时, 至少多大? -
设有
个整数项,每一项都在 1 到 之间等可能地取值。 : 个整数项中至少有两个取值相同的概率
-
生日悖论就是求使得
的最小 。 : 个数据项中任意两个取值都不同的概率
如果
,则不可能使得任意两个数据都不相同,因此假定 。 个数据项中任意两个都不相同的所有取值方式数为
如果去掉任意两个都不相同这一限制条件,可得k个数据项中所有取值方式数为365k。所以可得
- 当
时, ,即上述问题只需23人,人数如此之少。 - 若
,则 ,即获得如此大的概率。 - 之所以称这一问题是悖论是因为当人数k给定时,得到的至少有两个人的生日相同的概率比想象的要大得多。
生日悖论推广问题
-
[?] 已知一个在
到 之间均匀分布的整数型随机变量,若该变量的 个取值中至少有两个取值相同的概率大于0.5,则 至少多大? -
,令 ,可得 -
若取
,则
生日攻击
设杂凑函数
第 类生日攻击
-
[?] 寻找函数
的具有相同输出的两个任意输入的攻击方式 -
输出长度与碰撞
- 这种生日攻击给出了消息摘要长度的下界,一个40比特的消息摘要是非常不安全的。
- 因为在大约220个(大约100万)个随机值中就能以1/2的概率找到一个碰撞。
- 通常建议消息摘要的最小可接受的长度为128比特,在DSS签名标准中使用160比特的消息摘要就是基于这个考虑
SHA-1 算法
安全杂凑算法SHA‐1
安全杂凑算法(Secure Hash Algorithm, SHA)由美国NIST设计,于1993年作为联邦信息处理标准公布。SHA是基于MD4的算法,其结构与MD4非常类似
算法描述
- 算法的输入: 小于
比特长的任意消息,分为 512 比特长的分组。 - 算法的输出: 160 比特长的消息摘要。
- 算法的框图与MD5一样,但杂凑值的长度和链接变量的长度为160比特
![[SHA-1算法的框图.png]]
算法处理步骤
①对消息填充
- 对消息填充,使得其比特长在模512下为448,即填充后消息的长度为512的某一倍数减64,留出的64比特备第 ② 步使用。
- 步骤 ① 是必需的,即使消息长度已满足要求,仍需填充。例如,消息长为448比特,则需填充512比特,使其长度变为960,因此填充的比特数大于等于1而小于等于512。
- 填充方式是: 第1位为1,其后各位皆为0
②附加消息的长度
- 留出的64比特以来表示消息被填充前的长度。如果消息长度大于264,则以264为模数取模。
- big-endian模式是指数据的高字节保存在内存的低地址中,反之为little-endian模式
③对MD缓冲区初始化
使用160比特长的缓冲区存储中间结果和最终杂凑值。缓冲区为5个32比特以big-endian方式存储数据的寄存器(A, B, C, D, E)
初始值分别为 A=67452301, B=EFCDAB89, C=98BADCFB, D=10325476, E=C3D2E1F0
④ 以分组为单位对消息进行处理
每一分组
第4轮的输出(即第80步迭代的输出)再与第1轮的输入
![[SHA的分组处理框图.png]]
⑤ 输出消息
- 输出消息的L个分组都被处理完后,最后一个分组的输出即为160比特的消息摘要。
总结——③到⑤的处理过程
: 缓冲区ABCDE的初值。 : 第q个消息分组经最后一轮处理过程处 理后的输出 : 消息(包括填充位和长度字段)的分组数 : 对应字的模 加法 : 最终的摘要值。
SHA的压缩函数
SHA的压缩函数由4轮处理过程组成,每轮处理过程20步迭代运算组成,每一步迭代运算的形式为
: 缓冲区的5个字 : 迭代的步数(0≤t≤79) : 第 步迭代使用的基本逻辑函数 : 左循环移 位 : 由当前512比特长的分组导出的一个 32 比特长的字 : 加法常量 : 模 加法。
![[一步迭代示意图.png]]
基本逻辑函数
迭代的步数 | 函数名 | 定义 |
---|---|---|
本逻辑函数的输入为3个32比特的字,输出是一个32比特的字。表中 |
字
下面说明如何由当前的输入分组(512比特长)导出
![[SHA分组处理所需的80个字的产生过程.png]]
常量字
常量字
SM3密码杂凑算法
SM3密码杂凑算法简介
SM3是中国国家密码管理局颁布的中国商用密码标准算法,它是一类密码杂凑函数,可用于数字签名及验证、消息认证码生成及验证、随机数生成。
标准起草人:王小云、李峥、于红波、张超、罗鹏、吕述望
2012年3月,成为中国商用密码标准(GM/T 0004-2012)
2016年8月,成为中国国家密码标准(GB/T 32905-2016)
2018年11月22日, 含有我国SM3杂凑密码算法的ISO/IEC 10118 – 3 : 2018《信息安全技术杂凑函数第3部分:专用杂凑函数》 最新一版(第4版)由国际标准化组织(ISO)发布, SM3算法正式成为国际标准。
SM3密码杂凑算法的描述
算法的输入数据长度为
常数与函数
- 常数
- 初始值
- 常量
- 初始值
- 函数
- [i] 式中
为32位字, 分别是逻辑与、逻辑或、逻辑非和逐比特异或运算
布尔函数(混淆):
置换函数(扩散):
- [i] 式中X为32位字,符号
表示把 循环左移 位。
算法描述
算法对数据首先进行填充,再进行迭代压缩后生成哈希值。
填充并附加消息的长度
- 对消息填充的目的是使填充后的数据长度为512的整数倍。
- 设消息
的长度为 比特。首先将比特“1”添加到 的末尾,再添加 个“0”,其中 满足: - 然后再添加一个64位比特串,该比特串是长度l的二进制表示。
- 举例:消息为
011000010110001001100011
,其长度为 ,填充后的比特串为
迭代压缩
将填充后的消息
其中
![[SM3迭代压缩.png]]
SM3消息扩展过程
![[SM3消息扩展过程.png]]
- 消息分组
划分为16个字 。 - FOR
- FOR
压缩函数
设
![[SM3算法第j轮迭代压缩流程图.png]]
输出哈希值
输出 256 比特的哈希值
![[SM3 产生消息哈希值的处理过程.png]]
SM3哈希算法的安全性
- 压缩函数是哈希函数安全的关键
- SM3的压缩函数
中的布尔函数 和 是非线性函数,经过循环迭代后提供混淆作用。 - 置换函数
和 是线性函数,经过循环迭代后提供扩散作用。 - 再加上
中的其他运算的共同作用,压缩函数 具有很高的安全性,从而确保SM3具有很高的安全性。
- SM3的压缩函数
![[比较1.png]][1]
![[比较2.png]][1:1]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】