累加器的成员证明
成员证明
给定一个集合 s = { x 1 , x 2 , x 3 , . . . , x n } s=\{x_1,x_2,x_3,...,x_n\} s={x1,x2,x3,...,xn},该集合的累加值为 a = g δ a=g^{\delta} a=gδ, δ = H ( x 1 ) H ( x 2 ) H ( x 3 ) ⋅ ⋅ ⋅ H ( x n ) \delta=H(x_1)H(x_2)H(x_3)\cdot\cdot\cdot H(x_n) δ=H(x1)H(x2)H(x3)⋅⋅⋅H(xn),我们要证明一个值 x x x 是包含在集合 s s s 中,只需要提供两个元素:一个是目标元素 x x x 本身,另一个是 a ′ = g δ ′ a'=g^{\delta'} a′=gδ′, δ ′ \delta' δ′ 是集合中所有非 x x x 元素的 hash value 的累乘法。那么这里的 proof 即为 ( { a ′ , x } ) (\{a',x\}) ({a′,x}),验证过程为: a ′ H ( x ) = ? a a'^{H(x)}\overset{?}{=}a a′H(x)=?a
非成员证明
我们怎么证明元素 x x x 并不在集合 s = { x 1 , x 2 , x 3 , . . . , x n } s=\{x_1,x_2,x_3,...,x_n\} s={x1,x2,x3,...,xn} 中呢? H ( x ) H(x) H(x) 是将 x x x 元素映射到唯一对应的素数,那么我只需要证明 H ( x ) H(x) H(x) 与集合内的所有元素互素(素数与除自己以外的所有其他素数互素,那么就可以进一步转化到问题:证明 x x x 不属于集合 s s s 中的元素,只需要证明 x x x 与所有 δ = H ( x 1 ) H ( x 2 ) H ( x 3 ) ⋅ ⋅ ⋅ H ( x n ) \delta=H(x_1)H(x_2)H(x_3)\cdot\cdot\cdot H(x_n) δ=H(x1)H(x2)H(x3)⋅⋅⋅H(xn) 互素。
在数论中,有一个很重要的定理,整数 a a a 和 b b b 互素的充要条件是存在整数 s s s 和 t t t 使得 s a + t b = 1 sa+tb=1 sa+tb=1,计算 ( s , t ) (s,t) (s,t) 这两个元素可以通过扩展欧几里得除法高效地算出来。那么利用这一定理,我们可以将不在成员证明通过这个式子验证: h H ( x ) a t = ? g h^{H(x)}a^t\overset{?}{=}g hH(x)at=?g,其中 h = g s , a = g δ h=g^s, a=g^\delta h=gs,a=gδ
基于循环群的成员证明和非成员证明的计算复杂度都是 O ( 1 ) O(1) O(1)。
隐藏群的阶
基于循环群的累加器需要隐藏群的阶数,如果群的阶是公开的,那么累加器将变得不安全
如果一个集合
s
s
s 的累加值是
h
h
h,那么我们想伪造一个不属于集合的元素
x
x
x 的成员证明,我们只需要找到一个
f
f
f,使得
f
x
=
h
f^x=h
fx=h,
f
f
f 值可以通过如下计算:
f
=
h
x
−
1
f=h^{x^{-1}}
f=hx−1,由于
x
⋅
x
−
1
m
o
d
q
=
1
x\cdot x^{-1} \mathrm{mod\; q} =1
x⋅x−1modq=1。那么问题就落在如何求得
x
x
x 的逆元
x
−
1
m
o
d
q
x^{-1} \mathrm{mod\; q}
x−1modq?
(
f
x
)
x
−
1
m
o
d
q
=
h
x
−
1
m
o
d
q
({f^{x}})^{x^{-1}} \mathrm{mod \;q} =h^{x^{-1}} \mathrm{mod\;q}
(fx)x−1modq=hx−1modq
在数论中,我们需要使用扩展欧几里得除法,找到
a
a
a 和
b
b
b,使得
a
⋅
x
+
b
⋅
q
=
1
a⋅x+b⋅q=1
a⋅x+b⋅q=1,那么这个
a
a
a 就是
x
x
x 的逆元。
那么我们在使用基于循环群的累加器时,就必须要隐藏群的阶,那么如何生成隐藏群阶的循环群呢?
RSA累加器
我们生成一个基于 RSA 构造的循环群(真子群),给定私钥两个大素数 ( p , q ) (p,q) (p,q),计算公钥 n = p ∗ q n=p*q n=p∗q,素数生成元 g g g, ( p , q , g ) (p,q,g) (p,q,g) 三个数两两互素,则 { g i m o d n } , i ∈ Z \{g^i \mathrm{mod\; n}\}, i \in Z {gimodn},i∈Z 构成一个循环群,在仅公开 n n n 的情况下,我们并不知道这个循环群的阶是多少,这就可以隐藏群的阶。但是基于 RSA 的循环群的生成,需要 trusted setup,也就是参数 n n n 必须要一个可信第三方生成,如果私钥 p p p 和 q q q 遭到了泄露,累加器将不再安全。
我们凝练上述的伪造成员证明方法:给定一个群元素 h h h,只要找到一个群元素 f f f 和一个素数 x x x 是的 f x = h f^x=h fx=h。
这里我们需要使用到欧拉函数 ϕ ( n ) = ( p − 1 ) ( q − 1 ) \phi(n)=(p-1)(q-1) ϕ(n)=(p−1)(q−1), ϕ ( n ) \phi(n) ϕ(n) 是值小于或等于 n n n 的正整数与 n n n 互素的个数。且,如果正整数 a a a 和正整数 m m m 互素,那么 a ϕ ( m ) ≡ 1 m o d m a^{\phi(m)}\equiv 1\mathrm{mod \; m} aϕ(m)≡1modm
我们可以找到一个三元组 ( k , x , z ) (k,x,z) (k,x,z) 使得 k ϕ ( n ) + 1 = x z k\phi(n)+1=xz kϕ(n)+1=xz,我们可以得到伪造非成员 x x x 的证明: ( f = h z , x ) (f=h^z,x) (f=hz,x),那么我们有 f x = h x z = h ϕ ( n ) + 1 = h m o d n f^x=h^{xz}=h^{\phi(n)+1}=h\mathrm{\;mod \;n} fx=hxz=hϕ(n)+1=hmodn。
strong RSA assumption
Cryptographic Accumulator 密码学累加器 – 区块链中的成员证明与非成员证明