Merge branch 'master' of https://git.wmi.amu.edu.pl/s444341/Kryptografia
This commit is contained in:
commit
cf018d2890
@ -1,5 +1,19 @@
|
||||
import random, copy
|
||||
|
||||
|
||||
#reszta kwadratowa
|
||||
def resztaKwadratowa(a, p):
|
||||
return potegowanieimod(a, int((p + 1) / 4), p)
|
||||
|
||||
|
||||
#generuj liczbe pierwsza
|
||||
def genPierwsza(bity):
|
||||
while True:
|
||||
a = random.getrandbits(bity)
|
||||
if (fermat(100, a)):
|
||||
return a
|
||||
|
||||
|
||||
#sprawdza czy liczby są pierwsze
|
||||
def fermat(dokladnosc, liczba):
|
||||
i = 0
|
||||
@ -11,6 +25,7 @@ def fermat(dokladnosc, liczba):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
#x * u + N * v = d
|
||||
#Jeśli d == 1 to liczby są względnie pierwsze
|
||||
#d to NWD
|
||||
|
36
miniprojekt2/dodawnaie.py
Normal file
36
miniprojekt2/dodawnaie.py
Normal file
@ -0,0 +1,36 @@
|
||||
import sys, random
|
||||
sys.path.append("../")
|
||||
|
||||
import functions.functions as fn
|
||||
|
||||
|
||||
def dodawanie(punkt1, punkt2, krzywa):
|
||||
a = krzywa[0]
|
||||
p = krzywa[2]
|
||||
|
||||
if punkt1 == None:
|
||||
return punkt2
|
||||
|
||||
elif punkt2 == None:
|
||||
return punkt1
|
||||
|
||||
elif punkt1[0] != punkt2[0]:
|
||||
l = ((punkt2[1] - punkt1[1]) * fn.odwrotnosc((punkt2[0] - punkt1[0]) % p, p) ) % p
|
||||
x3 = (fn.potegowanieimod(l, 2, p) - punkt1[0] - punkt2[0]) % p
|
||||
y3 = (l * (punkt1[0] - x3) - punkt1[1] ) % p
|
||||
return (x3, y3)
|
||||
|
||||
elif punkt1[0] == punkt2[0] and punkt1[1] == punkt2[1]:
|
||||
l = ((3 * fn.potegowanieimod(punkt1[0], 2, p) + a) * fn.odwrotnosc(2 * punkt1[1], p)) % p
|
||||
x3 = (fn.potegowanieimod(l, 2, p) - 2 * punkt1[0]) % p
|
||||
y3 = (l * (punkt1[0] - x3) - punkt1[1]) % p
|
||||
return (x3, y3)
|
||||
|
||||
elif punkt1[0] == przeciwny(punkt2)[0] and punkt1[1] == przeciwny(punkt2)[1]:
|
||||
return None
|
||||
|
||||
return (0, 0)
|
||||
|
||||
|
||||
def przeciwny(punkt, p):
|
||||
return (punkt[0], -punkt[1] % p)
|
15
miniprojekt2/krzywa.py
Normal file
15
miniprojekt2/krzywa.py
Normal file
@ -0,0 +1,15 @@
|
||||
import sys, random
|
||||
sys.path.append("../")
|
||||
|
||||
import functions.functions as fn
|
||||
|
||||
def genKrzywa():
|
||||
p = fn.genPierwsza(300)
|
||||
a = None
|
||||
b = None
|
||||
while True:
|
||||
a = random.randint(0, p-1)
|
||||
b = random.randint(0, p-1)
|
||||
delta = (4 * fn.potegowanieimod(a, 3, p) + 27 * fn.potegowanieimod(b, 2, p) ) % p
|
||||
if delta != 0:
|
||||
return (a, b, p)
|
17
miniprojekt2/punkt.py
Normal file
17
miniprojekt2/punkt.py
Normal file
@ -0,0 +1,17 @@
|
||||
import sys, random, math
|
||||
sys.path.append("../")
|
||||
sys.path.append("./")
|
||||
|
||||
import functions.functions as fn
|
||||
|
||||
|
||||
def genPunkt(krzywa):
|
||||
p = krzywa[2]
|
||||
a = krzywa[0]
|
||||
b = krzywa[1]
|
||||
while True:
|
||||
x = random.randint(0, p-1)
|
||||
f = (fn.potegowanieimod(x, 3, p) + a * x + b) % p
|
||||
if f / p != -1:
|
||||
y = fn.resztaKwadratowa(f, p)
|
||||
return (x, y)
|
56
miniprojekt2/weryfikacja.py
Normal file
56
miniprojekt2/weryfikacja.py
Normal file
@ -0,0 +1,56 @@
|
||||
import sys
|
||||
sys.path.append("./")
|
||||
|
||||
|
||||
import krzywa as krz
|
||||
import punkt as pt
|
||||
import dodawnaie as dod
|
||||
import functions.functions as fn
|
||||
import wielokrotnosc as wiel
|
||||
|
||||
|
||||
#Losowa krzywa E : Y=X^3+AX+B mod p, gdzie
|
||||
p=523133468360889049404922330981983268743289535618129665870465316487757998439707462631766351
|
||||
A=230494833619330872742071433259892253887918924949625621075110348455162899582640562756609713
|
||||
B=225785530019760328737805254637561350820485164307786402015943227616074411698429350907607751
|
||||
krzywa = (A, B, p)
|
||||
|
||||
#Losowe punkty na krzywej E
|
||||
#P=(x1,y1), Q=(x2,y2)
|
||||
x1 =175757722742565321624944121270945167081993085306911405305303187535900979958321560252348498
|
||||
y1 =226448623369642016063981880559768023550784441813507797884241707518308435413329534175311217
|
||||
P = (x1, y1)
|
||||
x2 =304223499801180221986968767003559465876563746859119614741554413137259445936662302970066936
|
||||
y2 =102134142598989436206400710402192938770351951638395982416611953688718767254279072458296380
|
||||
Q = (x2, y2)
|
||||
|
||||
#OK
|
||||
#Punkt -P=(x0,y0), gdzie
|
||||
x0=175757722742565321624944121270945167081993085306911405305303187535900979958321560252348498
|
||||
y0=296684844991247033340940450422215245192505093804621867986223608969449563026377928456455134
|
||||
|
||||
przeciwny = dod.przeciwny(P, p)
|
||||
print("-P = ( {}, {} )\n".format(przeciwny[0], przeciwny[1]))
|
||||
|
||||
#Suma punktów R=P+Q, R=(x3,y3), gdzie
|
||||
x3=309247913243722349735615105023317652942369780988859181257617047802708085926167159989635057
|
||||
y3=56286298341270122874863929527351508051302994910793895678502472234843432931564818467195330
|
||||
|
||||
dodawanie = dod.dodawanie(P, Q, krzywa)
|
||||
print("\nDodawanie: {}\n".format(dodawanie))
|
||||
|
||||
#Suma punktów S=P+P, S=(x4,y4), gdzie
|
||||
x4=375245993831373348008207650671056348586612193401076181864749537869098009498477401148713884
|
||||
y4=87341294615819365102301001172231285456917076241094217329360106978400409261563949100144039
|
||||
|
||||
podwojny = dod.dodawanie(P, P, krzywa)
|
||||
print("\nPodwójny: {}\n".format(podwojny))
|
||||
|
||||
#Suma punktów T=P+(-P), T={O}.
|
||||
#Obliczenie U=nP, U(x5,y5), gdzie
|
||||
n=4879347923749729479274728427486284684682648644
|
||||
x5=376727840283116089359770933229860138351592734853415435564325838098166315053389243324176492
|
||||
y5=141067337441924393425295138662462090300703204905331212701080956044508288466652141335161785
|
||||
|
||||
wielokrotnosc = wiel.wielokrotnosc(krzywa, P, n)
|
||||
print("\nWielokrotność: {}\n".format(wielokrotnosc))
|
15
miniprojekt2/wielokrotnosc.py
Normal file
15
miniprojekt2/wielokrotnosc.py
Normal file
@ -0,0 +1,15 @@
|
||||
import sys, random, copy
|
||||
sys.path.append("./")
|
||||
|
||||
import dodawnaie as dod
|
||||
|
||||
def wielokrotnosc(krzywa, punkt, n):
|
||||
q = punkt
|
||||
r = None
|
||||
while n > 0:
|
||||
if 1 == n % 2:
|
||||
r = dod.dodawanie(r, q, krzywa)
|
||||
n -= 1
|
||||
q = dod.dodawanie(q, q, krzywa)
|
||||
n = n // 2
|
||||
return r
|
37
miniprojekt2/zadania.py
Normal file
37
miniprojekt2/zadania.py
Normal file
@ -0,0 +1,37 @@
|
||||
import sys
|
||||
sys.path.append("./")
|
||||
|
||||
|
||||
import krzywa as krz
|
||||
import punkt as pt
|
||||
import dodawnaie as dod
|
||||
import wielokrotnosc as wiel
|
||||
|
||||
|
||||
# zad 1 - generuj krzywą
|
||||
krzywa = krz.genKrzywa()
|
||||
print("\nE = ( A: {}, B: {}, p: {})\n".format(krzywa[0], krzywa[1], krzywa[2]))
|
||||
|
||||
|
||||
# zad 2 - losowy punkt
|
||||
punkt = pt.genPunkt(krzywa)
|
||||
print("P = ( {}, {} )\n".format(punkt[0], punkt[1]))
|
||||
|
||||
# zad 3 - punkt przeciwny
|
||||
p = krzywa[2]
|
||||
przeciwny = (punkt[0], -punkt[1] % p )
|
||||
print("-P = ( {}, {} )\n".format(przeciwny[0], przeciwny[1]))
|
||||
|
||||
|
||||
# zad 4 - dodawnaie punktów
|
||||
punkt2 = pt.genPunkt(krzywa)
|
||||
wynik = dod.dodawanie(punkt, punkt2, p)
|
||||
print("R = ( {}, {} )\n".format(wynik[0], wynik[1]))
|
||||
|
||||
pod = dod.podwojny(punkt, krzywa[0], p)
|
||||
print("S = ( {}, {} )\n".format(pod[0], pod[1]))
|
||||
|
||||
# zad 5 - n-ta wielokrotność punktu
|
||||
n = 5
|
||||
wielokrotnosc = wiel.wielokrotnosc(krzywa, punkt, n)
|
||||
print("{}P = ( {}, {} )\n".format(n, wielokrotnosc[0], wielokrotnosc[1]))
|
40
miniprojekt2/zaliczenie.py
Normal file
40
miniprojekt2/zaliczenie.py
Normal file
@ -0,0 +1,40 @@
|
||||
#Tylko deszyfrowanie ElGammal na krzywej
|
||||
|
||||
import math
|
||||
import sys
|
||||
sys.path.append("./")
|
||||
|
||||
|
||||
import dodawnaie as dod
|
||||
import wielokrotnosc as wiel
|
||||
|
||||
|
||||
def dekodowanieKrzywej(punkt, u):
|
||||
return math.ceil(punkt[0] - 1 / u)
|
||||
|
||||
|
||||
|
||||
p=731308150714321957849734816484321327119306335527666142772981103429614098294367916616192051
|
||||
A=650436649561455070461892045239297273810338327060582149067290109178304889026764087827222303
|
||||
B=393651706462824198277343570733362683428089922651104369418553164436556395018275495301846803
|
||||
#C1=(x3,y3);
|
||||
#C2=(x4,y4);
|
||||
x3=34791770906820122752501140104306036053164090009865871144108139346780277134807427702262028
|
||||
y3=21066589872392983967815591132354523605031924537129956532523648621530097883764976935325171
|
||||
x4=186698539519726941523101574150863594380763252545073110418528772061794171311499124283340359
|
||||
y4=139702463401317072232031962287250501182328856243084829793001376804676448040153050195056294
|
||||
x=672066757942005027592684629780121319559766320138386156339177050193566909314907208798471016
|
||||
#PM=(x5,y5)
|
||||
x5=161527769144648125516616552305430215523209938960948885119763789863298885352623739933340770
|
||||
y5=535388071375765111892419320980278561695403441127487734617482964160721504503181645564425574
|
||||
|
||||
c1 = (x3, y3)
|
||||
c2 = (x4, y4)
|
||||
krzywa = (A, B, p)
|
||||
|
||||
wielokrotność = wiel.wielokrotnosc(krzywa, c1, x)
|
||||
przeciwny = dod.przeciwny(wielokrotność, p)
|
||||
pm = dod.dodawanie(c2, przeciwny, krzywa)
|
||||
print(pm)
|
||||
|
||||
#m = dekodowanieKrzywej(pm, )
|
56
zajecia3/1-ElGamal.py
Normal file
56
zajecia3/1-ElGamal.py
Normal file
@ -0,0 +1,56 @@
|
||||
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))
|
29
zajecia3/4-faktoryzacja.py
Normal file
29
zajecia3/4-faktoryzacja.py
Normal file
@ -0,0 +1,29 @@
|
||||
import random, math
|
||||
|
||||
n = random.getrandbits(50)
|
||||
print(n)
|
||||
|
||||
k = 2
|
||||
pom = math.sqrt(n)
|
||||
factors = [1]
|
||||
i = 1
|
||||
d = -1
|
||||
while n > 1 and k <= pom:
|
||||
while n % k == 0:
|
||||
n = n // k
|
||||
factors.append(k)
|
||||
if k < 3:
|
||||
k += 1
|
||||
else:
|
||||
k = 6 * i + d
|
||||
if d == 1:
|
||||
d = -1
|
||||
i += 1
|
||||
else:
|
||||
d = 1
|
||||
|
||||
if len(factors) == 0:
|
||||
factors.append(n)
|
||||
|
||||
print(factors)
|
||||
|
Loading…
Reference in New Issue
Block a user