Реализация RDSA для мудреца

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

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

  (a) prime eliptic curves (P-xxx)

  (b) binary eliptic curves (B-xxx)

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

Упражнение 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()))

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

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

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

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

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

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

Ответы

Ответ 1

(а.) Действительно ли этот код был тем, о чем меня просили?

Нет.

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

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

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

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

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