I'm trying to create a simple DS for a project, where public keys are q (random 224 bit int), p(random 2048 bit int) and a g such that:
pow(g,q,p) == 1
. Upon generating signature with function:
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
and verifying with
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
always returns -1, upon printing various results, I saw that u and r values are never same thus failing to create a proper sign tuple.