密码学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}
for (int num = i, num >= 1, num--)
{
z = (z * z) % n;
if (ci == 1)
{
z = (z * x) % n;
}
}
return z;
返回的z就是最后的答案。
参考资料:《密码学原理与实践》(第二版)

浙公网安备 33010602011771号