变色龙哈希函数Chameleon Hash Functions
一、哈希函数
1.1 哈希函数定义
哈希函数Hash()是密码学中经常用到的一个函数(记住它并不是加密技术,独立于非对称加密和对称加密之外的函数),任意大小的输入消息m 经过哈希函数H ( ) 映射成一个固定长度的输出值h,通常称h 为哈希值或哈希摘要,即 h = H ( m )
1.2 哈希函数性质
具有三个特别重要的性质:
1)单向性:从输入到输出的计算过程较为容易,而由输出值推出输入值是不可能的(计算上几乎不可能实现);
2)抗碰撞性:一般分为弱抗碰撞性和强抗碰撞性(一般很容易搞混,注意区分)
- 弱抗碰撞性:任意给定消息m ,寻找m ′ ( m ′ ≠ m ) 使得H ( m ′ ) = H ( m )在计算上是不可能的;
- 强抗碰撞性:找到任意两个相同哈希值H ( m ) = H ( m ′ ) 的不同消息对( m , m ′ )在计算上是不可能的。
3)高灵敏性:输入若发生非常非常微小的变化(甚至加个标点符号或空格),则输出值会发生巨大的变化(至少一半长的比特位变化)。
一句话概括哈希函数:将任意长度、类型或大小的字符串输入到哈希函数中,输出固定长度的字符串。
1.3 哈希函数存在的问题
如果使用普通的哈希哈希函数,对于基于区块链的版权保护系统而言,可能会有这样一种场景:原作者创作了数字作品之后,并没有将自己的作用上链,而是以其他方式公布到了网上,Evil可能在网上或者其他地方看到这个作品,然后在未经作者的应允的情况下,将作品以自己的身份上链。如果上链成功,此后,当原作者要求改变区块链上该作品的版权的时候,由于区块链的不可篡改性,这时候就难以解决。
因此,我们考虑引入变色龙哈希。
二、 变色龙哈希函数
变色龙哈希函数非常有意思。传统加密哈希函数是很难找到碰撞的。变色龙哈希函数可以人为设下一个“弱点”:掌握了它就能轻松找到碰撞。就好比一扇上锁的门,有对应的钥匙就能通过。
但是有谁吃饱了撑的故意设计弱化的哈希函数呢?这就要涉及到一个伴随因特网自始至终的信任问题,电子签名。传统电子签名过程是先用哈希函数把文件过一遍生成摘要,再用非对称加密里的私钥对摘要进行签名,这样其他人就能用对应的公钥验证文件的哈希有没有变化。如果哈希没变化,那么文件就没被更改。
但是这种设计有它的不足。假设小明和小红达成协议,小明将家族产业10%股份转让给小红。签了合同小名很担心啊,如果小红把这件事告诉别人怎么办?这时候就可以用变色龙函数进行签名。小红生成一个只有她才能找到碰撞的函数交给小明,小明再用这个函数来签电子文档。这下小红把签名后的文件丢给大家也没人相信她了。为什么呢?她掌握着哈希函数的弱点,可以随便生成哈希碰撞啊。她把10%股份改成99%都能保证哈希不会变,进而创造出新文件本来就是小明签的这种假象。因此出自小红之手的文件可信度为零。这个特性叫non-transferability,即两者之间达成的信任不能转到第三方。
“你知道的太多了” 此时此刻成了真正的包袱。
问题来了,小明抵赖怎么破?如果小明死死咬定转让10%股份是小红伪造,事实上只有1%呢?事实上小明也不能信口开河,他得提供对应的证据。证据就是哈希碰撞。假设双方达成的最初合同是A,而小红将其篡改成了相同哈希的A’,那么小明看到A’这份伪证之后一定能拿出最早那个A来并表明A和A’形成哈希碰撞,否则A’就是真货了。因为正常情况下小明无论如何也找不到碰撞,他就不能抵赖。这个特性叫non-repudiation。
-
首先, 变色龙签名具
有不可传递性
: 其合法性只能由签名者所指定的接收者来验证, 而其他任何人都不能确定该签名是由签名者所签的,还是由指定接收者伪造的. -
其次,变色龙签名具有
不可伪造性
: 对于一个伪造的变色龙签名,合法的签名者能够提供证据表明该伪造签名的不合法性. -
再者, 变色龙签名具有
不可否认性
: 对于合法的变色龙签名, 其签名者并不能提供此类证明以开脱责任.
既然变色龙签名能够同时提供不可否认性, 不可伪造性和不可传递性, 所以变色龙签名是一种比较理想的指定验证者签名.
构造变色龙签名的主要工具是变色龙哈希函数. 更具体地讲, 变色龙签名的构造遵循了著名的先哈希再签名的范例(hash-and-sign paradigm), 但是稍有不同.
也就是说, 用来计算消息摘要的是变色龙哈希函数, 而不是普通的哈希函数; 用来计算签名的则是一个安全的数字签名算法.
变色龙哈希函数是一种带陷门的抗碰撞哈希函数: 对于知道其陷门的用户来说, 寻找该哈希函数的碰撞是非常容易的; 而对于不知道其陷门的用户来说, 这种哈希函数与一个标准的哈希函数一样是抗碰撞的.
既然变色龙签名是作用到消息摘要的一个函数, 而此消息摘要又是一个变色龙哈希值, 且陷门属于指定接收者, 所以指定验证者可以把一个变色龙签名变成是其他消息的签名.
2.1 变色龙哈希函数定义
一个变色龙哈希函数由四个部分组成:cham_hash=(Setup,KeyGen,Hash,Forge)
-
Setup(λ ):输入安全性参数λ ,输出公共参数p;
-
KeyGen(p): 输入公共参数p,输出公私钥对(HK,CK),HK为公钥,CK为私钥,又称门限;
-
Hash(HK,m,r):输入公钥HK,消息m和随机数r,输出变色龙的哈希值CH;
-
Forge(CK,m,r,m’):输入私钥CK,消息m,随机数r,消息m’,输出另一个随机数r’,满足CH=Hash(HK,m,r)=Hash(HK,
m’,r’)。
2.2 变色龙哈希函数算法
变色龙哈希函数具有4个主要的算法:
1)密钥生成算法C h _ G e n ( 1^ λ ) = ( p k , s k ) :给定一个安全常数λ ,输出变色龙哈希的公钥pk和私钥sk(陷门);
2)哈希生成算法C h _ H a s h ( p k , m , r ) = ( h , p ) :输入公钥pk 、随机数r 和任意消息m,生成哈希值h 和随机数p;
3)哈希验证算法Ch _ Ver ( pk , m , ( h , p ) ) :输入公钥pk、任意消息m 和哈希值h 、随机数p ,若( h , p )是正确的哈希值,则输出1,否则输出0;
4)哈希碰撞算法Ch _ Cld ( sk , m , m ′ , ( h , p ) ) :输入私钥sk (陷门)、消息m、新消息m ′ 和哈希值h、随机数p ,输出新随机数r ′
使得Ch _ Ver( pk , m , ( h, p ) , r ) = Ch _ Ver ( pk , m ′ , ( h , p ) ,r ′ )=1。
2.3 变色龙哈希安全需求
- 抗碰撞:不存在一个有效算法在输入公钥HK,可以找到(m1,r1)和(m2,r2),其中m1≠m2 ,满足Hash(HK,m1,r1)=
Hash(HK,m2,r2) - 陷门碰撞:存在有效算法,在输入门限CK后,对于任意的m1,r1,给定m2,可以计算出r2,满足Hash(HK,m1,r1)=
Hash(HK,m2,r2)。 - 语义安全:对于任意消息m1 m2,Hash(HK,m1,r1)与
Hash(HK,m2,r2)的概率分布是不可区分的,特别的,当r为随机选择时,从Hash(HK,m,r)无法得到关于m的任何信息。
2.4 变色龙哈希函数分析
相比于传统哈希函数的难以找到碰撞,变色龙哈希可以人为的设一个“弱点”或者“后门”:掌握了这个后门就可以轻松的找到哈希碰撞。
这种设计在一定程度上破坏了哈希函数的两个碰撞性的特点,同时,也破坏了基于哈希函数的区块链的不可篡改的特性,但是也扩大了区块链的应用场景,而且对于不知道门限的普通用户来说,想要找到碰撞依然是不可行的,也就是说,变色龙哈希的安全性也是可以保障的,对于持有“后门”的管理人员,如果其随意篡改区块,也是可以通过验证两个区块的哈希是否相等来验证。
2.5 变色龙哈希函数构造
同传统的密码学算法一样,变色龙哈希也都是基于数学难题的,比如:
- 基于因式分解的变色龙哈希函数的有效构造
- 基于格的变色龙哈希函数的构造
- 基于离散对数的变色龙哈希函数的构造
Hugo Krawczky 和 Tal Rabin 在2000年提出了变色龙哈希方案,具体方案描述如下: