零知识证明 | 1.什么叫同态隐藏?

2,029 阅读4分钟

所谓零知识证明,指的是在不泄露秘密的前提下,证明我知道这个秘密

举个简单例子,假设我一个月工资2000,我老婆一个月工资3000。我不会把这两个数字透露给你,但是我可以告诉你,我俩每个月的工资加起来是5000。你可以通过某种方式验证我俩的工资加起来确实是5000,但是你没办法反推出来我每个月的工资是多少,我老婆每个月工资是多少。

要做到这一点,需要引入一个概念,叫做同态隐藏。这需要一些数论的知识,不过别担心,我也没有学过数论,所以我会尽可能用简单的语言来解释这个概念。

我们把上面那个问题用数学语言描述一下:已知两个数xy,需要在不泄漏这两个数的前提下,证明x+y=5

要实现这一点,我们需要引入一个同态隐藏函数E(x),该函数满足下面3个条件:

  • 知道E(x)的值,没法反推出x的值。这个很容易理解,如果能反推的话,秘密就暴露了
  • 如果x \neq y,那么E(x) \neq E(y)。也就是说,这是一个单射,或者叫一一映射
  • 如果知道了E(x)E(y),就可以算出E(x+y)。举个例子:E(x+y)=E(x) \cdot E(y)

如果找到了这个同态隐藏函数,问题就简单了:我把E(x)E(y)的值告诉你,你用它们算出E(x+y),然后判断一下是不是等于E(5)就行了。也就是说,把验证x+y=5转化成了验证E(x+y)=E(5)

这个同态隐藏函数,用普通的加减乘除运算是没法实现的,我们需要引入2个新的运算。

1.模p加法

p可以是任意整数,不过为了获得一些特殊性质,p一般取一个素数,比如7。

所谓模p加法,就是加完之后对p取模(除以p取余数)。比如下面的例子:

我们把集合\{0, 1, …, p-1\}跟模p加法运算一起称为一个有限群

集合的元素个数称为有限群的,所以上面是一个7阶有限群。

2.模p乘法

和模p加法类似,模p乘法就是相乘之再对p取模。比如下面的例子:

显然,这也是一个7阶有限群。

另外还有一个有趣的现象,如果让集合\{1,p-1\}中的每个元素对自身不断地做模p乘法(即乘方),观察我标红的那两行:

有没有发现,集合\{1,p-1\}中的每个元素都可以被生成出来(只不过顺序被打乱了)?这种群被称为循环群,元素3或者5称为一个生成元。实际上,所有素数阶的有限群都是循环群。

3.同态隐藏函数

有了上面这些背景知识,我们就可以来寻找同态隐藏函数E(x)了。

在上面的例子里,生成元g\in\{3,5\}。假设我们取3,定义E(x) = g^x|_{modp} = 3^x|_{mod7}

这个E(x)函数是不是真的满足之前提到的3个条件呢?我们来确认一下:

  • 由于生成的元素的顺序是乱的,所以没法根据E(x)反推出x。你可能会说,根据上面那张表不就能反推出来了吗?在实际应用中,p通常是一个很大的素数,比如2^{256}量级的数,所以以目前计算机的计算能力,是没有办法算出完整的表的(术语叫离散对数难题)
  • 如果x \neq y,那么E(x) \neq E(y)。这条是满足的,因为生成元的作用就是生成集合中的每一个元素,从表中的数据也可以看出来
  • 根据E(x)E(y)可以算出E(x+y)。在这个例子里,E(x+y)=E(x) \cdot E(y)。注意这里xy的取值范围是\{0,p-2\},所以这里的的加法是模p-1加法,为了公式简洁没有显式指明。我们来证明一下,根据指数运算法则:E(x+y) = g^{(x+y)|_{mod(p-1)}} = g^x \cdot g^y|_{modp} =  E(x) \cdot E(y)

好了,现在我们有同态隐藏函数了,接下来通过实际的例子加深理解。

我们要保护的秘密是x=2, y=3。我们计算出E(x)E(y),把它们的值提供给验证者:

E(x) = E(2) = 3^2|_{mod7} = 9|_{mod7} = 2

E(y) = E(3) = 3^3|_{mod7} = 27|_{mod7} = 6

验证者验证E(x+y)是否等于E(5)

E(x+y) = E(x) \cdot E(y) = 2 \cdot 6|_{mod 7} = 12|_{mod7} = 5

E(5) = 3^5|_{mod7} = 243|_{mod7} = 5

验证成功!现在验证者可以确认我知道xy的值,并且x+y=5。但是,他并不知道xy的具体值是多少,我们的目的达到了。

总结一下:同态隐藏就是通过一种特殊的映射函数,打乱原始数据的顺序。根据映射值不能反推出原始值,但是映射值之间的关系可以反映原始值之间的关系。