🥑原文:密码学原语如何应用?解析密码学承诺的妙用 - 知乎
1 简介
密码学承诺 涉及 承诺方、验证方 两个参与方,以及以下两个阶段:
- 承诺阶段:承诺方选择一个敏感数据 v v v,为它计算出相应的承诺 c c c,然后将承诺 c c c 发送给验证方。通过使用承诺 c c c,验证方可以确定承诺方对于尚未解密的敏感数据 v v v 只能有一种的解读方式,即承诺方没有办法指鹿为马。
- 揭示阶段:承诺方公布敏感数据 v v v 和用于计算承诺 c c c 的相关参数。验证方重新执行承诺的计算过程,比较新生成的承诺 c ′ c' c′ 与之前接收到的承诺 c c c 是否一致,一致则表示验证成功,否则验证失败。
你没看错,揭示阶段就是直接公布承诺方的敏感数据。个人认为,承诺的作用不在于保护敏感数据的隐私,而在于防止承诺方随意解读这一敏感数据。
一个设计良好的 密码学承诺 具备如下特性:
- 隐藏性:在打开承诺 c c c 之前,验证方不知道承诺方选择的敏感数据 v v v 是什么。
- 绑定性:在承诺 c c c 生成之后,承诺方难以将已承诺的敏感数据解读为另一个不同的数据 v ′ v' v′。
一旦做出承诺,就必须在揭示阶段使用之前已经承诺的敏感数据,否则谎言会被戳穿。
几乎每一篇博客都会重复上述内容,大家常看常新啊😇
2 哈希承诺
哈希承诺是密码学承诺中最简单的一种实现方式。
哈希承诺通过以下公式计算关于敏感数据 v v v 的承诺:
c = H ( v ) c=H(v) c=H(v)
其中 H H H 是一个密码学安全的单向哈希算法。
基于单向哈希的 单向性,难以通过哈希值 H ( v ) H(v) H(v) 反推出敏感数据 v v v,以此提供了一定的 隐藏性;基于单向哈希的 抗碰撞性,难以找到不同的敏感数据 v ′ v' v′ 产生相同的哈希值 H ( v ) H(v) H(v),以此提供了一定的 绑定性。
验证方拿着承诺 c = H ( v ) c=H(v) c=H(v) 却无法反推出敏感数据 v v v,体现了隐藏性;只有使用敏感数据 v v v 才能产生哈希值 H ( v ) H(v) H(v),而其他数据 v ′ v' v′ 却不行,体现了 v v v 和承诺 c = H ( v ) c=H(v) c=H(v) 之间的绑定性。
哈希承诺的 构造简单、使用方便,满足密码学承诺基本的特性,适用于对敏感数据机密性要求不高的应用场景。对敏感数据机密性要求高的应用,需要注意哈希承诺提供的 隐匿性比较有限,不具备随机性。
对于同一敏感数据 v v v, H ( v ) H(v) H(v) 值是固定的。因此可以通过暴力穷举的方法,列举出所有可能的 v v v 值,来反推出 H ( v ) H(v) H(v) 中实际承诺的 v v v。
与其他类型的承诺相比,哈希承诺 不支持在密文形式下的直接运算和交叉验证。这意味着,在某些需要进行复杂密码学协议构造和安全多方计算的场景中,哈希承诺不如其他承诺技术那样有效。
3 Pedersen 承诺
Pedersen 承诺 是目前隐私保护方案中使用广泛的密码学承诺,相比哈希承诺,构造略微复杂,但提供了一系列优异的特性:
- 信息论安全的理论最强隐藏性
- 基于离散对数困难问题的强绑定性
- 具有同态加法特性的密文形式
Pedersen 承诺 的具体构造如下:
其中 g g g 和 h h h 是循环群内的两个生成元, v v v 是敏感数据。
Pedersen 承诺引入了盲因子 r r r,其中 r r r 是一个随机数。这样一来,即便敏感数据 v v v 不变,最终的承诺 c c c 也会随着 r r r 的改变而改变,从而提供了信息论安全的隐藏性。
与此不同,哈希承诺对于同一个 v v v 会产生相同的承诺 H ( v ) H(v) H(v)。
由于 Pedersen 承诺在构造中采用了离散对数运算,因此也具有 加法同态性。
具体来说,两个分别关于 v 1 v_1 v1 和 v 2 v_2 v2 的 Pedersen 承诺 c 1 c_1 c1 和 c 2 c_2 c2 相加,得到的新承诺是关于 v 1 + v 2 v_1+v_2 v1+v2 的 Pedersen 承诺。证明过程非常简单:
c 3 = c 1 + c 2 = C o m m i t ( v 1 , r 1 ) + C o m m i t ( v 2 , r 2 ) = ( v 1 ∗ g + r 1 ∗ h ) + ( v 2 ∗ g + r 2 ∗ h ) = ( v 1 + v 2 ) ∗ g + ( r 1 + r 2 ) ∗ h = C o m m i t ( v 1 + v 2 , r 1 + r 2 ) \begin{alignat}{2} c_3 &= c_1 + c_2 \\ &= Commit(v_1, r_1)+Commit(v_2, r_2) \\ &= (v_1*g+r_1*h)+(v_2*g+r_2*h) \\ &= (v_1+v_2)*g+(r_1+r_2)*h \\ &= Commit(v_1+v_2, r_1+r_2) \end{alignat} c3=c1+c2=Commit(v1,r1)+Commit(v2,r2)=(v1∗g+r1∗h)+(v2∗g+r2∗h)=(v1+v2)∗g+(r1+r2)∗h=Commit(v1+v2,r1+r2)
其中 C o m m i t ( ) Commit() Commit() 代表生成承诺的方法。
Pedersen 承诺还可以用来构造 v 1 ∗ v 2 v_1*v_2 v1∗v2、 v 1 ∣ ∣ v 2 v_1 || v_2 v1∣∣v2 等更复杂的承诺 c 3 c_3 c3,通过基于离散对数的通用零知识证明系统,来证明新承诺 c 3 c_3 c3 满足与原始承诺 c 1 c_1 c1 和 c 2 c_2 c2 之间存在指定的约束关系。
Pedersen 承诺重在承诺,适用于数据所有者向第三方证明承诺中的敏感数据满足一定的约束关系。Pedersen 承诺不直接提供解密功能,不支持需要互不透露敏感数据明文的多方协同计算,这一点与密码学领域的同态加解密算法有很大区别,切勿混淆概念。
4 量子比特承诺
量子比特承诺 是基于量子力学原理构造的比特承诺方案,具体实现可以抽象为一个带随机输入的单向哈希算法。具体构造如下:
根据单向函数的单向性,承诺方向验证方发送 r 1 r_1 r1 和 c c c 后,验证方也无法推知 v v v,满足对 v v v 的隐藏性。根据单向哈希的抗碰撞性,承诺方难以找到 r 2 ′ r_2' r2′ 和 v ′ v' v′,使得 H ( r 1 , r 2 , v ) = H ( r 1 , r 2 ′ , v ′ ) H(r_1 , r_2 , v) = H (r_1 , r_2', v') H(r1,r2,v)=H(r1,r2′,v′),因此承诺方难以违约,满足对 v v v 的绑定性。
不知道为什么需要两个随机数,也不知道为什么要分开发送😇
量子比特承诺的构造看似简单,但其实现需要借助量子协议完成计算,同时也有一定的理论局限性。
早在 1996 年,Hoi-Kwong Lo 和 Hoi Fung Chau 团队、Dominic Mayers 团队分别独立地证明了不存在满足信息论安全的理论最强绑定性的量子比特承诺方案。这个不存在性被称为 MLC no-go 定理。其主要原因是,如果验证方完全没有任何承诺的信息,那么承诺方可以通过 量子纠缠 随意地改变承诺内容,而验证方既不能阻止也不能发现承诺方的违约行为。
这就是为什么要先发一个 r 1 r_1 r1 给验证方吗?
5 量子模糊承诺
后量子密码学承诺的研究尚处于早期阶段,充满了各类挑战,目前难以直接应用到实际业务系统中。除了量子比特承诺之外,基于模糊算法的 量子模糊承诺 也是一类热门研究方向,目标应用领域为生物特征识别相关的隐私安全系统。具体构造如下:
其中, v v v 是敏感数据(如密钥), x x x 是模糊特征(如指纹), f f f 是一个模糊数据恢复算法,当输入值 x ′ x' x′ 接近 x x x 时,输出 v ′ = v v'=v v′=v。
6 总结
本论中,我们重点介绍了 哈希承诺 和 Pedersen 承诺,在往后的文章中,我们还会进一步介绍其他重要的密码学承诺,例如 z k-SNARKs 零知识证明系统中使用的 多项式承诺、向量承诺 等。
怎么还有啊,想鼠😇
对于需要在数据的密文形式上直接进行运算和交叉验证的业务,只要不涉及互不透露数据明文的多方协同计算,相比现有同态加密算法,以 Pedersen 承诺为代表的密码学承诺往往可以提供更好的性能。这一优势与密码学承诺的同态性密不可分,如何构造和应用同态性,敬请关注下文分解。
下文:密码学原语如何应用?解析密文同态性的妙用