零知識證實 | 2.什麼是多項式盲計算?

上一篇介紹了什麼是同態隱藏。假設取E(x) = g^x,則E(x+y)能夠經過E(x)E(y)計算出來:.net

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

實際上,不單單支持加法,支持全部"線性組合"的同態隱藏,好比E(ax + by)3d

E(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運算。cdn

假設如今有一個d次多項式P(X) = a_0 + a_1 \cdot X + a_2 \cdot X^2 + … + a_d \cdot X^d,其中的係數a_0,…,a_d \in \{0, p-1\}是Alice須要保護的祕密。根據上面的特性,咱們能夠計算出E(P(X))blog

E(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是否是真的知道這些祕密,因而他決定隨機指定一個數s,要求Alice計算E(P(s))等於多少。可是,Bob不想直接把s的值告訴Alice,也就是說,這個s是Bob的祕密。顯然,這又須要一次同態隱藏,也就是說,Bob把下面這些值提供給Alice:ip

E(s), E(s^2), E(s^3), …, E(s^d)

而後Alice就能夠根據上面的公式計算E(P(s))的值:it

E(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等於多少的狀況下,完成多項式的驗證。這就是所謂的"多項式盲計算"。io

下面舉個例子來加深理解,假設P(X) = 1 + 2X + 3X^2, E(x) = 3^x, p = 7class

Bob想驗證s=2這一點上的E(P(s))的值,那麼他須要提供這2個值:E(s) = 2, E(s^2) = 4基礎

而後Alice根據這3個值計算E(P(s))的值而後返回給Bob:bfc

E(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))是否是真的等於5:

E(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))的值對不對呢?且聽下回分解。

相關文章
相關標籤/搜索