7第七章Hash函数
hash函数的应用

hash函数的应用
Hash函数是一种将数据转换成固定长度散列值的函数。
在计算机科学中,它们用于许多不同的应用程序,包括密码学,数据结构,文本和图像相似性比较,以及许多其他领域。
## 密码学
Hash函数在密码学中广泛使用。
在密码学中,Hash函数被用来创建消息摘要。
一个消息摘要是一个固定长度的数字字符串,代表了一个消息或数据块。
它通常用于确保数据完整性,以及验证消息的来源。
## 数据结构
Hash函数在数据结构中也有广泛的应用。
它们被用来实现哈希表和哈希映射。
哈希表是一种数据结构,它可以快速查找和访问存储在其中的数据。
哈希映射是一种将键值对映射到散列表中的数据结构。
## 文本和图像相似性比较
Hash函数还可以用于比较文本和图像的相似性。
在这种情况下,Hash 函数被用来计算两个文本或图像之间的差异。
这种比较通常用于搜索引擎中,以找到与查询相匹配的文本或图像。
## 总结
Hash函数是一种非常有用的工具,可以用于许多不同的应用程序。
它们在密码学,数据结构,文本和图像相似性比较等领域都有广泛的应用。
对于计算机科学学生和从事相关领域的专业人士来说,了解Hash函数的应用非常重要。
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函数通用来构造数据的短“指纹”(函 数值);一旦数据改变,指纹就不再正确。 即使数据被存储在不安全的地方,通过重新 计算数据的指纹并验证指纹是否改变,就能 够检测数据的完整性。
第七章-哈希表

哈希表又称散列表,实际上就是一个数组。
哈希函数是一个用来求存储在哈希的关键字在哈希表的地址下标的函数.比如一个哈希表int hashtable[5];现在有下面4个数要存入到哈希表中:(3,15,22,24)给定一个哈希函数: H(k)=k % 5最终数据存储如下图:理想情况下,哈希函数在关键字和地址之间建立了一个一一对应关系,从而使得查找只需一次计算即可完成。
由于关键字值的某种随机性,使得这种一一对应关系难以发现或构造。
因而可能会出现不同的关键字对应一个存储地址。
即k1≠k2,但H(k1)=H(k2),这种现象称为冲突。
把这种具有不同关键字值而具有相同哈希地址的对象称“同义词”。
在大多数情况下,冲突是不能完全避免的。
这是因为所有可能的关键字的集合可能比较大,而对应的地址数则可能比较少。
对于哈希技术,主要研究两个问题:(1)如何设计哈希函数以使冲突尽可能少地发生。
(2)发生冲突后如何解决。
哈希函数的构造方法:构造好的哈希函数的方法,应能使冲突尽可能地少,因而应具有较好的随机性。
这样可使一组关键字的散列地址均匀地分布在整个地址空间。
根据关键字的结构和分布的不同,可构造出许多不同的哈希函数。
1.直接定址法直接定址法是以关键字k本身或关键字加上某个数值常量c作为哈希地址的方法。
该哈希函数H(k)为:H(k)=k+c (c≥0)这种哈希函数计算简单,并且不可能有冲突发生。
当关键字的分布基本连续时,可使用直接定址法的哈希函数。
否则,若关键字分布不连续将造成内存单元的大量浪费。
2.除留余数法(注意:这种方法常用)取关键字k除以哈希表长度m所得余数作为哈希函数地址的方法。
即:H(k)=k %m这是一种较简单、也是较常见的构造方法。
这种方法的关键是选择好哈希表的长度m 。
使得数据集合中的每一个关键字通过该函数转化后映射到哈希表的任意地址上的概率相等。
理论研究表明,在m 取值为素数(质数)时,冲突可能性相对较少。
第7章 密码学Hash函数

• 例2: 明文: “Go now”
•
G 01000111
•
o 01101111
•
n 01101110
•
o 01101111
•
w 01110111
• • 不行
01011110
13
精品PPT
Hash函数(hánshù)构造
• 基于分组密码 • 用候选单向函数构造Hash函数 • 矩阵单向函数 • 基于胞元自动机的算法 • 以有限域中元素的指数(zhǐshù)运算构造 • 用流密码构造
•
B = EFCDAB89
•
C = 98BADCFE
•
D = 10325476
• Step 4) 消息由512-bits 数据块(Y0,Y1,…,YL-1)处理 4
轮,每轮16次迭代
29
精品PPT
4轮
HMD5
Yq 512-bit
Message
512
CVq 128
A
B
C
D
F,T[1…16],M[i]
MD5 压缩(yā suō)函数
• 每一轮(yī lún)有16次迭代,每1次迭代形如: • B B + (( A + g(B,C,D) + M[k] +T[i])<<<s) • • g:4轮都不同的非线性函数 (F,G,H,I) • 第一轮(yī lún):F(X,Y,Z) = (X Y) ((¬X) Z) • 第二轮:G(X,Y,Z) = (X Z) (Y (¬Z)) • 第三轮:H(X,Y,Z) = X Y Z • 第四轮:I(X,Y,Z) = Y (X (¬Z))
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函数的底层原理

