Kryptografia/miniprojekt2/dodawnaie.py

36 lines
1012 B
Python

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)