HASH函数
什么是哈希函数

什么是哈希函数哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。
1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。
哈希值也称为输入数据的数字指纹(Digital Fingerprint)或消息摘要(Message Digest)等。
Hash函数具备以下的性质:2、给定输入数据,很容易计算出它的哈希值;3、反过来,给定哈希值,倒推出输入数据则很难,计算上不可行。
这就是哈希函数的单向性,在技术上称为抗原像攻击性;4、给定哈希值,想要找出能够产生同样的哈希值的两个不同的输入数据,(这种情况称为碰撞,Collision),这很难,计算上不可行,在技术上称为抗碰撞攻击性;5、哈希值不表达任何关于输入数据的信息。
哈希函数在实际中有多种应用,在信息安全领域中更受到重视。
从哈希函数的特性,我们不难想象,我们可以在某些场合下,让哈希值来“代表”信息本身。
例如,检验哈希值是否发生改变,借以判断信息本身是否发生了改变。
`怎样构建数字签名好了,有了Hash函数,我们可以来构建真正实用的数字签名了。
发信者在发信前使用哈希算法求出待发信息的数字摘要,然后用私钥对这个数字摘要,而不是待发信息本身,进行加密而形成一段信息,这段信息称为数字签名。
发信时将这个数字签名信息附在待发信息后面,一起发送过去。
收信者收到信息后,一方面用发信者的公钥对数字签名解密,得到一个摘要H;另一方面把收到的信息本身用哈希算法求出另一个摘要H’,再把H和H’相比较,看看两者是否相同。
根据哈希函数的特性,我们可以让简短的摘要来“代表”信息本身,如果两个摘要H和H’完全符合,证明信息是完整的;如果不符合,就说明信息被人篡改了。
Hash函数

(Rivest ‚‘90)
RIPEMD-0
(RIPE, ‘92)
RIPEMD-128
RIPEMD-160
RIPEMD-256
RIPEMD-320
(Dobbertin, Bosselaers,
Preneel ‘96)
32
MD5
HAVAL
(Rivest ‚‘92)
(Zhens, ensure US/Allied freedom of action in cyberspace and deny the
same to our adversaries."
5
Hash函数的基本属性
压缩性
➢ 应用于任意大小的数据块,产生定长的输出
有效性
➢ 对任意给定的消息x,计算h(x)是容易的
19
练习
生日攻击的估计值与准确值
当15 m 30时,比较1 e
20
m2
2365
m1
i
与1 (1
)
365
i 1
Hash函数的主要构造方法
基于数学困难问题
基于分组密码
➢ 杂凑值等于分组长度
➢ 杂凑值大于分组长度:MDC-2, MDC-4等
定制Hash函数
➢ MD4,
[101]
[102]
[103]
2156.6
2009
[30]
杂凑函数的碰撞攻击
国内外Hash函数研究进展比较
碰撞攻击
269
261
2005
2006
[87]
[104]
48轮原像攻击
2159.3
HASH函数简介

② 弱单向性:已知x,找出x’ (x’ ≠x),使得 h(x’ )= h(x) 在计算上是不可行的,满足这一 性质的单向散列函数称为弱单向散列函数。
Hash函数的安全性
问题 碰撞
实例:Hash函数h:X → Y
找出:x,x’∈X使得x’ ≠x,并且h(x’ )= h(x) ③ 强单向性:找出任意两个不同的输入x,x’ 使得h(x’ )= h(x)在计算上是不可行的,满足 这一性质的单向散列函数,则称其为强单向 散列函数
它适用在32位字长的处理器上用高速软件实 现--它是基于 3ash算法:
MD5:1992年4月Ron Rivest公布的MD4的改 进RFC 1321称为MD5 它对输入仍以512位分组,其输出是4个32位 字的级联,与 MD4 相同。MD5比MD4来得 复杂,并且速度较之要慢一点,但更安全, 在抗分析和抗差分方面表现更好。
Hash算法
从密码分析的角度来看,MD5被认为是易受 攻击的 2004年山东大学王小云教授破译了MD5, 采用”比特追踪法”(模差分方法)可以很 快的找到一个碰撞。而且这种攻击已经部 分的可实用化,即找到有意义的碰撞。
Hash算法
著名的Hash算法:
SHA1:安全杂凑算法(secure hash algorithm,
Hash函数
Hash函数
在实际的通信保密中,除了要求实现数 据的保密性之外,对传输数据安全性的 另一个基本要求是保证数据的完整性。 密码学中的Hash函数可为数据完整性提 供保障
数据的完整性是指数据从 发送方产生后,经过传输 或存储以后,未被以未授 权的方式修改的性质。
Hash函数
Hash函数通用来构造数据的短“指纹”(函 数值);一旦数据改变,指纹就不再正确。 即使数据被存储在不安全的地方,通过重新 计算数据的指纹并验证指纹是否改变,就能 够检测数据的完整性。
第17讲 Hash 函数.

Hash函数的安全性
生日攻击法
分别把消息m和M表示成r和R个变形的消息
Hash函数的安全性
生日攻击法
计算真消息m的变形与假消息M的变形发生碰撞的 概率 由于n比特长的散列值共有2n个,所以对于给定m 的变形mi和M的变形Mj,mi与Mj不碰撞的概率是 1-1/2n。由于M共有R个变形,所以M的全部变形 都不与mi碰撞的概率是:
1 2 k 1 1 1 ...1 . 365 365 365
k人中至少有2人生日相同的概率为: 1 2 k 1 P(365, k ) 1 1 1 ...1 . 365 365 365
有P(365,23)=0.5073。即在23个人中,至少有两 个人生日相同的概率大于0.5,这个数字比人们 直观猜测的结果小得多,因而称为生日悖论。
Hash函数的安全性
生日攻击法 生日悖论原理可以用于构造对Hash函数 的攻击
设Hash函数值有n个比特,m是真消息,M 是伪造的假消息,分别把消息m和M表示成r 和R个变形的消息。消息与其变形消息具有 不同的形式,但有相同的含义。将消息表示 成变形消息的方法很多,例如增加空格、使 用缩写、使用意义相同的单词、去掉不必要 的单词等。
第8章 Hash 函数
Hash函数定义
数据安全 机密性 完整性 认证性 密码技术主要保证数据的机密性 Hash函数能保证数据的完整性和认证性
Hash函数定义
Hash函数常用来构造数据的短“指纹”:消息的 发送者使用所有的消息产生一个附件也就是短 “指纹”,并将该短“指纹”与消息一起传输给 接收者。 即使数据存储在不安全的地方,接收者重新计算 数据的指纹,并验证指纹是否改变,就能够检测 数据的完整性。这是因为一旦数据在中途被破坏, 或改变,短指纹就不再正确。
c语言hash用法

C语言Hash用法什么是Hash函数在计算机科学中,Hash函数是一种将数据映射到固定大小值的函数。
Hash函数将输入数据(也称为键)映射到一个较小的固定大小的值(也称为哈希值或散列值)。
这个哈希值通常用于快速查找数据结构中的键,例如哈希表。
Hash函数的输出被称为哈希码或散列码。
Hash函数的设计要求是保证输入数据相同,输出的哈希值也相同,而输入数据不同,输出的哈希值也不同。
此外,好的Hash函数应该尽量避免碰撞,即不同的输入数据映射到相同的哈希值。
C语言中的Hash函数在C语言中,没有内置的Hash函数,但我们可以使用一些常见的算法来实现自己的Hash函数。
以下是一些常用的Hash函数算法:1. 直接寻址法直接寻址法是最简单的Hash函数实现方法之一。
它将键直接用作哈希值,即哈希值等于键本身。
这种方法适用于键与哈希表大小相等的情况,但在键的范围很大时不太实用。
unsigned int direct_addressing_hash(int key) {return key;}2. 数字分析法数字分析法是一种根据键的某些特定数字特征来计算哈希值的方法。
例如,如果键是一个电话号码,我们可以用电话号码的前几位数字作为哈希值。
unsigned int digit_analysis_hash(int key) {// 获取键的前几位数字unsigned int hash = 0;while (key > 0) {hash = key % 10;key /= 10;}return hash;}3. 除留余数法除留余数法是一种常用的Hash函数实现方法。
它将键除以哈希表的大小,然后取余数作为哈希值。
unsigned int division_remainder_hash(int key, unsigned int table_size) { return key % table_size;}4. 平方取中法平方取中法是一种将键的平方值的中间几位作为哈希值的方法。
武汉大学《密码学》课件第十三讲 HASH函数

与AES配套 增强安全性
z 与SHA-1比较:
结构相同 逻辑函数相同 摸算术相同
27
三、SHA-2 HASH函数
1、 SHA-2的概况
SHA参数比较
Hash码长度 消息长度 分组长度 字长度 迭代步骤数 安全性
SHA-1 160 <264 512 32 80 80
SHA-256 256 <264 512 32 64 128
SHA-384 384 <2128 1024 64 80 192
SHA-512 512 <2128 1024 64 80 256
注:1、所有的长度以比特为单位。
2、安全性是指对输出长度为n比特hash函数的生日攻击产生碰撞的工作量大约为2n/2
。
28
三、SHA-2 HASH函数
2、 SHA-512
注意:在① 、②步后,数据长度为1024的N倍。 将数据分成N块,每块1024位,进行迭代处理。
30
三、SHA-2 HASH函数
L位 消息
N×1024位
L 10…0 消息长度
1024位 M1
1024位 M2
1024位 MN
512位 IV F
+ H1 F
+ H2
z F块处理 z +为摸264加
⑹压缩函数
z 每轮对A,B,C,D,E进行20次迭代,四轮共80次迭代。 t为迭代次数编号,所以 0≤t≤79 。
z 其中,ft(B,C,D) = 第t步使用的基本逻辑函数; <<s 表示 32位的变量循环左移s位 W t表示从当前分组BLK导出的32位的字 K t表示加法常量,共使用4个不同的加法常量 +为 模232加法
Hash函数

第3轮 以 [ABCD k s i]表示如下操作 A = B + ((A + H(B,C,D) + X[k] + T[i]) <<< s). Do the following 16 operations. [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
3、强无碰撞hash函数是单向的。 总之,Hash函数应该满足 1)由自变量求函数是容易的,反之是困难的。 2)寻找碰撞是困难的
四、Hash函数实例 MD5
MD:Merkle-Damgard结构 输入:任意长度的消息 输出:128位消息摘要 处理:以512位输入数据块为单位
L×512 bits=N ×32bits × K bits 报文
填充 (1 to 448 bits)
100…0
报文长度 (K mod 264)
512 bits
512 bits
512 bits
512 bits
Y0
512
Y1
512
Yq
512
YL-1
512
128
128 128 128
HMD5
IV CV1
HMD5
CVq
HMD5
CVL-1
哈希函数名词解释

哈希函数名词解释哈希函数(hash function)是解决密码学上的一个很有用的函数,它能将很多不同的信息结合成一个特征向量。
分组密码体制是数据加密和解密所采用的主要方法,是指把需要加密的文件分为若干组,每组给定一个加密密钥,对这些文件进行加密,其余部分对外宣称是无密文件。
这种方法安全性较高,但效率低下,因此,只在少数场合使用。
哈希函数也可用于对任意长度的数据块进行加密,例如,使用一个512位的字符数组,即可将信息长度扩展至32766位(1K字节),因而使用计算机中的哈希函数对任意大小的信息块都可以进行加密,不再受限于密码长度。
哈希函数的基本原理是:根据文件或数据块的特征,生成一个32位的特征向量(公钥),对该特征向量计算,得到两个32位的特征向量(私钥)。
这两个向量相减就是文件或数据块的密文,如果两个特征向量之和等于所要求的密文,那么这个文件或数据块就是被加密了的;否则就是未加密的。
当然,如果特征向量相减后的值不等于所要求的密文,则说明这个文件或数据块还没有被加密。
1.数据预处理方法。
一般分为三步进行:首先,计算数据的安全哈希值,称作SHA1(sha-1)值;其次,对哈希值和文件加密密钥进行比较,以确认哈希值的正确性;最后,用哈希值来加密数据,哈希值就是加密数据的公钥。
2.数据加密方法。
一般包括数据分组、密钥预处理、哈希函数三步:首先对分组数据进行加密;其次是对加密后的数据进行分组;第三步是选取一个具有足够密钥长度并且具有适当排列顺序的哈希函数对数据进行加密。
2.1.1.1.数据分组方法。
分组时,按哈希函数值的大小对分组后的数据块逐个编号,并且使用固定的哈希函数值,作为下一轮分组和计算哈希值的依据。
这样做,可以保证数据被加密的安全性和实现简单。
2.1.2.1.密钥预处理方法。
密钥预处理时,要按哈希函数值从大到小的顺序进行,先对大的密钥执行密钥变换,再将小密钥插入到大的密钥中去。
同时,由于密钥预处理使用了小密钥,为提高哈希值计算速度,要尽量降低小密钥长度,常用的密钥变换有“距离变换”和“数据变换”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A
MD4 (1990年10月作为RFC1320发表) by Ron Rivest at MIT
• MD4的设计目标 • 安全性: • 速度:32位体系结构下计算速度快. • 简明与紧凑:易于编程. • 有利的小数在前的结构(Intel 80xxx, Pentium ) • MD4与MD5的区别 • MD4用3轮,每轮16 步,MD5用4轮,每轮16步. • MD4中第一轮没有常量加;MD5中64步每一步用了一 个不同的常量 T[i]; • MD5用了四个基本逻辑函数,每轮一个;MD4用了三 个. • MD5每轮加上前一步的结果;MD4没有.
y 取 k 个随机值得到函数的 k 个输出中至少有一个 等于h(x)的概率为 1-[1-1/n]k 由(1+x)k≈1+kx,其中|x|<<1,可得
1-[1-1/n]k≈1-[1-k/n]=k/n
给定 h(x) ,如果对 h 随机取 k 个输入,至少有一个 输入 y 使得 h(y)=h(x) 的概率为 1-[1-1/n]k≈1-[1-k/n]=k/n • 若使上述概率等于0.5,则 k=n/2。特别地,如果 h 的输出为 m 比特长,即可能的输出个数 n=2m,则 k=2m-1。
• 生日攻击(基于生日悖论) 在k个人中,找一个与某人生日相同的人的 概率超过0.5时,只需k>183; 而在此人群中, 至少有两个人生日相同的概率超过0.5,只 需k>23.
将生日悖论推广为下述问题:已知一个在1到n 之间均匀分布的整数型随机变量,若该变量的 k 个 取值中至少有两个取值相同的概率大于0.5,则k至 少多大? n! P(n, k ) 1 与上类似, (n k )!n k 令P(n, k)>0.5,可得 k 1.18 n n 若取 n=365,则
杂凑函数
任意长的消息
固定长的消息摘要
碰撞
消息 杂凑函数 消息摘要
杂凑函数的用途
• 杂凑可以把任意长的消息转换成固定大小的消息 摘要。 • 可以使公钥密码系统在签名与验证的时候,减少 运算,节省时间,提升效率,达到消息确认的目 的。 • 确保公钥签名的安全性。
1. Hash函数的概念
基本思想:
HASH函数与消息认证
• 学习要点:
– 了解HASH函数的基本概念、一般结构
– 了解SHA散列算法的基本处理方法
– 了解消息认证的目的及其实现方法
哈希(Hash)
“我们的五年计划是…” “B*U@9374392l;qHUHW”
Hash
密码学中哈希的几个基本要求
输入可为任意长度 输出定长 函数单向 足够小的冲突可能性
即第1个数据项可从365个中任取一个,第2个 数据项可在剩余的364个中任取一个,依次类推, 最后一个数据项可从365-k+1个值中任取一个。如 果去掉任意两个都不相同这一限制条件,可得k个 数据项中所有取值方式数为365k。所以可得
365! Q(365, k ) (365 k )! 365k 365! P(365, k ) 1 Q(365, k ) 1 (365 k )! 365k
攻击杂凑函数
• 攻击杂凑函数的原理是 -伪造消息,使其与原來消息的杂凑码相同 • 常見的攻击方法: -生日攻击法(Birthday Attack) -中点交会攻击法(Meet-In-The-Middle)
2. 生日攻击
1)相关问题
已知一散列函数 h 有n个可能的输出,h(x)是一 个特定的输出,如果对 h 随机取 k 个输入,则至 少有一个输入 y 使得 h(y)=h(x) 的概率为0.5时,k 有多大?
2. 设计方法和典型算法 1) 基于模数运算 用公开密钥加密实现 通常使用CBC(分组链接模式)并以最后一个 密文分组作为散列值 因速度较慢而不太实用 2) 基于分组加密 用分组密码体制加密实现 同样使用CBC(分组链接模式) 速度相对较快
CBC
• Encrypt message with block cipher in CBC mode • IV = 0, last encrypted block can serve as tag • Insecure for variable-length messages
一. Hash函数的概念
1. 基本要求 ① 公开性──算法公开、无需密钥 ② 定长性──输入长度任意、输出长度固定 ③ 易算性──由消息容易计算散列值 2. 安全性要求 ① 单向性──由消息的散列值倒算出消息在计算 上不可行 ② 抗弱碰撞性──对于任何给定消息及其散列值, 不可能找到另一个能映射出该散列值的消息 (任何给定原像都找不到其等价原像) ③ 抗强碰撞性──对于任何两个不同的消息,它 们的散列值必定不同(没有任何一对等价原 像)
基本MD5操作(单步)
A + X[k] B C g D Function g 1 F(b,c,d) 2 G(b,c,d) 3 H(b,c,d) 4 I(b,c,d) g(b,c,d) (bc)(bd) (bd)(cd) bcd c(bd)
+
+
CLSs
T[i]
+
2i = (1+5i) mod 16 3i = (5+3i) mod 16 2i = 7i mod 16
3、Hash函数的构造方法 1)Use a block cipher E(K, P). Start with some initial value X0 and update as Xi+1 = E(Mi,Xi) Xi. Final value Xn is the hash. • E(Mi,Xi) Xi is called “compression function”
2)生日悖论 生日悖论是考虑这样一个问题:在k个人中至 少有两个人的生日相同的概率大于0.5时,k至少多 大?
为了回答这一问题,首先定义下述概率:设有 k个整数项,每一项都在1到n之间等可能地取值, 则k个整数项中至少有两个取值相同的概率为P(n, k)。 因而生日悖论就是求使得P(365,k)≥0.5的最小 k,为此首先考虑k个数据项中任意两个取值都不 同的概率,记为Q(365, k)。如果k>365,则不可 能使得任意两个数据都不相同,因此假定k≤365。 k个数据项中任意两个都不相同的所有取值方式数 为 365! 365 364 (365 k 1) (365 k )!
密码学 Hash 函数 h(x) 必须满足下列特性
1)压缩:对于任意大小的输入x,输出长度 y=h(x) 很小。
实际应用中H产生定长输出h(x);
2)效率:对任意给定的x, h(x) 要相对易于计算,使得软硬 件实现都实际可行;
3)单向:对任意给定的值y, 寻求 x 使得 h(x)=y 在计算上
是不可行的,即求Hash的逆很困难; 4)弱抗碰撞性:任意给定分组x, 寻求不等于x的 y, 使得 h(y)=h(x)在计算上不可行; 5)强抗碰撞性:寻求对任何的(x,y)对使得 h(x)= h(y) 在计 算上不可行。
把哈希函数值 h(x) 看成 x 的消息摘要(message digest),或看成x的压缩代表图像(compact representative image),当 x 中任一bit化身变化时都将引起哈希 函数值的变化。这样就可以用对 h(x) 的签名代替对 x 签 名 散列函数h是一公开函数,用于将任意长的消息m 映射为较短的、固定长度的一个值h(m),作为认证符, 称函数值h(m)为杂凑值、杂凑码或消息摘要。杂凑码是 消息中所有比特的函数,改变消息中任何一个比特或几 个比特都会使杂凑码发生改变。
+ is mod 232
+
+
CVq+1
+
128
+
单个 512-bit 分组的 MD5 处理过程
MD5算法描述
HMD5的4轮处理过程结构一样,但所用的逻辑 函数不同,分别表示为F、G、H、I。每轮的输入 为当前处理的消息分组Yq和缓冲区的当前值A、B、 C、D,输出仍放在缓冲区中以产生新的A、B、C、 D。。
0 M1 M2 Mn
+
+
+
…
k
AES
k
AES
k
AES
tag
3) 专门的构造
与密码体制无关
通常直接构造复杂的非线性关系达到
单向要求
目前被广泛应用
常用 Hash Functions
• MD5: “Message Digest 5” invented by Rivest
– Input: multiple of 512-bits (padded) – Output: 128-bits
当k=23时,P(365,23)=0.5073,即上述问题 只需23人,人数如此之少。若k取100,则 P(365,100)=0.9999997,即获得如此大的概率。 之所以称这一问题是悖论是因为当人数k给定时, 得到的至少有两个人的生日相同的概率比想象的要 大得多。 这是因为在k个人中考虑的是任意两个人的生 日是否相同,在23个人中可能的情况数为 C223=253。
好的杂凑函数特性
• 高灵敏度 - 只要消息有些許的不同,经过杂凑函数转换 出的消息摘要就会有极大的不同
• 低碰撞性 - 当消息转换成消息摘要時,不同消息转换成相 同消息摘要的机会很低 • 无序性 - 无论消息的结构如何,所转换出的消息摘要都 是沒有規律性的
定义:理想的Hash函数是从所有可能的输入值到有 限可能的输出值集合的一个随机映射 如果散列函数对不同的输入可产生相同的输出, 则称该函数具有碰撞性。
HMD5
CV1
HMD5
CVq
HMD5
CVL-1
HMD5