Zero-Knowledge-Proofs

使用離散對數的 Schnorr 簽名/python 實現的問題

  • April 11, 2018

出於教育目的(出於對質數 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)} $ .

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