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.