Elliptische Kurven - Implementierung
Im Folgenden sind die Programme zusammengefasst, die für die Implementierung von Rechenoperationen auf elliptischen Kurven über einem endlichen Körper ℤn erforderlich sind.
Die Klasse ModInt repräsentiert Elemente des Körpers ℤn und stellt die erforderlichen Operationen für die Grundrechenarten zur Verfügung. Dies geschieht, indem die Operatoren überschrieben werden, etwa der Operator + durch die Methode __add__. Für die Funktion rec (reciprocal - Kehrwert) wird die Funktion modinverse zur Berechnung des multiplikativ inversen Elements modulo n importiert.
Der Wert von n wird als Klassenattribut (statisches Attribut) ModInt.n gespeichert.
ModInt.py
class ModInt(object):
def __init__(self, i):
self.i=i % ModInt.n
def __add__(self, other):
return ModInt(self.i+other.i)
def __neg__(self):
return ModInt(-self.i)
def __sub__(self, other):
return self+(-other)
def __mul__(self, other):
return ModInt(self.i*other.i)
def rec(self):
return ModInt(modinverse(self.i, ModInt.n))
def __div__(self, other):
return self*other.rec()
def __pow__(self, k):
if k==0:
return ModInt(1)
if k%2==1:
return self*self**(k-1)
else:
return (self*self)**(k//2)
def __eq__(self, other):
return self.i==other.i
def __str__(self):
return str(self.i)
if __name__=="__main__":
def assertion(k, r):
assert str(k)==str(r)
ModInt.n=7
s=ModInt(2)
t=ModInt(13)
assertion(s, 2)
assertion(t, 6)
assertion(s+t, 1)
assertion(s*t, 5)
assertion(s-t, 3)
assertion(s/t, 5)
assertion(s**999, 1)
assertion(s*t, s/t)
print("Ok")
Die Klasse EcPoint repräsentiert einen Punkt einer elliptischen Kurve und stellt Methoden für die Verknüpfung von Punkten zur Verfügung (__mul__ für den Operator * und __pow__ für den Operator **).
Der Parameter a der elliptischen Kurve wird in einem Klassenattribut (statisches Attribut) EcPoint.a gespeichert. Der Parameter b wird hier nicht benötigt.
Im anschließenden Test wird zunächst im Körper ℝ der reellen Zahlen gerechnet. Anschließend wird dieselbe Berechnung im Körper ℤ23 durchgeführt.
EcPoint.py
class EcPoint(object):
def __init__(self, x, y, u=False):
self.x=x
self.y=y
self.u=u
def isInfinity(self):
return self.u
@staticmethod
def infinity():
return EcPoint(None, None, True)
def __mul__(self, other):
if self.isInfinity():
return other
if other.isInfinity():
return self
if self.x==other.x and self.y==-other.y:
return EcPoint.infinity()
if self.x==other.x and self.y==other.y:
s=self.x*self.x
m=(s+s+s+EcPoint.a)/(self.y+self.y)
else:
m=(self.y-other.y)/(self.x-other.x)
xr=m*m-self.x-other.x
yr=m*(self.x-xr)-self.y
return EcPoint(xr, yr)
def __pow__(self, k):
if k==0:
return EcPoint.infinity()
elif k%2==1:
return self*self**(k-1)
else:
return (self*self)**(k//2)
def __str__(self):
if self.isInfinity():
return "infinity"
else:
return str(self.x)+" "+str(self.y)
if __name__=="__main__":
EcPoint.a=-2.0
p=EcPoint(2.0, 2.0)
q=EcPoint.infinity()
for i in range(9):
q=q*p
print(i+1, q)
print(" ", p**9)
print()
from ModInt import *
ModInt.n=23
EcPoint.a=ModInt(-2)
p=EcPoint(ModInt(2), ModInt(2))
q=EcPoint.infinity()
for i in range(9):
q=q*p
print(i+1, q)
print(" ", p**9)
print()
Für die Implementierung der Diffie-Hellman-Schlüsselvereinbarung legen wir eine Standard-Elliptische-Kurve E zugrunde und auf dieser einen Standard-Punkt p. Die Funktion standardPoint liefert den Standard-Punkt p, zugleich legt sie den Modul n des Körpers ℤn sowie den Parameter a der elliptischen Kurve E fest.
def standardPoint():
ModInt.n=1332297598440044874827085558802491743757193798159
EcPoint.a=ModInt(297190522446607939568481567949428902921613329152)
x=1089473557631435284577962539738532515920566082499
y=127912481829969033206777085249718746721365418785
return EcPoint(ModInt(x), ModInt(y))
Um die Methode standardPoint zu testen, benutzen wir wieder ein ähnliches Programm wie oben:
p=standardPoint()
q=EcPoint.infinity()
for i in range(9):
q=q*p
print(i+1, q)
print(" ", p**9)
print()
Weiter mit:
[up]
H.W. Lang mail@hwlang.de Impressum Datenschutz
Created: 10.03.2011 Updated: 17.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden