大宝自习室

道路就在脚下

杂凑函数简单介绍

| 评论

经过一段时间的学习TLS/SSL标准文档,比对着开源SSL实现库PolarSSL源代码的学习,一下做一些简单的记录。

在以前的博文中简单介绍了TLS/SSL的协议流程,在这篇博客中就不再赘述了。本文就主要针对开源库中对TLS/SSL协议的实现来进行简单的一些记录,方便自己和有些读者的查阅。
源代码的记录安排如下:

  1. 哈希算法族的介绍;
  2. 伪随机数发生器的介绍;
  3. 对称算法组的介绍;
  4. 非对称算法的介绍;
  5. TLS/SSL实现介绍;
    初步预期按照上述的安排来尽量详细的介绍实现细节。但中途额外的内容也是有可能出现的。而且这些内容不可能用一篇博客都能够讲完的,至于需要安排几篇,这个看介绍的详细程度和代码难易度吧。初步安排每个安排对应2~3篇博文。

这篇博客首先来介绍哈希函数族的实现。

哈希算法,也可以叫做摘要函数,与数据结构中的哈希(散列)表、java类中求某个实例的哈希是不一样的。这个地方的哈希算法从数学的角度看它其实是一种映射,请看下述:
f: msg —-> f(msg)
msg是任意长度的消息值,比如字符串"abc”,某个word文件或者某个软件的安装文件等。f(msg)就是讲这个消息值输入到摘要算法中,按照摘要算法的流程执行,计算出消息值msg的摘要f(msg)。
由于msg是任意长度消息,其取值空间为无穷大;而f(msg)对某个确定性的摘要算法来说,其长度是固定的,例如MD5返回的是128bit摘要值,SM3返回的是256bit摘要值,SHA512则返回512bit长度的摘要值。因此,对于f这个函数来说,其值域是有限固定的。从数学的意义上来讲,一个映射将无穷个元素映射到有限个,显而易见,至少有一个元素对应着无穷多个原像,即这个映射是多对一的映射。
f(msg_1) = f(msg)
f(msg_2) = f(msg)
……无穷多个……
根据密码学中"优良"哈希函数的定义,它需要满足一下三个条件:

  1. 单向性,也称抗原像形。对任意给定的b,去寻找a,s.t. f(a) = b是不可能实现的;
  2. 抗弱碰撞性,也称抗第二原像性。对于任意给定的a,不可能在计算上找到c,s.t. f(a) = f(c)
  3. 抗强碰撞性,选择任意的a、c,能够 s.t. f(a) = f(c)是计算上不能实现的。
    当然"优良"的哈希函数还有另外一条要求,这个要求是效率上的要求,就是哈希函数无论在硬件上还是软件实现都要求效率非常高,运算速度快。这个不属于哈希函数安全上的需要。

常用的哈希
1.MD5及MD4、MD3、MD2等
几年前,我国学者王小云教授发线了MD5的碰撞,使得MD这一系列的哈希算法越来越不满足当今和以后的安全需要。根据越来越强大的计算机处理能力和最新的科研成果,MD族函数的安全性也越来越低。但还不至于像曾近某些媒体吹嘘的那么不堪,至少现今还远远不能对任意的哈希值求出其原像出来。 但为了系统的健壮和安全,推荐使用更长的哈希算法。

2.SHA1及SHA256、SHA512等
这个其实算法跟MD5类似,实现起来也比较容易。区别在于摘要值的当度比MD5要长,因此想找到碰撞当然也更加困难。

3.SM3
SM3是我国商密的标准,从创新性上来说并不大。跟上面的几个算法很是类似,是国家密码管理局搞的国家标准。

4.SHA-3
这个可能不是很常用。确实,这个算法是美国NIST于2012年公布的新一代的密码哈希算法。经过历时5年的征选过程,最终Keccak成为胜利者,成为了SHA-3。至今,这个算法使用的范围不广。

哈希算法简单介绍就这么多,至于想更深入的了解,可以查看《应用密码学手册》、《程序员密码学》等参考书籍和论文等。下面的一篇博客开始介绍在PolarSSL中摘要族算法的实现。

评论