Zero-Knowledge-Proofs
使用離散對數的 Schnorr 簽名/python 實現的問題
出於教育目的(出於對質數 q 使用小值的目的),我嘗試編寫一個小的 Python 實現,該實現在維基百科文章https://en.wikipedia.org/wiki/Schnorr_signature中描述的 Schnorr 簽名
我在python(Python 3.6)中實現了以下內容
從 hashlib 導入 sha256 從隨機導入 randint def hashThis(r, M): 雜湊=sha256(); hash.update(str(r).encode()); hash.update(M.encode()); 返回 int(hash.hexdigest(),16); ## 符號 # 生成器 g g = 2 # Prime q(出於教育目的,我明確使用了一個小的質數 - 出於加密目的,這必須大得多) q = 2695139 ## 密鑰生成 #私人簽名密鑰x x = 32991 # 計算公共驗證密鑰 y y = pow(g, x, q) ## 簽名 M = "這是消息" k = randint(1, q - 1) r = pow(g, k, q) e = hashThis(r, M) % q # 簽名的第 1 部分 s = (k - (x * e)) % q # 簽名的第二部分 ## 確認 rv = (pow(g, s, q) * pow (y, e, q)) % q ev = hashThis(rv, M) % q print ("e " + str(e) + " 應該等於 ev " + str(ev)) # e 2241534 應該等於 ev 2462540
如您所見, e 和 ev 應該相等 - 但是,它們顯然不是。
我不知道問題出在哪裡 - 你有什麼想法我做錯了嗎
提前謝謝了
當心,注意 $ s $ 是模計算的 $ (q-1) $ (由於費馬小定理)。你必須寫 $ s = (k - (x * e)) \mod{ (q-1)} $ .