所谓零知识证明,指的是在不泄露秘密的前提下,证明我知道这个秘密。
举个简单例子,假设我一个月工资2000,我老婆一个月工资3000。我不会把这两个数字透露给你,但是我可以告诉你,我俩每个月的工资加起来是5000。你可以通过某种方式验证我俩的工资加起来确实是5000,但是你没办法反推出来我每个月的工资是多少,我老婆每个月工资是多少。
要做到这一点,需要引入一个概念,叫做同态隐藏。这需要一些数论的知识,不过别担心,我也没有学过数论,所以我会尽可能用简单的语言来解释这个概念。
我们把上面那个问题用数学语言描述一下:已知两个数 x x x和 y y y,需要在不泄漏这两个数的前提下,证明 x + y = 5 x+y=5 x+y=5。
要实现这一点,我们需要引入一个同态隐藏函数 E ( x ) E(x) E(x),该函数满足下面3个条件:
- 知道 E ( x ) E(x) E(x)的值,没法反推出 x x x的值。这个很容易理解,如果能反推的话,秘密就暴露了
- 如果 x ≠ y x \neq y x̸=y,那么 E ( x ) ≠ E ( y ) E(x) \neq E(y) E(x)̸=E(y)。也就是说,这是一个单射,或者叫一一映射
- 如果知道了 E ( x ) E(x) E(x)和 E ( y ) E(y) E(y),就可以算出 E ( x + y ) E(x+y) E(x+y)。举个例子: E ( x + y ) = E ( x ) ⋅ E ( y ) E(x+y)=E(x) \cdot E(y) E(x+y)=E(x)⋅E(y)
如果找到了这个同态隐藏函数,问题就简单了:我把 E ( x ) E(x) E(x)跟 E ( y ) E(y) E(y)的值告诉你,你用它们算出 E ( x + y ) E(x+y) E(x+y),然后判断一下是不是等于 E ( 5 ) E(5) E(5)就行了。也就是说,把验证 x + y = 5 x+y=5 x+y=5转化成了验证 E ( x + y ) = E ( 5 ) E(x+y)=E(5) E(x+y)=E(5)。
这个同态隐藏函数,用普通的加减乘除运算是没法实现的,我们需要引入2个新的运算。
1.模p加法
p可以是任意整数,不过为了获得一些特殊性质,p一般取一个素数,比如7。
所谓模p加法,就是加完之后对p取模(除以p取余数)。比如下面的例子:
x x x | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|