Implementation

Schnorr 辨識協議有時會出錯?

  • April 29, 2018

我正在將 Schnorr 辨識協議作為更大協議的一部分來實現。在大部分情況下,大約 20% 的情況下,我的測試失敗了。我不認為這是程式碼問題,雖然可能,但我認為這是我對協議的理解的問題。

以下是我目前執行 Schnorr 辨識的方式:

  • 使用 OpenSSL,我找到了一個安全的素數p $ p $ 和隨後的素數q=(p−1)/2 $ q = (p - 1) / 2 $

  • 我找到了一個發電機G $ g $ 對於循環群Gq $ \mathbb{G}_q $ 有秩序的q $ q $ .

    • 這是我最懷疑的部分。我讀過它被認為是隨機的H∈從∗p $ h \in \mathbb{Z}^{*}_{p} $ 和設置G=H(p−1)/q反對q $ g = h^{(p-1)/q} \mod q $ 將導致G $ g $ 作為一個可能的發電機Gq $ \mathbb{G}_q $ 只要G≠1 $ g \neq 1 $ ,雖然它沒有被證明。我不完全理解這一點,這似乎是我的實現可能失敗的地方。
  • 我生成一個隨機私鑰X∈從q $ x \in \mathbb{Z}_q $ 並設置是=GX反對p $ y = g^x \mod p $

現在設置了 ElGamal 密鑰,我想證明X $ x $ 給知道公鑰的驗證者(p,q,G,是) $ (p, q, g, y) $ .

  • 我隨機選擇和∈從q $ e \in \mathbb{Z}_q $ 並且寄出在=G和反對p $ w = g^e \mod p $ 作為我的承諾。
  • 作為驗證者,隨機發送C∈從q $ c \in \mathbb{Z}_q $ 證明。
  • 作為證明者,發送s=CX+和反對q $ s = cx + e \mod q $ 給驗證者。
  • 作為驗證者,檢查在是C反對p=Gs反對p $ wy^c \mod p = g^s \mod p $ .

最後一步是有時會失敗的地方;平等不成立。因為每次測試執行都會生成新的隨機數,所以很難看出是什麼導致了失敗。

我認為這不是程式碼問題;我相信我已經對所有內容進行了編碼,以完全按照上述步驟概述。我認為其中一個或多個步驟本身可能是錯誤的。請注意,我已經包含了我正在做的每個計算的模數,因為有些論文傾向於將它們作為隱含的。

我對 Schnorr 辨識協議的理解是否正確,我是否正確地複制了公式?如果是這樣,我可以做得更好嗎?

很好,我們已經解決了這個問題(錯誤是計算G=H(p−1)/q反對p $ g=h^{(p-1)/q} \bmod p $ 代替G=H(p−1)/q反對q $ g=h^{(p-1)/q} \bmod q $ ).

在實施此類協議時,您可以採用以下“經驗法則”:

  • 使用乘法組的組元素時從∗p $ \mathbb{Z}_p^* $ ,即執行組操作,那麼你總是做你的計算模p $ p $ ,例如,您計算和=是在反對p $ z=y w \bmod p $ .
  • 在“指數”和“基本元素”中工作時(G $ g $ 在這種情況下)生成一個子組的順序q $ q $ ,然後您對這些整數模執行計算q $ q $ ,即你計算s=CX+和反對q $ s=cx+e \bmod q $ (請注意,當您使用您的組元素時G $ g $ 的力量s $ s $ ,然後你做另一個組操作,即計算Gs反對p $ g^s \bmod p $ ).

引用自:https://crypto.stackexchange.com/questions/15845