シュノア署名(Schnorr signature)は、楕円曲線暗号や整数群の上で定義される、シンプルかつ安全なデジタル署名方式
import hashlib import random p = 23 q = 11 g = 2 x = random.randint(1, q - 1) y = pow(g, x, p) print("秘密鍵 x = ", x) print("公開鍵 y = ", y) def H(r, m): data = str(r) + m h = hashlib.sha256(data.encode()).hexdigest() return int(h, 16) % q def schnorr_sign(m): k = random.randint(1, q - 1) r = pow(g, k, p) e = H(r, m) s = (k + x * e) % q return (e, s) def schnorr_verify(m, signature): e, s = signature g_s = pow(g, s, p) y_e = pow(y, e, p) r_prime = (g_s * pow(y_e, -1, p)) % p e_prime = H(r_prime, m) return e == e_prime message = "hello" signature = schnorr_sign(message) print("署名:", signature) valid = schnorr_verify(message, signature) print("署名の検証結果:", valid)
$ python3 schnorr.py
秘密鍵 x = 10
公開鍵 y = 12
署名: (5, 1)
署名の検証結果: True