title: ECDSA
text: # ECDSA
  
  ECDSA. Elliptic Curve Digital Signature Algorithm es una variante del algoritmo DSA que emplea operaciones sobre puntos de curvas elípticas en lugar de las exponenciaciones que usa DSA (problema del logaritmo discreto). La principal ventaja de este esquema es que requiere números de tamaños menores para brindar la misma seguridad que DSA o RSA. Existen dos tipos de curvas dependiendo del campo finito en el que se definan, que pueden ser GF(P) o $GF(2^m).$
  
  ## Proceso de firma y verificación
  
  * Generación de llaves
  * Seleccione una curva elíptica E.
  * Seleccione un punto P (que pertenezca a E) de orden n.
  * Seleccione aleatoriamente un número d en el intervalo [1, n - 1].
  * Calcule Q = dP.
  * d será la llave privada.
  * Q será la llave pública.
  * Proceso de firma
  * Seleccione un número k de forma aleatoria.
  * Calcule kP = $(x_1,y_1).$
  * Calcule r = $x_1$ mod n. Si r = 0 regresa al primer paso. (En este paso $x_1$ es tratado como un entero).
  * Calcule $(k^{-1})$ mod n.
  * Calcule s = $k^{-1}(H(m)$ + dr) mod n. Si s = 0 regrese al primer paso. (H(m) es el hash del mensaje a firmar, calculado con el algoritmo SHA-1).
  * La firma del mensaje m son los números r y s.
  * Proceso de verificación
  * Verifique que r y s estén dentro del rango [1,n - 1].
  * Calcule w = $s^{-1}$ mod n.
  * Calcule $u_1$ = H(m)w mod n.
  * Calcule $u_2$ = r·w mod n.
  * Calcule $u_1P$ + $u_2Q$ = $(x_0,y_0)$
  * Calcule v = $x_0$ mod n
  * La firma verifica si y solo si v = r
  