El Camel
This commit is contained in:
1 parent
c91740669a
commit
b07c85e8cb
1 file changed
+50
+50
@@ -0,0 +1,50 @@
|
|||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
class Elgamal:
|
||||||
|
def __init__(self, p: int, alpha: int, d: int) -> None:
|
||||||
|
"contract: p is prime, and"
|
||||||
|
if not 0 <= alpha < p or math.gcd(alpha, p) != 1:
|
||||||
|
# set Z*_n is all i [0, n) st gcd(i, n) = 1, if n is prime thats jus the whole thing
|
||||||
|
raise ValueError()
|
||||||
|
if not 2 <= d <= p - 2:
|
||||||
|
raise ValueError()
|
||||||
|
self.p, self.alpha, self.d = p, alpha, d
|
||||||
|
self.beta = pow(alpha, d, p)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pubkey(self):
|
||||||
|
return (self.p, self.alpha, self.beta)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def privkey(self):
|
||||||
|
return self.d
|
||||||
|
|
||||||
|
def sig_gen(self, x: int, ke: int) -> tuple[int, int]:
|
||||||
|
if not 2 <= ke <= self.p - 2 or math.gcd(ke, self.p - 1) != 1:
|
||||||
|
raise ValueError()
|
||||||
|
r = pow(self.alpha, ke, self.p)
|
||||||
|
kei = pow(ke, -1, self.p - 1) # mod p - 1
|
||||||
|
s = ((x - self.d * r) * kei) % (self.p - 1)
|
||||||
|
return r, s
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def sig_verify(x: int, rs: tuple[int, int], pab: tuple[int, int, int]) -> bool:
|
||||||
|
r, s = rs
|
||||||
|
p, alpha, beta = pab
|
||||||
|
t = (pow(beta, r, p) * pow(r, s, p)) % p
|
||||||
|
return (t - pow(alpha, x, p)) % p == 0
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
bob = Elgamal(29, 2, 12)
|
||||||
|
assert bob.beta % 29 == 7
|
||||||
|
|
||||||
|
r, s = bob.sig_gen(26, 5)
|
||||||
|
assert r % 29 == 3, f"{r = }"
|
||||||
|
assert s % 28 == 26, f"{s = }"
|
||||||
|
assert Elgamal.sig_verify(26, (r, s), bob.pubkey)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in new issue
Block a user