零知識證明 | 1.什麼叫同態隱藏?
所謂零知識證明,指的是在 不洩露祕密的前提下,證明我知道這個祕密 。
舉個簡單例子,假設我一個月工資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加法,為了公式簡潔沒有顯式指明。我們來證明一下,根據指數運演算法則:
好了,現在我們有同態隱藏函數了,接下來通過實際的例子加深理解。
我們要保護的祕密是 。我們計算出 和 ,把它們的值提供給驗證者:
驗證者驗證 是否等於 :
驗證成功!現在驗證者可以確認我知道 跟 的值,並且 。但是,他並不知道 和 的具體值是多少,我們的目的達到了。
總結一下: 同態隱藏就是通過一種特殊的對映函式,打亂原始資料的順序。根據對映值不能反推出原始值,但是對映值之間的關係可以反映原始值之間的關係。
