2016-11-05 19 views
14

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ź?

Odpowiedz

0

(a.) Czy ten kod jest tym, o co mnie proszono?

nr

Sposób

znak() ma niewłaściwy podpis: nie akceptuje argument do podpisania.

Byłoby bardzo pomocne napisanie testów jednostkowych dla twojego kodu na podstawie opublikowanych wektorów testowych, być może these, por. Pytanie Secp256k1 ECDSA test examples.

Możesz rozważyć wykonanie weryfikacji opisanych w D.5 & D.6 (str. 109 ff).

(b.) Binarne krzywe eliptyczne

Publikacja FIPS ty cytowane oferuje kilka porad na wdrażanie takich krzywych, i tak można było wykorzystać swój aktualny kod. Jednak ich implementacja jest prawdopodobnie mniej praktyczna, w porównaniu z krzywymi P-xxx, ponieważ siła krzywych B-xxx jest bardziej radykalna. Mają przewagę w implementacjach sprzętowych, takich jak FPGA, ale nie ma to znaczenia dla twojej sytuacji.