所謂零知識證實,指的是在不泄露祕密的前提下,證實我知道這個祕密。算法
舉個簡單例子,假設我一個月工資2000,我老婆一個月工資3000。我不會把這兩個數字透露給你,可是我能夠告訴你,我倆每月的工資加起來是5000。你能夠經過某種方式驗證我倆的工資加起來確實是5000,可是你沒辦法反推出來我每月的工資是多少,我老婆每月工資是多少。函數
要作到這一點,須要引入一個概念,叫作同態隱藏。這須要一些數論的知識,不過別擔憂,我也沒有學過數論,因此我會盡量用簡單的語言來解釋這個概念。.net
咱們把上面那個問題用數學語言描述一下:已知兩個數和
,須要在不泄漏這兩個數的前提下,證實
。3d
要實現這一點,咱們須要引入一個同態隱藏函數,該函數知足下面3個條件:cdn
若是找到了這個同態隱藏函數,問題就簡單了:我把跟
的值告訴你,你用它們算出
,而後判斷一下是否是等於
就好了。也就是說,把驗證
轉化成了驗證
。blog
這個同態隱藏函數,用普通的加減乘除運算是無法實現的,咱們須要引入2個新的運算。數學
p能夠是任意整數,不過爲了得到一些特殊性質,p通常取一個素數,好比7。it
所謂模p加法,就是加完以後對p取模(除以p取餘數)。好比下面的例子: io
咱們把集合跟模p加法運算一塊兒稱爲一個有限羣。class
集合的元素個數稱爲有限羣的階,因此上面是一個7階有限羣。
和模p加法相似,模p乘法就是相乘之再對p取模。好比下面的例子:
顯然,這也是一個7階有限羣。
另外還有一個有趣的現象,若是讓集合中的每一個元素對自身不斷地作模p乘法(即乘方),觀察我標紅的那兩行:
有沒有發現,集合中的每一個元素均可以被生成出來(只不過順序被打亂了)?這種羣被稱爲循環羣,元素3或者5稱爲一個生成元。實際上,全部素數階的有限羣都是循環羣。
有了上面這些背景知識,咱們就能夠來尋找同態隱藏函數了。
在上面的例子裏,生成元。假設咱們取3,定義
。
這個函數是否是真的知足以前提到的3個條件呢?咱們來確認一下:
好了,如今咱們有同態隱藏函數了,接下來經過實際的例子加深理解。
咱們要保護的祕密是。咱們計算出
和
,把它們的值提供給驗證者:
驗證者驗證是否等於
:
驗證成功!如今驗證者能夠確認我知道跟
的值,而且
。可是,他並不知道
和
的具體值是多少,咱們的目的達到了。
總結一下:同態隱藏就是經過一種特殊的映射函數,打亂原始數據的順序。根據映射值不能反推出原始值,可是映射值之間的關係能夠反映原始值之間的關係。