我正在尝试为一个项目创建一个简单的 DS,其中公钥是 q(随机 224 位 int)、p(随机 2048 位 int)和 ag,这样:
pow(g,q,p) == 1
. 使用函数生成签名后:
def SignGen(message, q, p, g, alpha):
h = int(hashlib.sha3_256(message).hexdigest(),16) % q
k = random.randint(1,q-2) % (p-1)
r = pow(g,k,p) % q
s = ((alpha*r) - (k*h)) % q
return s,r
并验证
def SignVer(message, s, r, q, p, g, beta):#beta is pow(g,alpha,p) where secret alpha = random.randrange(1,q-1)
h = int(hashlib.sha3_256(message).hexdigest(),16) % q
v,y = egcd(h,q) #egcd to find h*v = 1 % q
z1 = ((s*v) % q)
z2 = ((r*v) % q)
u = (pow(g, -z1, p) * pow(beta, z2, p)) % q
if u == r: #U IS NEVER EQUAL TO R
return 0
else :
return -1
总是返回 -1,在打印各种结果时,我看到 u 和 r 值永远不会相同,因此无法创建正确的符号元组。