🥑原文: 承诺方案(Commitment)学习笔记
🥑写在前面: 本文属搬运博客,自己留存学习。本文只会讲承诺的两个安全属性,不会再讲解承诺的定义。
正文
承诺方案需要满足两个安全属性:绑定、隐藏。
- 绑定属性: 是指承诺 c c c 绑定了消息 m m m。承诺方不能用假消息 m ′ ≠ m m' \ne m m′=m 使得接收方在揭示时输出接受。绑定属性 主要针对不诚实的承诺方。
- 隐藏属性: 是指承诺 c c c 隐藏了消息 m m m。接收方收到 c c c 后,不能根据 c c c 恢复出 m m m。隐藏属性 主要针对不诚实的接收方。
承诺方案的安全定义我翻了很多论文其实都没有详细说的,所以下面给出 WIKI 的定义:
- 绑定属性: 不存在 m ′ ≠ m m' \ne m m′=m,使得 C o m m i t ( m , r ) = C o m m i t ( m ′ , r ′ ) \rm{Commit}(m, r)=\rm{Commit}(m', r') Commit(m,r)=Commit(m′,r′)。
- 隐藏属性: 令 R \mathcal{R} R 是所有随机数的集合,对于所有 m ′ ≠ m m' \ne m m′=m,都有 { C o m m i t ( m , R ) } ≡ { C o m m i t ( m ′ , R ) } \{\rm{Commit}(m, \mathcal{R})\} \equiv \{\rm{Commit}(m', \mathcal{R})\} {Commit(m,R)}≡{Commit(m′,R)}。
C o m m i t ( ) Commit() Commit() 代表生成承诺的方法。看不懂没关系,原博接着就会细讲。
1 绑定的定义
对于绑定,个人感觉现在的定义应该更像是:
给定 ( c , d ) ← C o m m i t ( m , r ) (c, d) \leftarrow \rm{Commit}(m, r) (c,d)←Commit(m,r),不存在 m ′ ≠ m m' \ne m m′=m 和 d ′ d' d′,使得 O p e n ( c , m ′ , d ′ ) = A c c e p t \rm{Open}(c, m', d')=\rm{Accept} Open(c,m′,d′)=Accept。
其中, c c c 和 d d d 分别代表承诺值和揭示值。
个人理解:在我之前看到的一些基础承诺方案中,使用的揭示值显然就是 ( m , r ) (m,r) (m,r)。但在某些情况下,承诺方可能不希望揭示消息的明文 m m m。因此,承诺方在揭示阶段给接收方一个 d d d 值,即所谓的揭示值,通过零知识证明来告诉接收方它刚刚传的确实是消息 m m m。
而对于上面的定义,感觉上是一些古老的承诺方案,比如 [DN02]。
在这些古老的承诺方案中,接收方在揭示阶段直接检测:
c = ? C o m m i t ( m , r ) c \overset{?}{=} \rm{Commit}(m, r) c=?Commit(m,r)
只要不存在 m ′ ≠ m m' \ne m m′=m,使得 C o m m i t ( m , r ) = C o m m i t ( m ′ , r ′ ) \rm{Commit}(m, r)=\rm{Commit}(m', r') Commit(m,r)=Commit(m′,r′),就不存在 m ′ m' m′ 使得揭示阶段输出接受。
而对于现在各种花里胡哨的承诺方案,"不存在 m ′ ≠ m m' \ne m m′=m,使得 C o m m i t ( m , r ) = C o m m i t ( m ′ , r ′ ) \rm{Commit}(m, r)=\rm{Commit}(m', r') Commit(m,r)=Commit(m′,r′)" 感觉只是个必要而不充分条件,不过如果揭示阶段设计得好的话估计也可以做到必要充分吧。
2 隐藏的定义
对于隐藏, { C o m m i t ( m , R ) } ≡ { C o m m i t ( m ′ , R ) } \{\rm{Commit}(m, \mathcal{R})\} \equiv \{\rm{Commit}(m', \mathcal{R})\} {Commit(m,R)}≡{Commit(m′,R)}的意思是:
对于所有 m ′ ≠ m m' \ne m m′=m,拿所有的随机数 r i ∈ R r_i \in \mathcal{R} ri∈R 分别跟 m m m 和 m ′ m' m′ 生成承诺,它们结果的集合相同。换句话说,给定一个承诺值 c c c,它有可能由任意一个 m i ∈ M m_i \in \mathcal{M} mi∈M 承诺出来的,其中 M \mathcal{M} M 是指明文空间。所以知道了 c c c 也不会泄露 m m m 的任何信息。
个人理解:对于消息 m m m,假设 m m m 和所有随机数 r i r_i ri 生成的承诺值 c = C o m m i t ( m , r i ) c=Commit(m,r_i) c=Commit(m,ri) 的集合为 C \mathcal{C} C。那么对于消息 m ′ ≠ m m' \ne m m′=m, m ′ m' m′ 和所有随机数 r i r_i ri 生成的承诺值 c = C o m m i t ( m ′ , r i ) c=Commit(m',r_i) c=Commit(m′,ri) 的集合等于 C \mathcal{C} C。因此,对于集合 C \mathcal{C} C 中的一个 c c c 值,任何一个 m m m 都能生成它。
下面是本人画的示意图,但不知道对不对:
上图表示, m i ∈ M m_i \in \mathcal{M} mi∈M 和所有随机数 r i ∈ R r_i \in \mathcal{R} ri∈R 生成的承诺值 c i = C o m m i t ( m i , r i ) c_i=Commit(m_i,r_i) ci=Commit(mi,ri) 构成集合 C \mathcal{C} C。蓝线和红线表示,不同的消息 m m m 和 m ′ m' m′,与不同的随机数 r r r 和 r ′ r' r′,能够生成相同的承诺 c c c。
这里我把随机数和承诺值的个数画成了一样的。因为我觉得,一个消息 m m m 和不同的随机数 r r r 生成的 c c c 应该不会存在重复的情况吧?所以画成了 r r r 和 c c c 一对一的关系。
3 完美绑定和计算绑定
在上述绑定和隐藏的定义中,其实还有安全性的强弱之分。
如果绑定定义中的 "不存在" 是真的 "不存在",那就是 完美绑定 。也就是说,即使攻击者具有无限计算能力,比如可以遍历整个明文空间 M \mathcal{M} M 之类的,也不能找到两个承诺值相同的消息。
如果只是计算上的 "不存在",那就是 计算绑定 。也就是说,可能存在 m ′ ≠ m m' \ne m m′=m,使得 C o m m i t ( m , r ) = C o m m i t ( m ′ , r ′ ) \rm{Commit}(m, r)=\rm{Commit}(m', r') Commit(m,r)=Commit(m′,r′),但是不能在多项式时间内计算出来。
但是具有无限计算能力的攻击者可以找到这样的 m ′ m' m′。
4 完美隐藏和计算隐藏
如果隐藏定义中的 " ≡ \equiv ≡" 是真的 "相等",那就是 完美隐藏 。也就是说,具有无限计算能力的攻击者也不能根据 c c c 恢复 m m m。
如果 " ≡ \equiv ≡" 只是计算上的 "相等"(即 ≡ c \overset{c}{\equiv} ≡c),那就是 计算隐藏 。也就是说,但是不能在多项式时间内恢复 m m m。
同样地,具有无限计算能力的攻击者可以找到这样的 m ′ m' m′。
5 不可兼得
完美的安全性显然比计算上的安全性高。但坏消息是,绑定和隐藏是不能同时做到完美的。
这个可以简单从定义上推出:
如果不存在 m ′ ≠ m m' \ne m m′=m,使得 C o m m i t ( m , r ) = C o m m i t ( m ′ , r ′ ) \rm{Commit}(m, r)=\rm{Commit}(m', r') Commit(m,r)=Commit(m′,r′),那么就不会有 { C o m m i t ( m , R ) } ≡ { C o m m i t ( m ′ , R ) } \{\rm{Commit}(m, \mathcal{R})\} \equiv \{\rm{Commit}(m', \mathcal{R})\} {Commit(m,R)}≡{Commit(m′,R)}。
个人理解:如果 m ′ m' m′ 和 m m m 能各自生成不同的承诺值,那么它们的承诺值集合 C \mathcal{C} C 必不相同。
下面是本人画的示意图,但不知道对不对:
如上图所示,完美绑定 应该是要求 m 1 m_1 m1 和 m 2 m_2 m2 各自的承诺值集合 C 1 C_1 C1 和 C 2 C_2 C2 毫无交集。
相似地,如果对于所有 m ′ ≠ m m' \ne m m′=m,都有 { C o m m i t ( m , R ) } ≡ { C o m m i t ( m ′ , R ) } \{\rm{Commit}(m, \mathcal{R})\} \equiv \{\rm{Commit}(m', \mathcal{R})\} {Commit(m,R)}≡{Commit(m′,R)},那么就会存在 m ′ ≠ m m' \ne m m′=m,使得 C o m m i t ( m , r ) = C o m m i t ( m ′ , r ′ ) \rm{Commit}(m, r)=\rm{Commit}(m', r') Commit(m,r)=Commit(m′,r′)。
个人理解:同样地,如果 m ′ m' m′ 和 m m m 的承诺值集合 C \mathcal{C} C 相同,那么它们肯定能生成相同的承诺值 c c c,不管它们分别是跟哪个 r i r_i ri 生的。