Python, özellikle SymPy ve Sage kütüphaneleri ile eliptik eğri hesaplamaları için güçlü bir araçtır.
Tam Eliptik Eğri Sınıfı
class EllipticCurve:
def __init__(self, a, b, p=None):
self.a = a
self.b = b
self.p = p
if self.discriminant() == 0:
raise ValueError("Eğri singüler!")
def discriminant(self):
delta = -16 * (4 * self.a**3 + 27 * self.b**2)
return delta % self.p if self.p else delta
def j_invariant(self):
delta = self.discriminant()
j = 1728 * 4 * self.a**3 / delta
return j % self.p if self.p else j
def add(self, P, Q):
if P == "O": return Q
if Q == "O": return P
x1, y1 = P
x2, y2 = Q
if self.p:
if x1 == x2 and (y1 + y2) % self.p == 0:
return "O"
if P == Q:
m = (3 * x1**2 + self.a) * pow(2 * y1, -1, self.p)
else:
m = (y2 - y1) * pow(x2 - x1, -1, self.p)
x3 = (m**2 - x1 - x2) % self.p
y3 = (m * (x1 - x3) - y1) % self.p
else:
if x1 == x2 and y1 == -y2:
return "O"
if P == Q:
m = (3 * x1**2 + self.a) / (2 * y1)
else:
m = (y2 - y1) / (x2 - x1)
x3 = m**2 - x1 - x2
y3 = m * (x1 - x3) - y1
return (x3, y3)
def multiply(self, P, n):
"""Skalar çarpım: nP"""
if n == 0: return "O"
if n < 0:
return self.multiply(self.negate(P), -n)
result = "O"
addend = P
while n:
if n & 1:
result = self.add(result, addend)
addend = self.add(addend, addend)
n >>= 1
return result
def negate(self, P):
if P == "O": return "O"
x, y = P
return (x, -y if not self.p else (-y) % self.p)
p = 2**256 - 2**32 - 977
E = EllipticCurve(0, 7, p)
G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
private_key = 12345
public_key = E.multiply(G, private_key)
print(f"Public Key: {public_key}")
Kriptografi Uygulaması
Alice ve Bob, eliptik eğri üzerinde ortak gizli anahtar üretir:
- Alice: aG hesaplar (a = özel anahtar)
- Bob: bG hesaplar (b = özel anahtar)
- Alice, Bob'un bG'sini alır ve a(bG) hesaplar
- Bob, Alice'in aG'sini alır ve b(aG) hesaplar
- a(bG) = b(aG) = abG (ortak gizli!)