零知识证明|2.什么是多项式盲计算?

上一篇介绍了什么是同态隐藏。假设取E(x)=gxE(x) = g^x,则E(x+y)E(x+y)可以通过E(x)E(x)E(y)E(y)计算出来:

E(x+y)=E(x)E(y)E(x+y) = E(x) \cdot E(y)

实际上,不仅仅支持加法,支持所有"线性组合"的同态隐藏,比如E(ax+by)E(ax + by)

E(ax+by)=gax+by=gaxgby=(gx)a(gy)b=E(x)aE(y)bE(ax+by) = g^{ax+by} = g^{ax} \cdot g^{by} = (g^x)^a \cdot (g^y)^b = E(x)^a \cdot E(y)^b

需要注意的是,上面的加法和乘法运算都是模p运算。

假设现在有一个d次多项式P(X)=a0+a1X+a2X2++adXdP(X) = a_0 + a_1 \cdot X + a_2 \cdot X^2 + … + a_d \cdot X^d,其中的系数a0,,ad{0,p1}a_0,…,a_d \in \{0, p-1\}是Alice需要保护的秘密。根据上面的特性,我们可以计算出E(P(X))E(P(X))

E(P(X))=E(1)a0E(X)a1E(X2)a2E(Xd)adE(P(X)) = E(1)^{a_0} \cdot E(X)^{a_1} \cdot E(X^2)^{a_2} … \cdot E(X^d)^{a_d}

现在Bob想来验证Alice是不是真的知道这些秘密,于是他决定随机指定一个数ss,要求Alice计算E(P(s))E(P(s))等于多少。但是,Bob不想直接把ss的值告诉Alice,也就是说,这个ss是Bob的秘密。显然,这又需要一次同态隐藏,也就是说,Bob把下面这些值提供给Alice:

E(s),E(s2),E(s3),,E(sd)E(s), E(s^2), E(s^3), …, E(s^d)

然后Alice就可以根据上面的公式计算E(P(s))E(P(s))的值:

E(P(s))=E(1)a0E(s)a1E(s2)a2E(sd)adE(P(s)) = E(1)^{a_0} \cdot E(s)^{a_1} \cdot E(s^2)^{a_2} … \cdot E(s^d)^{a_d}

最终的效果是:在Bob不知道P(X)中的系数是多少,而Alice也不知道s等于多少的情况下,完成多项式的验证。这就是所谓的"多项式盲计算"。

零知识证明|2.什么是多项式盲计算?

下面举个例子来加深理解,假设P(X)=1+2X+3X2,E(x)=3x,p=7P(X) = 1 + 2X + 3X^2, E(x) = 3^x, p = 7

Bob想验证s=2s=2这一点上的E(P(s))E(P(s))的值,那么他需要提供这2个值:E(s)=2,E(s2)=4E(s) = 2, E(s^2) = 4

然后Alice根据这3个值计算E(P(s))E(P(s))的值然后返回给Bob:

E(P(s))=E(1)1E(s)2E(s2)3=3464mod7=768mod7=5E(P(s)) = E(1)^1 \cdot E(s)^2 \cdot E(s^2)^3 = 3 \cdot 4 \cdot 64 |_{mod7} = 768|_{mod7} = 5

最后,我们来看一下E(P(2))E(P(2))是不是真的等于5:

E(P(2))=E(1+221+322)=E(17mod6)=E(5)=35mod7=243mod7=5E(P(2)) = E(1 + 2 \cdot 2^1 + 3 \cdot 2^2) = E(17|_{mod6}) = E(5) = 3^5|_{mod7} = 243|_{mod7} = 5

实际上,这背后依赖的理论基础是Schwartz-Zippel引理:在一个很大的集合中随机选择一组数,满足某个多项式取值的概率几乎为0。因此,随机选一个点,然后在Alice不知道该点的值的情况下,提供多项式的值以供Bob验证。

那么问题来了:Bob怎么验证Alice提供的E(P(s))E(P(s))的值对不对呢?且听下回分解。

更多文章欢迎关注“鑫鑫点灯”专栏:https://blog.****.net/turkeycock
或关注飞久微信公众号:
零知识证明|2.什么是多项式盲计算?