2016-11-05 19 views
14

Прежде всего, я должен сказать, что мои знания с использованием математики Sage действительно очень ограничены, но я действительно хочу улучшить, чтобы иметь возможность решать эти проблемы, которые у меня есть. Мне было предложено осуществить следующие действия:Реализация RDSA на sage

1 - читать в FIPS 186-4 (http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) определение ECDSA и реализовать с помощью Sage математику с:

(a) prime eliptic curves (P-xxx) 

    (b) binary eliptic curves (B-xxx) 

Я попытался решению (а) посмотрев вокруг интернета много, и в конечном итоге с помощью следующего кода:

Упражнение 1, а)

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())) 

Но теперь я задаюсь вопросом: действительно ли этот код, на что меня попросили?

Я имею в виду, что получил значения для p и все, что связано с упомянутой выше ссылкой.

Но это eliptic curve Я сделал простой? (что бы это ни значило).

Для того, чтобы слова это код, я склеил ответ? И что на самом деле делает функция мутанта? Я понимаю остальное, но не понимаю, почему это должно быть здесь ...

Кроме того, что я могу сделать по вопросу (b)? Я просмотрел все вокруг Интернета, но я не могу найти ни одного понятного упоминания о бинарных элиптических кривых в sage ...

Могу ли я просто повторно использовать приведенный выше код и просто изменить создание кривой, чтобы получить ответ?

ответ

0

(a.) Является ли этот код действительно тем, к чему меня попросили?

No.

Метод знак() имеет неправильную подпись: он не принимает аргумент подписать.

Было бы очень полезно написать модульные тесты для вашего кода на основе опубликованных тестовых векторов, возможно, these, cf this Secp256k1 ECDSA test examples вопрос.

Вы можете рассмотреть возможность проведения проверок, описанных в D.5 & D.6 (стр. 109 ff).

(б.) Бинарные эллиптические кривые

ФИПС публикации вы цитировали предлагает некоторые рекомендации по реализации таких кривых, и да, вы можете использовать ваш текущий код. Но, по сравнению с кривыми P-xxx, возможно, меньше практического преимущества по сравнению с кривыми P-xxx, поскольку кривые B-xxx находятся на более роковой опоре. У них есть преимущество для аппаратных реализаций, таких как FPGA, но это не относится к вашей ситуации.

 Смежные вопросы

  • Нет связанных вопросов^_^