更新:由于这篇文章的内容大部分是我的脑洞,所以我不能确保正确性,目前我已经把文章设为隐藏状态,如果你碰巧访问到这篇文章,请自行辨识内容的正确性。
PS:关于非交互承诺方案的一些更严谨的内容目前被写在了我的硕士论文中,在我大论文完成后我也会公开这些内容,所以,别急(
以下是正文:
最近在搞的Commitment,卡壳了,写个笔记整理下思路。
这一篇会讲普通的Commitment,还有更复杂的UC Commitment以后有机会再补(逃
另外,以下某些结论是我突然拍脑袋想出来的,所以有错也很正常,欢迎纠错
定义与安全定义·
简介——承诺和打开·
承诺方案(Commitment)如其名是在模拟一个承诺的过程,举个栗子,我要给你某个值(比如我银行卡密码,我也不知道为什么要给密码),但不能现在给(不然钱就被你拿走了),所以就先给你做个承诺,说我密码一定是123456(但是做承诺时不能暴露我的密码),等过了一段时间后(比如我把钱全拿出来了),再给你打开承诺(即把我密码123456发给你),你一看,这密码和我之前的承诺对上了,说明我没有骗你,一看对不上,就说明我撒谎了。
以上栗子由于是个生活中的栗子,所以会比较含糊,比如,“我”要怎么做到承诺但是不暴露我的密码呢?“你”又怎么做到根据“我”的承诺判断我密码真的是123456呢?“我”能不能做假的承诺来骗“你”呢?“你”又能不能从“我”的承诺中提取出“我”的密码呢?所以严格来说还需要一个具体的安全定义,比如定义一些安全属性。
说安全定义之前先要知道承诺方案的过程,如上面栗子加粗的,有承诺(Commit)和承诺打开(Open)两个阶段。习惯上会把承诺的信息记作m;承诺时需要的随机数记作r;承诺阶段会输出一个承诺值和打开值(反正英文时opening value),分别记作c和d。承诺打开阶段执行完后会输出接受或拒绝(Accept/Reject),以表示c真的或假的承诺了m。通常做承诺的那一方被叫作承诺方(Committer)打开承诺的一方叫作接收方(Receiver)。形式上这两个阶段是(这里画图更像非交互的承诺方案,实际上Commit和Open时是可以承诺方与接收方有多轮交互的):
Committer(m)(c,d)←Commit(m,r)⋮ ⟶c⟶m, dReceiverOpen(c,m,d)→Accept/Reject
安全定义——绑定和隐藏·
接下来是安全定义,承诺方案需要满足两个安全属性:绑定(Binding)和隐藏(Hiding)。Binding即Commit承诺出来的c绑定了m,承诺方不能用另一个m′=m使得接收方在Open时输出Accept,主要针对不诚实的承诺方;Hiding即c隐藏了m,接收方收到c后,不能根据c恢复出m,主要针对不诚实的接收方。承诺方案的安全定义我翻了很多论文其实都没有详细说的,所以下面套一下wiki的定义:
- Binding:不存在m′=m,使得Commit(m,r)=Commit(m′,r′)。
- Hiding:令R是所有随机数的集合,对于所有m′=m,都有{Commit(m,R)}≡{Commit(m′,R)}。
对于Binding属性,个人感觉现在的定义应该更像是:给定(c,d)←Commit(m,r),不存在m′=m和d′,使得Open(c,m′,d′)=Accept(即上面的中文描述)。而对于上面的定义,感觉上是一些古老的Commitment方法(比如[DN02],另外这里用等号表示Commit出的c,懒得写d了-)在Open时直接检测c=?Commit(m,r),而不存在m′=m,使得Commit(m,r)=Commit(m′,r′)就不存在m′使得Open输出Accept了。而对于现在各种Open花里胡哨的Commitment,“不存在m′=m,使得Commit(m,r)=Commit(m′,r′)”感觉只是个必要条件,而不充分(个人感觉),不过如果Open设计的好的话估计也可以做到充分(吧
对于Hiding属性,{Commit(m,R)}≡{Commit(m′,R)}的意思是,对于所有m′=m,拿所有的ri∈R分别跟m和m′做Commit后,它们的结果的集合相同,即给定一个c,它有可能由任意一个mi∈M承诺出来的(这里的M指明文空间),所以知道了c也不会泄露m的任何信息。
上述的Binding和Hiding定义中,其实还有安全性的强弱之分的。如果Binding定义中的“不存在”是真的不存在,那就是完美绑定(Perfectly Binding),即即使攻击者具有无限的能力(Unbounded,比如可以遍历整个明文空间M,之类的)也不能找到两个承诺值相同的消息;如果只是计算上的不存在,那就是计算上的绑定(Computational Binding),即可能存在m′=m,使得Commit(m,r)=Commit(m′,r′),但是不能在多项式时间内计算出来(但是Unbounded的攻击者可以找到)。类似地,如果Hiding定义中的“≡”是真的相等,那就是完美隐藏(Perfectly Hiding),即Unbounded的攻击者也不能根据c恢复m;如果“≡”是计算上的相等(即≡c),那就是计算上的隐藏(Computational Hiding),即不能在多项式时间内恢复m(同样,Unbounded的可以)。(PS:不知道以后会不会弄出个Quantum Binding / Quantum Hiding,逃
Perfect的安全性显然比Computational的高,但坏消息是,Binding和Hiding是不能同时做到Perfect的,这个可以简单从定义上推出,即不存在m′=m,使得Commit(m,r)=Commit(m′,r′)的话,就不会有{Commit(m,R)}≡{Commit(m′,R)};相似地,若对于所有m′=m,都有{Commit(m,R)}≡{Commit(m′,R)},即会存在m′=m,使得Commit(m,r)=Commit(m′,r′)。也可参考这里。
后门——提取和模棱两可·
提取和模棱两可是一些后门属性,主要用于UC的Commitment方案证明中(深入了解的可参考[CF01])。
- 提取(extractability)即在知道某个后门的情况下可以从c提取出m;
- 模棱两可(equivocality)即在知道某个后门的情况下根据m,r,m′=m可以计算出r′使得c是m′的承诺,让接收方Open时由c=Commit(m,r)接受m′。
首先说一下这个后门(Trapdoor),其实可以看成是某个私钥,即会有一个生成函数KeyGen→(pk,td)生成一对公私钥,这个私钥td可以看作是一个后门,上面说的Commit和Open都会输入公钥pk并使用pk进行承诺和承诺打开,即应该写为Commitpk(m,r)和Openpk(c,m,d)。咋一看留个后门好像会影响安全性,但其实在UCCom中KeyGen是由一个可信第三方调用的,所以承诺方和接收方都不知道td,而td也并不能在多项式时间内被计算出来。由于翻了好几篇论文都没有找到准确的形式化定义,所以下面我就自己编几个了(以后找到的话再补,留坑):
- 密钥生成:KeyGen(1k)→(pk,td),这里的1k是安全参数;
- 提取:(c,d)←Commitpk(m,r),则Extratd(c)→m;
- 模棱两可:(c,d)←Commitpk(m,r),给定m′=m,则Equivtd(m,r,m′)→(r′,d′),使得(c,d′)←Commitpk(m′,r′)且Open(c,m′,d′)=Accept。(PS:其实很多文章都是说输出r′的,不过套我这上一节的定义的话这里是d′,感觉输出d′更加广义,输出r′是d′=r′时的一种特殊情况)。
上面也说了,td需要“不能在多项式时间内被计算出来”,也就是Unbounded的攻击者其实是可以计算出td的,而很明显Extractability和Hiding是冲突的,Equivocality和Binding是冲突的。如果存在提取的后门的话,Unbounded的攻击者就可算出这个后门,然后攻破Hiding属性;同样如果存在模棱两可的后门的话,Unbounded的攻击者就可算出这个后门然后攻破Binding属性。所以若Perfectly Binding则没有Equivocality;若Perfectly Hiding则没有Extractability。
更进一步,其实是:有了Perfectly Binding才有Extractability;有了Perfectly Hiding才有Equivocality。简单来说,反证法:如果存在m′=m,使得Commitpk(m,r)=Commitpk(m′,r′)的话,Extratd(c)出来就有m和m′两种可能,而且不能知道哪一个才是真正的消息,所以就不能提取了,所以要能提取则必不存在这样的m′=m,即Perfectly Binding;如果存在m′=m,使得{Commitpk(m,R)}={Commitpk(m′,R)},则存在某个c落在其中一个集合中且不落在另一个集合中,不妨设c=Commitpk(m,r)(即c∈{Commitpk(m,R)}且c∈/{Commitpk(m′,R)}),则对于m′,不存在r′∈R使得Commitpk(m,r)=Commitpk(m′,r′),也就不能模棱两可了,所以要能模棱两可则不存在这样的m′=m,即Perfectly Hiding。
从函数性质的角度看·
上面的定义始终是个定义,直接从定义入手构造一个Commitment的话似乎有点难,所以看看从映射(或者说函数性质,比如单射、满射)上出发会怎么样,即看看要满足Binding和Hiding属性需要满足怎样的函数性质。
单射->Perfectly Binding?·
看一下Binding的定义,“不存在m′=m,使得Commit(m,r)=Commit(m′,r′)”,换一种方式写就是“∀m,m′∈M,m′=m⇒Commit(m,r)=Commit(m′,r′)”,即单射的定义?(上面提了这好像不是Binding的充要条件,但至少是个必要条件,即要Perfectly Binding的话至少要符合这个条件)
不同点在于Commit的输入有两个,这可以直接把输入看作一个元组(Tuple),那就是单输入了,或者可以换个看法,把Commit看成一个函数簇,不同的r即从这个函数簇中选出不同的Commitr,如果可以构造出每个Commitr(m)是单射的,而且每个{Commitr(M)}不相交(也就是一个划分),即可以构造出单射的Commit(m,r)。形式化:
- ∀r,∀m,m′∈M,m=m′⇒Commitr(m)=Commitr(m′);
- $\forall r, r’ \in \mathcal{R}, r \ne r’ \Rightarrow {\rm{Commit_r(\mathcal{M})}} \cap {\rm{Commit_{r’}(\mathcal{M})}} = \empty $。
简单证明一下,第二点可以推出,若有Commit(m,r)=Commit(m′,r′),由于两个集合无交集,则r=r′,也即只能Commit(m,r)=Commit(m′,r);第一点把r移回括号中,推出若Commit(m,r)=Commit(m′,r),则m=m′,也即只能Commit(m,r)=Commit(m,r)。综上,对于所有m,m′=m∈M,不存在r,r′∈R,使得Commit(m,r)=Commit(m′,r′)。
(PS:当然,如果看成是Commitm的函数簇也是可以的,反正最后给不同的(m,r)可以射到不同的点就好了。另挖坑有空补个图)
用函数簇定义的话,首先第一点的单射函数是比较容易构造的,比较麻烦的是第二点的划分。对于划分,如果是Commitr的函数簇的话,可以用一个“绑定”的操作绑定r,即不能让承诺方选择其他的r′,假设这个操作是Bind(r)的话,从定义上只需要Bind是一个单射函数就可以了。类似地如果是Commitm的话,就是Bind(m)。假设F∗是一个单射函数(准确地,为了有Hiding,还应该是一个One-way Function,Bind(r)同),则可以粗略地构造出一种Perfectly Binding的协议:
Committer(m)r←$Rc=Fr(m)b=Bind(r)⋮ ⟶b, c⟶m, rReceiverb=?Bind(r)c=?Fr(m)
证明也挺直观,Bind是单射的所以承诺方不能用别的Fr′,Fr是单射的所以承诺方也不能用别的m′,具体证明略。以上换成Fm和Bind(m)也是类似的,就不多画一个图了,而且感觉上Bind(r)好像会更合理一点。
满射->Perfect Hiding?·
同样,看一下Hiding的定义,“对于所有m′=m,都有{Commit(m,R)}≡{Commit(m′,R)}”,也同样把Commit看成一个函数簇,每个m取出一个函数Commitm(r),设{Commit(M,R)}=C,即C是所有承诺c的集合,若对于所有的m∈M都有Commitm(r)满射到C,不就很自然地对于所有m′=m,有{Commit(m,R)}≡{Commit(m′,R)}?形式化:
- ∀m∈M,{Commitm(R)}=C。
或者更准确地:
- ∀m∈M,∀c∈C,∃r∈R,s.t.Commitm(r)=c。
显然对于所有mi,mj∈M,都有{Commitmi(R)}={Commitmj(R)}=C,自然就是Perfectly hiding了。更进一步,还可以证明只有符合这个性质的才能做到Perfect Hiding:假设存在某个m使得Commitm不是满射到C,则存在某个m′∈M和r′∈R,使得Commitm′(r′)=c′且c′∈/{Commitm(R)}(即必存在c′∈(C−{Commitm(R)})⊆C ,这个c′就是Commitm没射到的那个),则c′∈({Commitm′(R)}−{Commitm(R)})=∅,也即{Commit(m′,R)}={Commit(m,R)},和Perfect Hiding的定义冲突。
所以如果存在这样的函数簇的话,Perfect Hiding的Commitment(好像)也挺好构造。假设F就是这样的函数簇,粗略地构造个Perfect Hiding的协议:
Committer(m)r←$Rc=Fm(r)⋮ ⟶c⟶m, rReceiverc=?Fm(r)
Hiding的证明在上面分析的基础上其实是显然的,但是这时Binding就没这么显然了(或者说其实这样构造的话根本没有Binding?)
另外,根据上一章的结论,也可推出Equivocality,证明类似,略。
OWF->Computational?·
OWF即上面提到过的One-way Function,简单来说是一类正向求解容易,逆向求解困难的函数,准确点说则是:在多项式时间内求出伪逆(Pseudo-inverse)的概率可以忽略(换句话说就是计算上不可能),以下摘抄了wiki上的定义。
简单论述以下,现在假设Commitr∗是一个OWF,假设攻击者可以攻破Computational Hiding,即可以算出Commitr(m)的逆(伪逆包含了逆),也就攻破了这个OWF,由于OWF不能被Computational地被攻破,所以Hiding也不能被Computational地被攻破(一种规约,但攻击者其实只用算出m而不用算出r,好像不好证)。
类似地,假设Commitm∗是一个OWF,假设攻击者可以攻破Computational Binding,则给定c=Commitm(r)和m′=m,攻击者可以找到一个r′,使得Commitm′(r′)=c,即找到Commitm′的一个逆,从而攻破OWF。不过由于攻击者可以知道m和r,也就是多了额外的信息,所以似乎是还不能直接规约到OWF,这里先留个坑(逃
而且用OWF的话还有个问题是,原项的取值需要足够的多,不然若攻击者可以遍历所有原项,就自然可以找到逆了,所以像bit Commitment就不能用OWF了(应该)。
这里的TF指后门函数(Trapdoor Function),即在OWF的基础上多了个后门,在知道后门的情况下可以有效地求解出逆(或伪逆),大概意思是(符号我乱取的- -):
- (pk,td)←TFGen(1k);
- y=TFInverttd(TFpk(x)),其中TFpk(x)=TFpk(y) 。
结合上一节,如果上一节能证的话(如果),若Commitr∗(m)是TF的话,则可通过后门提取m;若Commitm∗(r)是TF的话,则可根据Commitm′(r′)=Commitm(r)提取r′。
其中,需要TF是双射是因为,提取是需要提取出的是真正的逆而不是伪逆,所以需要单射;模棱两可时需要Commitm(r)能被Commitm′映射到,所以需要满射。
当然,目前只是一个想法,有可能下一版更新就删掉了(逃
我瞎编的栗子·
根据上面的思路,编了两个栗子:
Perfect Hinding 的栗子·
Committer(m)r←$Rc=Perm(TFpk(r))⋮ ⟶c⟶m, rReceiverc=?Perm(TFpk(r))
其中,TFpk:R→T是一个双射的Trapdoor Function;Per是一个排列(Permutation)簇(或者说一个双射函数,也行?),由m∗选择出一个排列Perm∗:T→C,假设存在有效算法PerInvertm∗可求出这个排列的逆(排列是双射,所以存在逆)。下面简要证明:
- Perfect Hiding:简单转换一下可得Commit(m,R)=Perm(TFpk(R)),由于TFpk双射,即Commit(m,R)=Perm(T),由于排列肯定双射,即Commit(m,R)=C,所以对于所有m′=m,都有{Commit(m,R)}≡{Commit(m′,R)}=C;
- Computational Binding:假设给定(m,r)和足够随机(反正m′攻击者不可控,应该也合理?)的m′=m,攻击者可以找到r′使得Commit(m′,r′)=Commit(m,r),即使得Perm′(TFpk(r′))=Perm(TFpk(r)),即使得r′=TFpk−1(Perm′−1(Perm(TFpk(r)))),由于m′足够随机,即Perm′−1(Perm(TFpk(r)))足够随机,攻击者在不知道trapdoor的情况下对一个Trapdoor Function求一个足够随机的数的逆,计算上不可能;
- Equivocality:与Binding的证明类似,但模拟者可以知道td,也即可以通过r′=TFInverttd−1(PerInvertm′(Perm(TFpk(r))))求得r′实现模棱两可。由于TF是双射的,所以总能求得这样的r′。
(PS:不好实例化。。。)
Perfect Binding的栗子·
Committer(m)r←$Rc=m⨁rb=Bindpk(r)⋮ ⟶b, c⟶m, rReceiverb=?Bindpk(r)c=?m⨁r
其中,⨁是异或(或者某种pad?);Bindpk是单射的Trapdoor Function,存在BindInverttd高效求逆。下面简要证明:
- Perfect Binding:由于Bindpk单射,Bindpk(r)=Bindpk(r′)⇒r=r′,所以不存在r′=r,使得b=?Bindpk(r)通过;假设存在m′=m使得c=m⨁r=m′⨁r,则m=m′=c⨁r,矛盾,所以不存在m′=m使得c=?m⨁r通过;综上,不存在m′=m使得Open时输出Accept。
- Computational Hiding:假设攻击者可以根据b和c算出m,则可以算出r=c⨁m从而在没有td的情况下根据b=Bindpk(r)算出r,规约到TF上计算不可能;
- Extractability:给定b和c,模拟这可以使用td计算出r=BindInverttd(b),然后m=c⨁r。
比较著名的栗子·
Perfect Hiding的Pedersen Commitment:
Perfect Binding的ElGamal Commitment:
[CF01] Canetti R, Fischlin M. Universally composable commitments[C]//Annual International Cryptology Conference. Springer, Berlin, Heidelberg, 2001: 19-40.
[DN02] Damgård I, Nielsen J B. Perfect hiding and perfect binding universally composable commitment schemes with constant expansion factor[C]//Annual International Cryptology Conference. Springer, Berlin, Heidelberg, 2002: 581-596.
… …