密码学hash函数性质

最近在网上想要搜一些密码学原理的内容,但是发现资料真的是比较少。特别是关于hash函数性质方面的。

在此就来补充一下:

一般的hash函数都需要尽量满足以下三点性质:

1.抗原像:已知y属于Y,要找出x属于X,使得h(x)=y是困难的;

2.抗第二原像(弱抗碰撞):已知x属于X, 找出x'属于X,使得h(x')=h(x)是困难的;

3.抗碰撞(强抗碰撞):找出x,x'属于X,使得h(x)=h(x')是困难的;

它们之间的关系: 

1.有抗碰撞性一定可以推得是抗第二原像的。 

proof:假设h是抗碰撞的,但不是抗第二原像的

         选x¡属于X,那么可以找到另一xj,使得h(xi)=h(xj)

         这样,(xi,xj)就是一对碰撞,与假设矛盾。 

2.抗碰撞不能推得抗原像。

proof:反例:g是任意输入,n位输出的抗碰撞hash函数

        定义h(x)= 1 || x       x是n位时

                       0 || g(x)   x不是n位时

此时,h是抗碰撞的,但是不是抗原像的。因为当x输入时n时,肯定可以知道x是什么。 

 

后续: 感觉密码学原理是一门很难的课,但是如果真的能够把书上的那些算法搞清楚的话,那将会是一件非常有成就感并且实用的事情。

         当然其中的很多算法都是数论的知识,比如欧几里得算法,中国剩余定理等。 

这里举个例子吧。比如我们要计算一个这样的式子:x^y mod n,常规的算法是先把x^y算出来,然后mod n,

 但是当x和y都比较大的时候,这样的算法明显就会效率低下。在密码学中,这里给出了一个算法:平方-乘算法

描述如下:

 y = c1 || c2 || …… || ci,其中ci表示y表示成二进制后每位,ci = {0,1}

__int64 z = 1;

for (int num = i, num >= 1, num--)
{
    z 
= (z * z) % n;
    
if (ci == 1)
    {
        z 
= (z * x) % n;
    }
}

return z;

返回的z就是最后的答案。 

 参考资料:《密码学原理与实践》(第二版)

 

posted @ 2009-06-14 15:46  DeMo  阅读(1477)  评论(0)    收藏  举报