Skip to content
Snippets Groups Projects
Commit cf3eecfd authored by Arian Ubuntu's avatar Arian Ubuntu
Browse files

inverse de k

parent a4e5dff0
No related branches found
No related tags found
No related merge requests found
...@@ -3,10 +3,11 @@ from random import randint ...@@ -3,10 +3,11 @@ from random import randint
from sys import argv from sys import argv
from math import sqrt, gcd from math import sqrt, gcd
INPUT_NAME="fichier.txt" INPUT_NAME = "fichier.txt"
SIGNATURE_NAME="fichier.signed.txt" SIGNATURE_NAME = "fichier.signed.txt"
PUBKEY_FILE="pubkey.txt" PUBKEY_FILE = "pubkey.txt"
PRIVKEY_FILE="privkey.txt" PRIVKEY_FILE = "privkey.txt"
class Pubkey: class Pubkey:
p: int p: int
...@@ -17,7 +18,7 @@ class Pubkey: ...@@ -17,7 +18,7 @@ class Pubkey:
self.p = p self.p = p
self.g = g self.g = g
self.A = A self.A = A
def write(self, filename: str) -> None: def write(self, filename: str) -> None:
with open(filename, "w") as f: with open(filename, "w") as f:
f.write(f"{self.p} {self.g} {self.A}") f.write(f"{self.p} {self.g} {self.A}")
...@@ -27,6 +28,7 @@ class Pubkey: ...@@ -27,6 +28,7 @@ class Pubkey:
p, g, A = map(int, f.read().split()) p, g, A = map(int, f.read().split())
return Pubkey(p, g, A) return Pubkey(p, g, A)
class Privkey: class Privkey:
p: int p: int
g: int g: int
...@@ -46,6 +48,7 @@ class Privkey: ...@@ -46,6 +48,7 @@ class Privkey:
p, g, a = map(int, f.read().split()) p, g, a = map(int, f.read().split())
return Privkey(p, g, a) return Privkey(p, g, a)
class Signature: class Signature:
Y: int Y: int
S: int S: int
...@@ -53,7 +56,7 @@ class Signature: ...@@ -53,7 +56,7 @@ class Signature:
def __init__(self, Y: int, S: int) -> None: def __init__(self, Y: int, S: int) -> None:
self.Y = Y self.Y = Y
self.S = S self.S = S
def write(self, filename: str, data: str) -> None: def write(self, filename: str, data: str) -> None:
with open(filename, "w") as f: with open(filename, "w") as f:
f.write(f"{self.Y} {self.S}\n{data}") f.write(f"{self.Y} {self.S}\n{data}")
...@@ -64,18 +67,25 @@ class Signature: ...@@ -64,18 +67,25 @@ class Signature:
data = f.read() data = f.read()
return Signature(Y, S), data return Signature(Y, S), data
def hash(m: str) -> int: def hash(m: str) -> int:
return sum(ord(c) for c in m) return sum(ord(c) for c in m)
def sign(m: int, k: int, privkey: Privkey) -> Signature: def sign(m: int, k: int, privkey: Privkey) -> Signature:
p = privkey.p p = privkey.p
g = privkey.g g = privkey.g
a = privkey.a a = privkey.a
Y = pow(g, k, p) Y = pow(g, k, p)
S = pow((m - a * Y) * k, -1, p - 1) inverse = xgcd(k, p)[1] % (p - 1)
S = ((m - a * Y) * inverse) % (p - 1)
print(
f"Y = {Y}, S = {S}, p = {p}, g = {g} a = {a}, k = {k}, m = {m}, A = {pow(g,a,p)}"
)
return Signature(Y, S) return Signature(Y, S)
def verify(m: int, sig: Signature, pubkey: Pubkey) -> bool: def verify(m: int, sig: Signature, pubkey: Pubkey) -> bool:
Y = sig.Y Y = sig.Y
S = sig.S S = sig.S
...@@ -86,16 +96,18 @@ def verify(m: int, sig: Signature, pubkey: Pubkey) -> bool: ...@@ -86,16 +96,18 @@ def verify(m: int, sig: Signature, pubkey: Pubkey) -> bool:
return (pow(A, Y, p) * pow(Y, S, p)) % p == pow(g, m, p) return (pow(A, Y, p) * pow(Y, S, p)) % p == pow(g, m, p)
def is_prime(n: int) -> bool: def is_prime(n: int) -> bool:
if n <= 1: if n <= 1:
return False return False
for i in range(3, int(sqrt(n)) + 1, 2): for i in range(3, int(sqrt(n)) + 1, 2):
if n % i == 0: if n % i == 0:
return False return False
return True return True
def get_random_prime(min: int, max: int) -> int: def get_random_prime(min: int, max: int) -> int:
# trouver un nombre premier aléatoire entre min et max # trouver un nombre premier aléatoire entre min et max
while True: while True:
...@@ -104,40 +116,47 @@ def get_random_prime(min: int, max: int) -> int: ...@@ -104,40 +116,47 @@ def get_random_prime(min: int, max: int) -> int:
print(f"Found prime: {n}") print(f"Found prime: {n}")
return n return n
def get_all_generators(p: int) -> int: def get_all_generators(p: int) -> int:
return [g for g in range(2, p) if all(pow(g, i, p) != 1 for i in range(1, p - 1))] return [g for g in range(2, p) if all(pow(g, i, p) != 1 for i in range(1, p - 1))]
def get_random_generator(p: int) -> int: def get_random_generator(p: int) -> int:
generators = get_all_generators(p) generators = get_all_generators(p)
rand = randint(0, len(generators) - 1) rand = randint(0, len(generators) - 1)
return generators[1] return generators[rand]
def generate_key_pair() -> Tuple[Privkey, Pubkey]: def generate_key_pair() -> Tuple[Privkey, Pubkey]:
# p = get_random_prime(1000, 10_000) p = get_random_prime(1000, 10_000)
# g = get_random_generator(p) g = get_random_generator(p)
# a = randint(0, p - 1) a = randint(0, p - 1)
p = 7297 # p = 7297
g = 14 # g = 852
a = 7057 # a = 12
A = pow(g, a, p) A = pow(g, a, p)
print(f"Found generator : {g}")
return Privkey(p, g, a), Pubkey(p, g, A) return Privkey(p, g, a), Pubkey(p, g, A)
def xgcd(a,b):
prevx , x = 1 , 0 def xgcd(a, b):
prevy , y = 0 , 1 prevx, x = 1, 0
prevy, y = 0, 1
while b: while b:
q = a//b q = a // b
x, prevx = prevx - q*x, x x, prevx = prevx - q * x, x
y, prevy = prevy - q*y, y y, prevy = prevy - q * y, y
a, b = b, a % b a, b = b, a - q * b
return a, prevx, prevy return a, prevx, prevy
def generate_k(p: int) -> int: def generate_k(p: int) -> int:
k = randint(1, p - 2) k = randint(1, p - 2)
while gcd(k, p - 1) != 1: while gcd(k, p - 1) != 1:
k = randint(1, p - 2) k = randint(1, p - 2)
return k return k
def main(mode): def main(mode):
if mode == 0: if mode == 0:
# open the fichier.txt file and read its content into a string # open the fichier.txt file and read its content into a string
...@@ -164,4 +183,5 @@ def main(mode): ...@@ -164,4 +183,5 @@ def main(mode):
print("mode: 0 for signing, 1 for verifying") print("mode: 0 for signing, 1 for verifying")
exit(1) exit(1)
main(int(argv[1]) if len(argv) == 2 else -1)
\ No newline at end of file main(int(argv[1]) if len(argv) == 2 else -1)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment