シュノア署名(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