56 lines
1.0 KiB
Python
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)) |