hash函数的底层原理Hash函数的底层原理在计算机科学中,hash函数是一种将任意大小的数据映射为固定大小的数据的一种函数。
它的底层原理是通过将输入数据进行特定的计算和处理,生成一个唯一的哈希值。
哈希值可以看作是一个数据的数字指纹,它能够唯一地标识输入数据。
哈希函数的底层原理主要包括三个方面:离散性、确定性和高效性。
离散性是指哈希函数能够将不同的输入数据映射为不同的哈希值。
这意味着即使输入数据只发生了微小的变化,哈希值也会发生很大的变化,从而保证了哈希函数的唯一性。
例如,对于两个不同的输入数据A和B,它们的哈希值分别为H(A)和H(B),如果A和B不相同,那么H(A)和H(B)也一定不相同。
确定性是指给定相同的输入数据,哈希函数总是能够生成相同的哈希值。
这意味着哈希函数是可重复的,对于相同的输入数据,无论何时何地进行计算,都会得到相同的结果。
这种确定性是hash函数的一个重要特性,它保证了数据的一致性和可验证性。
例如,对于相同的输入A,无论何时计算,它的哈希值都是固定的,即H(A)。
高效性是指哈希函数的计算速度应该尽可能快。
在实际应用中,哈希函数通常需要处理大量的数据,因此它的计算效率是一个重要的考虑因素。
高效的哈希函数能够在短时间内计算出哈希值,从而提高整个系统的性能。
为了实现高效性,哈希函数通常利用各种算法和数据结构来减少计算复杂度。
除了上述的基本原理,哈希函数还具有以下几个重要的特性:1. 雪崩效应:即输入数据的微小变化会导致哈希值的巨大变化。
这是为了增加哈希函数的安全性和唯一性。
2. 抗碰撞性:即哈希函数应该具有很高的概率保证不同的输入数据生成不同的哈希值。
这是为了防止哈希碰撞(即不同的输入数据生成相同的哈希值),从而提高数据的完整性和可靠性。
3. 不可逆性:即从哈希值无法还原出原始的输入数据。
这是为了保护数据的安全性和隐私性,特别是在密码学和数字签名等领域的应用中。
哈希函数作为一种重要的计算工具,在计算机科学和信息安全领域有着广泛的应用。
哈希函数名词解释

