Прежде всего, я должен сказать, что мои знания с использованием математики 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 ...
Могу ли я просто повторно использовать приведенный выше код и просто изменить создание кривой, чтобы получить ответ?