所谓零知识证明,指的是在不泄露秘密的前提下,证明我知道这个秘密。
举个简单例子,假设我一个月工资2000,我老婆一个月工资3000。我不会把这两个数字透露给你,但是我可以告诉你,我俩每个月的工资加起来是5000。你可以通过某种方式验证我俩的工资加起来确实是5000,但是你没办法反推出来我每个月的工资是多少,我老婆每个月工资是多少。
要做到这一点,需要引入一个概念,叫做同态隐藏。这需要一些数论的知识,不过别担心,我也没有学过数论,所以我会尽可能用简单的语言来解释这个概念。
我们把上面那个问题用数学语言描述一下:已知两个数和,需要在不泄漏这两个数的前提下,证明。
要实现这一点,我们需要引入一个同态隐藏函数,该函数满足下面3个条件:
- 知道的值,没法反推出的值。这个很容易理解,如果能反推的话,秘密就暴露了
- 如果,那么。也就是说,这是一个单射,或者叫一一映射
- 如果知道了和,就可以算出。举个例子:
如果找到了这个同态隐藏函数,问题就简单了:我把跟的值告诉你,你用它们算出,然后判断一下是不是等于就行了。也就是说,把验证转化成了验证。
这个同态隐藏函数,用普通的加减乘除运算是没法实现的,我们需要引入2个新的运算。
1.模p加法
p可以是任意整数,不过为了获得一些特殊性质,p一般取一个素数,比如7。
所谓模p加法,就是加完之后对p取模(除以p取余数)。比如下面的例子:
我们把集合跟模p加法运算一起称为一个有限群。
集合的元素个数称为有限群的阶,所以上面是一个7阶有限群。
2.模p乘法
和模p加法类似,模p乘法就是相乘之再对p取模。比如下面的例子:
显然,这也是一个7阶有限群。
另外还有一个有趣的现象,如果让集合中的每个元素对自身不断地做模p乘法(即乘方),观察我标红的那两行:
有没有发现,集合中的每个元素都可以被生成出来(只不过顺序被打乱了)?这种群被称为循环群,元素3或者5称为一个生成元。实际上,所有素数阶的有限群都是循环群。
3.同态隐藏函数
有了上面这些背景知识,我们就可以来寻找同态隐藏函数了。
在上面的例子里,生成元。假设我们取3,定义。
这个函数是不是真的满足之前提到的3个条件呢?我们来确认一下:
- 由于生成的元素的顺序是乱的,所以没法根据反推出。你可能会说,根据上面那张表不就能反推出来了吗?在实际应用中,p通常是一个很大的素数,比如量级的数,所以以目前计算机的计算能力,是没有办法算出完整的表的(术语叫离散对数难题)
- 如果,那么。这条是满足的,因为生成元的作用就是生成集合中的每一个元素,从表中的数据也可以看出来
- 根据和可以算出。在这个例子里,。注意这里和的取值范围是,所以这里的的加法是模p-1加法,为了公式简洁没有显式指明。我们来证明一下,根据指数运算法则:
好了,现在我们有同态隐藏函数了,接下来通过实际的例子加深理解。
我们要保护的秘密是。我们计算出和,把它们的值提供给验证者:
验证者验证是否等于:
验证成功!现在验证者可以确认我知道跟的值,并且。但是,他并不知道和的具体值是多少,我们的目的达到了。
总结一下:同态隐藏就是通过一种特殊的映射函数,打乱原始数据的顺序。根据映射值不能反推出原始值,但是映射值之间的关系可以反映原始值之间的关系。