零知識證實 | 1.什麼叫同態隱藏?

所謂零知識證實,指的是在不泄露祕密的前提下,證實我知道這個祕密算法

舉個簡單例子,假設我一個月工資2000,我老婆一個月工資3000。我不會把這兩個數字透露給你,可是我能夠告訴你,我倆每月的工資加起來是5000。你能夠經過某種方式驗證我倆的工資加起來確實是5000,可是你沒辦法反推出來我每月的工資是多少,我老婆每月工資是多少。函數

要作到這一點,須要引入一個概念,叫作同態隱藏。這須要一些數論的知識,不過別擔憂,我也沒有學過數論,因此我會盡量用簡單的語言來解釋這個概念。.net

咱們把上面那個問題用數學語言描述一下:已知兩個數xy,須要在不泄漏這兩個數的前提下,證實x+y=53d

要實現這一點,咱們須要引入一個同態隱藏函數E(x),該函數知足下面3個條件:cdn

  • 知道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)blog

這個同態隱藏函數,用普通的加減乘除運算是無法實現的,咱們須要引入2個新的運算。數學

1.模p加法

p能夠是任意整數,不過爲了得到一些特殊性質,p通常取一個素數,好比7。it

所謂模p加法,就是加完以後對p取模(除以p取餘數)。好比下面的例子: io

咱們把集合\{0, 1, …, p-1\}跟模p加法運算一塊兒稱爲一個有限羣class

集合的元素個數稱爲有限羣的,因此上面是一個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的具體值是多少,咱們的目的達到了。

總結一下:同態隱藏就是經過一種特殊的映射函數,打亂原始數據的順序。根據映射值不能反推出原始值,可是映射值之間的關係能夠反映原始值之間的關係。

相關文章
相關標籤/搜索