Kryptografia/zajecia3/1-ElGamal.py

56 lines
1.0 KiB
Python

import sys, random, math
sys.path.append("../")
import functions.functions as fn
# Generowanie kluczy
# 1. Znajdź liczbę pierwszą
p = None
while True:
a = random.getrandbits(512)
if (fn.fermat(100, a)):
p = a
break
# 2. Znajdź generator g grupy fi(p)
# Generatorem grupy fi(p) jest dowolna liczba względnie pierwsza z p
# Jeśli p jest liczbą pierwszą to jest to dowolna liczba od 2 do p-1
g = random.randint(2, p-1)
# 3. Losuje liczbę naturalną 1 < x < p-1
x = random.randint(2, p-2)
# 4. Obliczam
y = fn.potegowanieimod(g, x, p)
print("\n\nKlucz publiczny = ( {}, {}, {} )\n\n".format(p, g, y))
print("Klucz prywatny = ( {}, {} )\n\n".format(p, x))
# Szyfrowanie
# 1. Ustalam M
m = 12345
#m = random.randint(0, p-1)
# 2. Losuje liczbę naturalną 1 < z < p-1
z = random.randint(2, p-2)
# 3. Oblicza c1 i c2
c1 = fn.potegowanieimod(g, z, p)
c2 = fn.potegowanieimod(y, z, p) * m
print("C = [ {}, {} ]\n\n".format(c1, c2))
# Deszyfrowanie
d = int(c2 / fn.potegowanieimod(c1, x, p))
print("WIADOMOŚĆ: {}\n\n".format(d))