python cryptography sage elliptic-curve ecdsa

python - Implementación RDSA en sage



cryptography elliptic-curve (1)

En primer lugar, debo decir que mi conocimiento sobre el uso de Sage math es realmente muy limitado, pero realmente quiero mejorar y poder resolver estos problemas que estoy teniendo. Me han pedido que implemente lo siguiente:

1 - Lea en FIPS 186-4 ( http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf ) la definición de ECDSA e implemente usando Sage math con:

(a) prime eliptic curves (P-xxx) (b) binary eliptic curves (B-xxx)

Intenté resolver (a) buscando mucho en Internet y terminé con el siguiente código:

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

Pero ahora me pregunto, ¿es este código realmente lo que me pidieron?

Quiero decir, obtuve los valores de p y todo eso del enlace mencionado anteriormente.

¿Pero es esta eliptic curve que hice una primera? (Lo que sea que realmente signifique).

En palabras, ¿es este código que pegué juntos la respuesta? ¿Y qué está haciendo realmente la función mutar? Entiendo el resto, pero no veo por qué tiene que estar aquí ...

Además, ¿qué podría hacer con respecto a la pregunta (b)? He buscado en todo el Internet, pero no puedo encontrar una sola mención comprensible sobre las curvas elípticas binarias en Sage ...

¿Podría simplemente reutilizar el código anterior y simplemente cambiar la creación de la curva para obtener la respuesta?


(a.) ¿Es este código realmente lo que me han pedido?

No.

El método sign() tiene la firma incorrecta: no acepta un argumento para firmar.

Sería muy útil escribir pruebas unitarias para su código en función de los vectores de prueba publicados, tal vez these , consulte esta pregunta de ejemplos de prueba ECDSA de Secp256k1 .

Podría considerar hacer los métodos de verificación descritos en D.5 y D.6 (pp 109 ff).

(b.) Curvas elípticas binarias

La publicación de FIPS que citó ofrece algunos consejos sobre la implementación de dichas curvas, y sí, podría aprovechar su código actual. Pero es probable que haya menos ventajas prácticas de implementarlas, en comparación con las curvas P-xxx, ya que la resistencia de las curvas B-xxx está en una base más rocosa. Tienen una ventaja para implementaciones de hardware como FPGA, pero eso no es relevante para su situación.