`

散列函数

 
阅读更多

 

散列(HASH)函数H也称哈希函数或杂凑函数等,是典型的多到一的函数,其输入为一可变长x(可以足够的长),输出一固定长的串h(一般为128位、160位,比输入的串短),该串h被称为输入xHash值(或称消息摘要Message Digest、指纹、密码校验和或消息完整性校验),计作h=H(x)。为防止传输和存储的消息被有意或无意地篡改,采用散列函数对消息进行运算生成消息摘要,附在消息之后发出或与信息一起存储,它在报文防伪中具有重要应用。

消息摘要采用一种单向散列算法将一个消息进行换算。在消息摘要算法中,文件数据作为单向散列运算的输入,这个输入通过HASH函数产生一个散列值。如果改动了文件,散列值就会相应地改变,接收者即能检测到这种改动过的痕迹。从理论上来讲,攻击者不可能制造一个替用的消息来产生一个完全相同的消息摘要。Hash函数可用于数字签名、消息的完整性检测、消息的起源认证检测等。

散列函数是安全的是指它具有:

一致性:相同的输入产生相同的输出。

随机性:消息摘要外观是随机的,以防被猜出源消息。

唯一性:几乎不可能找到两个消息产生相同的消息摘要。

单向性:即如果给出输出,则很难确定出输入消息。

Hash函数H一般满足以下几个基本要求:

1)输入x可以为任意长度;输出数据串长度固定;

2)正向计算容易,即给定任何x,容易算出H(x);反向计算困难,即给出一Hashh,很难找出一特定输入x,使h=H(x)

3)抗冲突性(抗碰撞性),包括两个含义,一是给出一消息x,找出一消息y使H(x)=H(y)是计算上不可行的(弱抗冲突),二是找出任意两条消息xy,使H(x)=H(y)也是计算上不可行的(强抗冲突)。

Hash函数有两种穷举攻击。一是给定消息的Hash函数H(x),破译者逐个生成其他文件y,以使H(x)=H(y)。二是攻击者寻找两个随机的消息:xy,并使H(x)=H(y)。这就是所谓的冲突攻击。穷举攻击方法没有利用Hash函数的结构和任何代数弱性质,它只依赖于Hash值的长度。由以下的生日问题分析我们知道Hash值必须足够长,比如160位。

 

我们来看生日问题。在一个教室中最少应有多少学生才使得找一个学生与某人生日(该人也在教室)相同的概率不小于1/2?答案是254人。但至少有两个学生的生日在同一天的概率不小于1/2的答案出人意料地低,仅为23人。以下进行详细分析。

一个人与一个已知生日的人不是同生日的概率是364/365,假如教室有t个人,则其余的人与某人都不同生日的概率是(364/365)t-1,所以至少有一个人与此人同生日的概率是1-(364/365)t-1

第一个人的生日为一个特定生日,第二个人不在该日生的概率是(1-1/365),第三个人与前两位不同生日的概率是(1-2/365),第t个人与前t-1个人不同生日的概率是(1-(t-1)/365),所以t个人都不同生日的概率是(1-1/365) (1-2/365)(1-(t-1)/365),利用1-x » e-x(x很小),概率约为e-t(t-1)/2*365,而至少有两个人生日相同的概率是1-(1-1/365) (1-2/365)(1-(t-1)/365)。经过计算,我们有:» 1.17*3651/2 »22.3,即随机选择23人,至少有2人生日相同的概率至少为1/2

 

寻找特定生日的一个人类似于第一种攻击;而寻找两个随机的具有相同生日的两个人则是第二种攻击。第二种方法通常被称为生日攻击(Birthday Attack)。

生日攻击意味着HASH值的长度有一个下界,128位的消息摘要,在1.17*264个随机HASH值中至少有1/2的概率发生一个碰撞。所以,通常建议用160位或更长的消息摘要。

 

单向散列函数通常用于提供消息或文件的指纹。与人类的指纹类似,由于散列指纹是唯一的,因而提供了消息的完整性和认证。发送者A向接收者B发送消息M的基本过程是:

1)发送者写一消息M,并作为单向散列函数H的输入。

2)消息摘要H(M)连消息M一齐发送

3)接受者分离消息和消息摘要,并利用消息生成消息摘要。

4)比较两消息摘要,如果相同,则消息在传送期间没被更改。

 B M || H(M)

虽然大部分情况下,HASH函数是不需要密钥的,但根据应用不同,可以给HASH函数加上密钥,用于保护HASH结果的完整性,如HMAC

如果发送者使用带密钥的HASH函数来产生HASH值的话,由于攻击者不知道密钥(发送文件的时候一般不会把密钥附带在文件上),所以,即使攻击者产生了假冒的HASH结果,接收者利用密钥进行验证的时候,同样会发现文件遭到了修改,从而保证了传输文件的完整性。利用上述方法产生的HASH结果就成为消息校验码MAC

通过以下方式使用散列函数常提供消息鉴别:

1)使用对称加密方法对附加消息摘要的报文进行加密(提供保密与鉴别)。

 B Ek(M || H(M))

2)使用对称加密方法对消息摘要进行加密(提供鉴别)。

 B  M || Ek(H(M))

3)使用发方的私有密钥对消息摘要进行加密(提供鉴别和数字签名)。

 B  M || Eka(H(M))

4)在(3)的基础上,使用对称加密方法进行加密(提供鉴别和数字签名、保密)

 B  Ek(M || Eka(H(M)))

5)假定双方共享一个秘密值S,使用散列函数提供鉴别。

 B M || H(M||S)

6)假定双方共享一个秘密值S,使用散列函数、对称加密方法提供鉴别、数字签名、保密。

 B Ek(M || H(M) ||S)

消息摘要使用几种有着些许差别的算法。其中两种最普遍、最流行的消息摘要方式是:RSAMD2RSAMD5。一个消息摘要是一个加密校验和,不像CRC是一个算术校验和。常用的散列函数有:消息摘要4MD4)算法、消息摘要5MD5)算法、安全散列函数(SHA)。

MD5算法是对杂凑压缩信息块按512位进行处理的,首先它对杂凑信息进行填充,使信息的长度等于512的倍数。填充方法是首先在压缩信息后填充以字节长的信息长度,然后再用首位为1,后面全为0的填充信息填充,使经过填充后的信息长度为512的倍数,然后对信息依次每次处理512位,每次进行4轮,每轮16步总共64步的信息变换处理,每次输出结果为128位,然后把前一次的输出作为下一次信息变换的输入初始值(第一次初始值算法已经固定),这样最后输出一个128位的杂凑结果。目前MD5被认为是最安全的杂凑算法之一,现已经在很多应用中被当成标准使用。

 

 

分享到:
评论

相关推荐

    两种适用于中文信息搜集的URL散列函数的研究

    ### 两种适用于中文信息搜集的URL散列函数的研究 #### 摘要 随着互联网信息量的爆炸式增长,搜索引擎面临着前所未有的挑战。为应对这一挑战,搜索引擎开始采用分布式技术来搜集信息,以提高信息处理的效率和能力。...

    MD5散列函数的MATLAB代码

    MD5散列函数是一种广泛应用的密码学散列函数,它能将任意长度的数据转化为固定长度的128位(16字节)摘要。在MATLAB中实现MD5散列功能,可以用于数据完整性校验、密码存储以及文件校验等场景。下面将详细介绍MD5散列...

    链表 树 散列函数C語言實現

    链表、树和散列函数是计算机科学中的基础数据结构和算法,它们在C语言实现中扮演着重要的角色。在C语言中,由于其低级特性和直接内存操作,这些概念可以被高效地实现,为程序提供高效的数据管理和查找功能。 首先,...

    单向散列函数组件 for ASP

    单向散列函数组件 for ASP 目前支持散列函数: SHA-1 输出为160bit MD5 输出为128bit 以后将逐步更新。Of course 免费。 类ID: iHash.HashObj 例: demo.asp: <;%@LANGUAGE=";VBSCRIPT"; ...

    Hash散列函数——二次探查以及链式探查实现

    在IT领域,数据结构是构建高效算法的基础,而散列函数是其中不可或缺的一部分。散列函数,也称为哈希函数,是一种将任意大小的输入(通常称为键或关键字)映射到固定大小输出的函数。这个固定大小的输出通常被称为...

    【课件】7.5.2散列函数的构造.pdf

    根据提供的标题、描述以及部分内容,可以总结出关于“散列函数的构造”的相关知识点如下: ### 散列函数概述 散列函数(Hash Function)是一种将任意长度的消息映射为固定长度散列值(Hash Value)的方法。在...

    密码学MD5及散列函数

    在C++编程中,可以使用各种库来实现散列函数,例如OpenSSL库就提供了MD5和SHA-1等散列函数的实现。通过这些库,开发者可以方便地计算文件或字符串的散列值,用于验证数据的完整性和一致性。以下是一个简单的C++代码...

    GPU上典型存储器难散列函数的优化.pdf

    在本文中,作者探讨了GPU上优化存储器难散列函数的方法,特别是在应对ASIC(专用集成电路)攻击方面。这些函数因其大内存占用和频繁的内存访问特性,被认为是构建下一代密码散列算法的基础。存储器难散列函数旨在...

    网络游戏-使用循环冗余校验散列函数管理网络业务的方法和装置.zip

    本文件"网络游戏-使用循环冗余校验散列函数管理网络业务的方法和装置.zip"深入探讨了如何利用循环冗余校验(CRC)和散列函数来优化这一过程。以下是相关知识点的详细解释: 1. 循环冗余校验(CRC):CRC是一种广泛...

    散列函数,对称加密算法,公钥密码算法的加密算法原理

    散列函数是将任意长度的输入信息变换为固定长度的输出信息的函数,常用于数据完整性验证和身份验证。常见的散列函数有 SHA-1、MD5 等。 对称加密算法是使用同一个密钥进行加密和解密的加密算法,常用于保护数据的...

    论文研究-一种新的基于混沌理论和散列函数的图像加密算法 .pdf

    混沌理论和散列函数在信息安全领域的重要应用之一就是图像加密算法的研究与实现。图像加密算法旨在将图像数据转换成一种只有授权用户才能解读的形式,以防止未授权访问和图像的非法使用。随着数字图像技术的发展,...

    伪随机数发生器与单向散列函数PPT课件.pptx

    伪随机数发生器和单向散列函数是信息安全领域中至关重要的组成部分,广泛应用于加密算法、数字签名和消息认证等领域。下面将详细解释这两个概念及其重要性。 首先,伪随机数发生器(Pseudo-Random Number Generator...

    基于散列函数与半边数据结构的TIN拓扑重构算法.pdf

    散列函数与半边数据结构在TIN拓扑重构算法中的应用 散列函数在TIN拓扑重构算法中的作用: TIN(Triangulated Irregular Network)模型是一种在数字露天矿软件中被广泛应用于描述地表与地质层面模型的数据结构。在...

    windows登录口令存储所使用的LM和NTLM散列函数

    在Windows操作系统中,为了保护用户的登录口令不以明文形式存储,系统采用了散列函数进行加密处理。这里我们主要讨论的是LM(Lan Manager)和NTLM(NT LAN Manager)两种散列算法,它们在Windows XP及更早版本中被...

    HashingFunctions:为布隆过滤器实现散列函数

    散列函数是一个函数,它接受一些输入(对于这个 repo,我们将处理字符串),并输出指定范围内的整数。 散列函数有四个主要属性要符合: 决定论 给定相同的输入,散列函数应始终返回相同的输出,而不管该函数何时或...

    基于分布式压缩感知和散列函数的数据融合隐私保护算法.pdf

    基于分布式压缩感知和散列函数的数据融合隐私保护算法,是一种专门针对众包感知网络数据汇聚和传输过程中的隐私和安全问题所提出的。众包感知网络是利用众多移动设备进行数据收集的分布式网络系统。在此类系统中,...

    基于C#实现MD5散列函数(源码).rar

    1、资源内容:基于C#实现MD5散列函数(源码).rar 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为“参考资料”参考学习使用。 3、解压说明:本资源需要电脑端使用WinRAR、7zip等解压工具进行解压,...

    散列函数MD5代码

    MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,由计算机科学家Ronald Rivest在1991年设计。它能够将任意长度的数据转化为一个固定长度的摘要,通常是一个128位的二进制数,以16进制表示就是32个字符...

    电信设备-D2D通信中基于散列函数和RLE编码的BitMap发现移动应用方法.zip

    本话题将深入探讨在D2D通信中如何利用散列函数和RLE(Run Length Encoding)编码的BitMap技术来实现移动应用的发现方法。 首先,我们需要理解D2D通信的基本原理。D2D通信允许移动设备在短距离内直接交换数据,尤其...

Global site tag (gtag.js) - Google Analytics