赞
踩
在介绍变色龙哈希函数之前,我们先简单回顾一下经典的哈希函数,这样就能对比它们之间的差别。
哈希函数
H
a
s
h
(
)
Hash( )
Hash()是密码学中经常用到的一个函数(记住它并不是加密技术,独立于非对称加密和对称加密之外的函数),任意大小的输入消息
m
m
m经过哈希函数
H
(
)
H( )
H()映射成一个固定长度的输出值
h
h
h,通常称
h
h
h为哈希值或哈希摘要,即
h
=
H
(
m
)
h=H(m)
h=H(m)具有三个特别重要的性质:
一句话概括哈希函数:将任意长度、类型或大小的字符串输入到哈希函数中,输出固定长度的字符串。
变色龙哈希函数(Chameleon Hash),听名字感觉就很怪,一个哈希函数怎么跟小动物相关呢,一开始我看到这个中文译名也是一样感觉。可以这样理解,变色龙是一种会随着周围环境变化而改变自身颜色的小动物,而哈希函数又是一种只知道输出而无法知道输入的函数,两者结合起来,是否可以理解为变色龙哈希函数的某种情况下知道输出可以推出输入?
定义:任何人可以通过给定的公钥 p k pk pk进行变色龙哈希后,拥有 s k sk sk的用户可以广义地找到哈希碰撞,即使得 C h _ H a s h ( m ′ ) = C h _ H a s h ( m ) Ch\_Hash(m')=Ch\_Hash(m) Ch_Hash(m′)=Ch_Hash(m)。
变色龙哈希函数具有4个主要的算法:
假设 p 、 q p、q p、q为两个素数且 q q q为足够大的素数,其中 p 、 q p、q p、q满足 p = k q + 1 p=kq+1 p=kq+1, Z p ∗ Z^*_p Zp∗是一个阶为 q q q的群, g g g是群的生成元。设陷门 s k sk sk为 x ∈ Z p ∗ x\in Z^*_p x∈Zp∗,则公钥 p k pk pk表示为 y = g x m o d p y=g^x mod\ p y=gxmod p,给定一个消息 m 1 ∈ Z p ∗ m_1 \in Z^*_p m1∈Zp∗和一个随机值 r 1 ∈ Z p ∗ r_1\in Z^*_p r1∈Zp∗,则消息 m 1 m_1 m1的CH值为 H a s h ( m 1 , r 1 ) = g m 1 y r 1 m o d p Hash(m_1,r_1)=g^{m_1} y^{r_1} mod\ p Hash(m1,r1)=gm1yr1mod p。
求任意给定 m 1 、 m 2 、 r 1 m_1、m_2、r_1 m1、m2、r1,能够找到 r 2 ∈ Z p ∗ r_2\in Z^*_p r2∈Zp∗,使得 H a s h ( m 1 , r 1 ) = H a s h ( m 2 , r 2 ) ? Hash(m_1,r_1)=Hash(m_2,r_2)? Hash(m1,r1)=Hash(m2,r2)?
解:
由于 H a s h ( m 1 , r 1 ) = g m 1 y r 1 m o d p = g m 1 + x r 1 m o d p Hash(m_1,r_1)=g^{m_1} y^{r_1} mod\ p = g^{m_1+xr_1} mod\ p Hash(m1,r1)=gm1yr1mod p=gm1+xr1mod p H a s h ( m 2 , r 2 ) = g m 2 y r 2 m o d p = g m 2 + x r 2 m o d p Hash(m_2,r_2)=g^{m_2} y^{r_2} mod\ p = g^{m_2+xr_2} mod\ p Hash(m2,r2)=gm2yr2mod p=gm2+xr2mod p
所以有
r
2
=
m
1
−
m
2
x
+
r
1
m
o
d
p
r_2=\frac{m_1-m_2}x+r_1\ mod\ p
r2=xm1−m2+r1 mod p
相应的代码实现,可以参考大佬写的java实现,见评论区!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。