Przede wszystkim muszę powiedzieć, że moja wiedza na temat używania matematyki Sage jest bardzo ograniczona, ale naprawdę chcę ją poprawić, aby móc rozwiązać te problemy, które mam. Zostałem poproszony, aby realizować następujące:Implementacja RDSA na szałwinie
1 - Odczyt z FIPS 186-4 (http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) definicja ECDSA i wdrożyć za pomocą matematyki Sage z:
(a) prime eliptic curves (P-xxx)
(b) binary eliptic curves (B-xxx)
Próbowałem rozwiązywania (a) patrząc w całym internecie dużo i skończyło się z następującego kodu:
Wykonania 1, a)
class ECDSA_a:
def __init__(self):
#Parameters for Curve p-256 as stated on FIPS 186-4 D1.2.3
p256 = 115792089210356248762697446949407573530086143415290314195533631308867097853951
a256 = p256 - 3
b256 = ZZ("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16)
## base point values
gx = ZZ("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", 16)
gy = ZZ("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", 16)
self.F = GF(p256)
self.C = EllipticCurve ([self.F(a256), self.F(b256)])
self.G = self.C(self.F(gx), self.F(gy))
self.N = FiniteField (self.C.order()) # how many points are in our curve
self.d = int(self.F.random_element()) # privateKey
self.pd = self.G*self.d # our pubkey
self.e = int(self.N.random_element()) # our message
#sign
def sign(self):
self.k = self.N.random_element()
self.r = (int(self.k)*self.G).xy()[0]
self.s = (1/self.k)*(self.e+self.N(self.r)*self.d)
#verify
def verify(self):
self.w = 1/self.N(self.s)
return self.r == (int(self.w*self.e)*self.G + int(self.N(self.r)*self.w)*self.pd).xy()[0]
#mutate
def mutate(self):
s2 = self.N(self.s)*self.N(-1)
if not (s2 != self.s) : return False
self.w = 1/s2
return self.r == (int(self.w*self.e)*self.G + int(self.N(self.r)*self.w)*self.pd).xy()[0] # sign flip mutant
#TESTING
#Exercise 1 a)
print("Exercise 1 a)\n")
print("Elliptic Curve defined by y^2 = x^3 -3x +b256*(mod p256)\n")
E = ECDSA_a()
E.sign()
print("Verify signature = {}".format(E.verify()))
print("Mutating = {}".format(E.mutate()))
Ale teraz zastanawiam się, czy ten kod naprawdę jest tym, o co mnie proszono?
Mam na myśli, że mam wartości dla p
i wszystko to z linku wspomnianego powyżej.
Ale czy to jest eliptic curve
zrobiłem pierwszy? (cokolwiek to naprawdę znaczy).
W słowach kluczowych tego słowa skleiłem odpowiedź? A co właściwie robi funkcja mutacji? Rozumiem resztę, ale nie rozumiem, dlaczego musi tu być ...
Co mogę zrobić z pytaniem (b)? Rozglądałem się po Internecie, ale nie mogę znaleźć ani jednej zrozumiałej wzmianki o binarnych krzywych eliptycznych w szałwi ...
Czy mogę ponownie użyć powyższego kodu i po prostu zmienić tworzenie krzywej, aby uzyskać odpowiedź?