hash算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

数学表述为:h = H(M) ,其中H( )--单向散列函数,M--任意长度明文,h--固定长度散列值。

在信息安全领域中应用的Hash算法,还需要满足其他关键特性:

第一当然是单向性(one-way),从预映射,能够简单迅速的得到散列值,而在计算上不可能构造一个预映射,使其散列结果等于某个特定的散列值,即构造相应的M=H-1(h)不可行。这样,散列值就能在统计上唯一的表征输入值,因此,密码学上的Hash 又被称为"消息摘要(message digest)",就是要求能方便的将"消息"进行"摘要",但在"摘要"中无法得到比"摘要"本身更多的关于"消息"的信息。

第二是抗冲突性(collision-resistant),即在统计上无法产生2个散列值相同的预映射。给定M,计算上无法找到M',满足H(M)=H(M') ,此谓弱抗冲突性;计算上也难以寻找一对任意的M和M',使满足H(M)=H(M') ,此谓强抗冲突性。要求"强抗冲突性"主要是为了防范所谓"生日攻击(birthday attack)",在一个10人的团体中,你能找到和你生日相同的人的概率是2.4%,而在同一团体中,有2人生日相同的概率是11.7%。类似的,当预映射的空间很大的情况下,算法必须有足够的强度来保证不能轻易找到"相同生日"的人。

第三是映射分布均匀性和差分分布均匀性,散列结果中,为0 的bit 和为 1 的bit ,其总数应该大致相等;输入中一个bit 的变化,散列结果中将有一半以上的bit 改变,这又叫做"雪崩效应(avalanche effect)";要实现使散列结果中出现1bit 的变化,则输入中至少有一半以上的bit 必须发生变化。其实质是必须使输入中每一个bit 的信息,尽量均匀的反映到输出的每一个bit 上去;输出中的每一个bit,都是输入中尽可能多bit 的信息一起作用的结果。

Damgard 和Merkle 定义了所谓"压缩函数(compression function)",就是将一个固定长度输入,变换成较短的固定长度的输出,这对密码学实践上Hash 函数的设计产生了很大的影响。Hash函数就是被设计为基于通过特定压缩函数的不断重复"压缩"输入的分组和前一次压缩处理的结果的过程,直到整个消息都被压缩完毕,最后的输出作为整个消息的散列值。尽管还缺乏严格的证明,但绝大多数业界的研究者都同意,如果压缩函数是安全的,那么以上述形式散列任意长度的消息也将是安全的。这就是所谓Damgard/Merkle 结构:

在下图中,任意长度的消息被分拆成符合压缩函数输入要求的分组,最后一个分组可能需要在末尾添上特定的填充字节,这些分组将被顺序处理,除了第一个消息分组将与散列初始化值一起作为压缩函数的输入外,当前分组将和前一个分组的压缩函数输出一起被作为这一次

压缩的输入,而其输出又将被作为下一个分组压缩函数输入的一部分,直到最后一个压缩函数的输出,将被作为整个消息散列的结果。

MD5 和SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以MD4 为基础设计的。

1) MD4

MD4(RFC 1320)是MIT 的Ronald L. Rivest 在1990 年设计的,MD 是Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于32 位操作数的位操作来实现的。它的安全性不像RSA那样基于数学假设,尽管Den Boer、Bosselaers 和Dobbertin 很快就用分析和差分成功的攻击了它3轮变换中的2 轮,证明了它并不像期望的那样安全,但它的整个算法并没有真正被破解过,Rivest 也很快进行了改进。

下面是一些MD4散列结果的例子:

MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0

MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24

MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d

MD4 ("message digest") = d9130a8164549fe818874806e1c7014b

MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9

MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 043f8582f241db351ce627e153e7f0e4

MD4 ("123456789012345678901234567890123456789012345678901234567890123456789 01234567890") = e33b4ddc9c38f2199c3e7b164fcc0536

2) MD5

MD5(RFC 1321)是Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与MD4 相同。它较MD4所做的改进是:

1) 加入了第四轮

2) 每一步都有唯一的加法常数;

3) 第二轮中的G函数从((X ∧Y) ∨(X ∧Z) ∨(Y ∧Z)) 变为((X ∧Z) ∨(Y

∧~Z))以减小其对称性;

4) 每一步都加入了前一步的结果,以加快"雪崩效应";

5) 改变了第2轮和第3轮中访问输入子分组的顺序,减小了形式的相似程度;

6) 近似优化了每轮的循环左移位移量,以期加快"雪崩效应",各轮的循环左移都不同。

尽管MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

相关文档
最新文档