哈希函数名词解释哈希函数(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)。
M[k] =第q个512-bits数据块的第k个字 T[i] = T盒的第i个32-bits字 (T[i]=232×abs(sin(i)))
Hash函数构造
• • • • • • 基于分组密码 用候选单向函数构造Hash函数 矩阵单向函数 基于胞元自动机的算法 以有限域中元素的指数运算构造 用流密码构造
14
基于分组密码的Hash函数构造
M1 M2 Mn
IV
块加密
⊕
块加密
⊕
...
块加密
⊕
H
15
基于分组密码的Hash函数构造
Mi ⊕ ⊕
12
Hash函数构造
• 例1: 假设n是一个大整数. 设h (m)=m (mod n) 是介于0到n-1之间的一个整数 • 例2: 明文: “Go now” G 01000111 o 01101111 n 01101110 o 01101111 w 01110111 01011110 • 不行
13
36
T的取值
T(i) T[1] T[2] T[3] T[4] T[5] T[6] T[7] T[8] T[9] T[10] T[11] T[12] T[13] T[14] T[15] T[16] 值 D76AA478 E8C7B756 242070DB C1BDCEEE F57C0FAF 4787C62A A8304613 FD469501 698098D8 8B44F7AF FFFF5BB1 895CD7BE 6B901122 FD987193 A679438E 49B40821 T(i) T[17] T[18] T[19] T[20] T[21] T[22] T[23] T[24] T[25] T[26] T[27] T[28] T[29] T[30] T[31] T[32] 值
第七章 Hash函数
• • • • • 认证 密码学的Hash 密码学的Hash构造 Hash函数的攻击 散列算法
1
安全目标
• 保密性: – 怎样保持明文的秘密性,使得明文只能被某些 人阅读? – 用加密的方法 • 完整性: – 怎样确定一列信号在产生后没有被篡改? – 用什么方法?
2
认证
• Is a procedure to verify that received message come from the alleged source and have not been altered
“I, Alice, owe Bob $2.”, EKRA[H (M)]
• Bob发给Judge:
“I, Alice, owe Bob $200000000000.”, EKRA[H (M)]
• 法官证实EKUA [ EKRA[H (M)]] = H(“I, Alice, owe Bob $200000000000.”) 使Alice付款
10
第七章 Hash函数
• • • • • 认证 密码学的Hash 密码学的Hash构造 Hash函数的攻击 散列算法
11
Hash定义
• 定义:一个强无碰撞Hash函数是一个满足下列条 件的函数h: 1) 压缩 – h: Σ* → Σn
• 多对一映射
2) 容易计算 3) 单向 – 给定y, 求m使得h(m)=y在计算上不可行 4) 给定算法h,要找两个不同的消息x1≠x2,使其 Hash值h(x1)=(x2)是困难的
3
Naïve Idea
Alice Oscar Bob
• Alice 用密钥K加密消息 • Oscar 不知道K • 但是, Oscar能修改密文 – Bob能收到什么?
4
加密 (明文 + Hash)
散列码提供了消息结构
MAC
5
Hash函数应用
• • • • • • 认证 软件完整性 数字签名 保护口令文件 时间戳 证书
6
第七章 Hash函数
• • • • • 认证 密码学的Hash 密码学的Hash构造 Hash函数的攻击 散列算法
7
一个用Hash的例子
• Alice想给Bob发送一条消息“I owe you” • Bob可以向法官出示消息来迫使Alice付清欠款
Bob I owe you I owe you Judge
32
第一轮
迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 M M[1] M[2] M[3] M[4] M[5] M[6] M[7] M[8] M[9] M[10] M[11] M[12] M[13] M[14] M[15] M[16] s 7 12 17 22 7 12 17 22 7 12 17 22 7 12 17 22 T T[1] T[2] T[3] T[4] T[5] T[6] T[7] T[8] T[9] T[10] T[11] T[12] T[13] T[14] T[15] T[16]
17
用候选单向函数构造Hash函数
• 例1: RSA函数f(N,e): hi=(hi-1+mi)e mod N, (i=1,...,t) • 例2: 背包法: 令M1,...,Ms是二元消息数字, A=(a1,..., as)是一背包向量,ai∈[1,N] H(M)=M1a1+...+Msas mod N
34
第三轮
迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 M M[6] M[9] M[12] M[15] M[2] M[5] M[8] M[11] M[14] M[1] M[4] M[7] M[10] M[13] M[16] M[3] s 4 11 16 23 4 11 16 23 4 11 16 23 4 11 16 23 T T[33] T[34] T[35] T[36] T[37] T[38] T[39] T[40] T[41] T[42] T[43] T[44] T[45] T[46] T[47] T[48]
28
Yq
4轮
512-bit Message A B
CVq C
128
512
D
F,T[1…16],M[i] 16 steps A B C D
G,T[17…32],M[ρ2i] 16 steps A B C D
HMD5
A
H,T[33…48],M[ρ3i] 16 steps B C D
I,T[49…64],M[ρ4i] 16 steps
CV0=IV= initial n-bit value CVi=f(CVi-1, Yi-1) (1 ≤ i ≤ L) H(M) = CVL
25
MD5
L×512 bits=N ×32bits K bits Message
padding (1 to 512 bits)
100…0
Length of Message
· 攻击具有分组链接结构的Hash函数
- 差分攻击
· 攻击基于分组加密函数构造的Hash函数
- 修正分组攻击
· 攻击基于模算术的Hash函数
21
结论
• Hash值的长度必须足够大,以便使得生日 攻击不能成功 • MD5的Hash长度为128位,M=264;SHA-1 的Hash长度为160位,则M=280
24
Hash 算法的结构
Y0 b n CV0 IV = CV = Yi = f = n = b = f b n CV1 f n Y1 b f n CVL-1 n CVL YL-1
Initial Vector Chain Vector The ith Message Block Compress Function Hash Value Length Block Length
(K mod 264)
512 bits
512 bits
512 bits
512 bits
Y0
512 128 128
Y1
512 128
Yq
512 128
YL-1
512
IV
HMD5
CV1
HMD5
CVq
HMD5
CVL-1
128-bit digest
HMD5
26
填充举例
• 例:消息由 704位组成,则在其末尾添加 256位(1后面跟255个0),消息扩展到 960位 • 将消息的原始长度缩减为mod 264 ,例: 704位=1011000000位,将这个数书写为64 位(在开始位置添加54个0) • 最后结果是一个具有1024位的消息
35
第四轮
迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 M M[1] M[8] M[15] M[6] M[13] M[4] M[11] M[2] M[9] M[16] M[7] M[14] M[5] M[12] M[3] M[10] s 6 10 15 21 6 10 15 21 6 10 15 21 6 10 15 21 T T[49] T[50] T[51] T[52] T[53] T[54] T[55] T[56] T[57] T[58] T[59] T[60] T[61] T[62] T[63] T[64]
27
MD5 细节
• Step 1) 填充消息: 10...0, 使消息长度等于448 mod 512 • Step 2) 添加明文长度(64位) • Step 3) 初始化4个字(128 bits)的寄存器(A, B, C, D) A = 67452301 B = EFCDAB89 C = 98BADCFE D = 10325476 • Step 4) 消息由512-bits 数据块(Y0,Y1,…,YL-1)处理 4 轮,每轮16次迭代