Curva Elíptica Koblitz SECP25k1.
La curva elíptica base para la seguridad del
Bitcoin es la Koblitz
secp256k1. Esta curva elíptica, no está especificada en el artículo original de Satoshi Nakamoto (el Libro Blanco del
Bitcoin)
[25]; fue seleccionada por consenso y cumple con:
Recommended Elliptic Curve Domain Parameters (
SEC)
[33–34] y el
Digital Signature Standard (
DSS) de
NIST, para los algoritmos que se deben de utilizar para generar una firma digital
[26]:
\begin{equation}
y^2=x^3+ax + b \pmod{p}\tag{4.4.1}
\end{equation}
Con el sextuple \(T = (p, a, b, G, n, h)\text{,}\) se especifican los coeficientes y parámetros de \(E\text{:}\)
\begin{align*}
a = \; \amp 0\\
b = \; \amp 7\\
p = \; \amp 2^{256}-2^{32}-2^9-2^8-2^7-2^6-2^4-1\\
G = \; \amp 0x79BE667E F9DCBBAC 55A06295 CE870B07\\
\amp \quad \; 029BFCDB 2DCE28D9 59F2815B 16F81798\\
n = \; \amp 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE\\
\amp \quad \; BAAEDCE6 AF48A03B BFD25E8C D0364141\\
h = \; \amp 1
\end{align*}
Donde
\(G\) es solo la coordenada
\(x\) del punto generador
\(G\text{;}\) \(G_y\) se obtiene despejando y evaluando los otros parámetros en
\(E\) (4.4.1). El parámetro
\(n\) (o
\(N\)) es un número primo; suborden del subgrupo de puntos en la curva elíptica (el orden de
\(G\)). El cofactor (o cofactor de seguridad)
\(h\) es un parámetro asociado a la curva elíptica definida sobre un cuerpo finito
\(\mathrm{F}(p)\text{;}\) se calcula como la división del número total de puntos en la curva (
\(\#E(F_p)\)) entre el orden del grupo de puntos generados por un punto base
\(n\text{:}\) \(h =
\#E(\mathrm{F}(p))/n\text{.}\) Si
\(h\) es pequeño o igual a 1, la curva se considera “segura”; un cofactor grande podría indicar una debilidad.
Subsubsección 4.4.2.2 Algoritmo de firma digital de curva elíptica
El algoritmo
Elliptic Curve Digital Signature Algorithm (
ECDSA) resuelve el problema del logaritmo discreto en curvas elípticas. Es ampliamente utilizado en la firma digital de transacciones criptográficas, como en la tecnología
blockchain, donde se asegura la autenticidad y la integridad de las transacciones.
Denotamos la clave secreta como \(e\text{,}\) que debe satisfacer lo siguiente: \(eG
= P\text{;}\) donde \(P\) es la clave pública y \(e\) la clave privada.
El objetivo o targe al que vamos a apuntar es un número \((k)\) aleatorio de 256 bits; hacemos \(kG = R\text{.}\)
\(R\) es ahora el objetivo al que apuntamos. De hecho, sólo importa la coordenada \(x\) de \(R\text{,}\) a la que llamremos \(r\text{;}\) de randomica.
-
La siguiente ecuación \(uG + vP = kG\) es equivalente al problema del logaritmo discreto: donde \(k\) es elegido al azar, \(u, v \neq 0\text{;}\) pueden ser elegidos por el firmante; mientras que \(G\) y \(P\) son conocidos. Esto se debe al hecho de que:
\(uG + vP = kG\) implica \(vP = (k - u)G\text{.}\) Dado que \(v \neq 0\text{,}\) podemos dividir por el múltiplo escalar \(v\text{:}\)
\begin{equation*}
P = (\frac{k - u}{v})G
\end{equation*}
-
Si conocemos \(e\text{,}\) tenemos:
\begin{equation*}
e = \frac{k - u}{v}
\end{equation*}
Esto significa que cualquier combinación \((u,v)\) que satisfaga la ecuación precedente será suficiente. Si no conocemos \(e\text{,}\) tendremos que jugar con \((u,v)\) hasta que \(e = \frac{k - u}{v}\text{.}\) Si pudiéramos resolver esto con cualquier combinación \((u,v)\text{,}\) eso significaría que habríamos resuelto \(P = eG\) mientras conocemos solo \(P\) y \(G\text{.}\) En otras palabras, así se resuelve el problema del logaritmo discreto de manera elíptica.
Para proporcionar \((u,v)\) correctos, debemos resolver el problema del logaritmo discreto o conocer el secreto \(e\text{.}\) Como acordamos que el logaritmo discreto es difícil (o imposible), podemos asumir que se supone que \(e\) es conocido por quien ideó \((u,v)\text{.}\)
Tenemos que incorporar la razón o propósito de nuestra intensión para que pueda ser verificada. ¿Cómo saber que hemos acertado al
targe esperado? En el lenguaje de firma/verificación, esto se llama
hash de firma [
Párrafo ]; la “huella digital” del mensaje que contiene el objetivo buscado, que cualquiera que pretenda verificar el mensaje, ya debe de conocer; denotado con
\(z\text{.}\)
El
hash del mensaje (
\(z\)): podemos incorporarlo a nuestro cálculo de
\(uG + vP\) de esta manera:
\(u = z/s\) y
\(v = r/s\text{.}\) Ahora tenemos el propósito
\(z\) incorporado en
\(u\text{,}\) y el motivo (objetivo o
targe \(r\)) incorporado en
\(v\text{;}\) ambos son ahora parte de la ecuación. Y con un poco de álgebra podemos sensatear lo que buscamos: la base del algoritmo de firma; cuyos dos números son
\(r\) y
\(s\text{.}\) La firma digital
ECDSA consta de dos componentes:
\(r\) y
\(s\text{;}\) a la coordenada
\(x\) de
\(R\) (un punto en la curva elíptica), llamamos
\(r\) que es una parte de la firma; la otra parte, está relacionada con el valor del
hash del mensaje que se está firmando, y la llamamos
\(s\text{.}\)
\begin{equation*}
uG + vP = R = kG
\end{equation*}
\begin{equation*}
uG + veG = kG
\end{equation*}
\begin{equation*}
u + ve = k
\end{equation*}
\begin{equation*}
\frac{z}{s} + \frac{re}{s} = k
\end{equation*}
\begin{equation*}
\frac{z + re}{s} = k
\end{equation*}
\begin{align*}
s \amp = \frac{z + re}{k}
\end{align*}
En resumen: en la firma digital
ECDSA, tenemos
\(u\) y
\(v\) que son componentes calculados,
\(R\) es un punto en la curva elíptica,
\(k\) es un valor aleatorio,
\(z\) es el
hash del mensaje,
\(e\) es la clave privada y
\(s\) es una parte de la firma.
La verificación es sencilla; \(uG + vP\) donde \(u,v \neq 0\) resultando:
\begin{equation*}
uG
+ vP = (\frac{z}{s})G + (\frac{re}{s})G = (\frac{z + re}{s})G = (\frac{z +
re}{(z + re)/k)})G = kG = (r,y)
\end{equation*}
En este punto, es importante indicar que podemos divulgar \(R\text{,}\) pero \(k\) debe mantenerse en secreto, ya que su revelación equivale a revelar la clave privada \(e\text{:}\) \(uG + vP = R \therefore uG + veG = kG \therefore (k - u)/v =
e\text{.}\)
Verificando una firma ECDSA.
Cuando se generan firmas digitales en
Bitcoin, estas firman un valor de longitud fija, que es nuestro
propósito y tiene 32 bytes. La elección de 32 bytes, equivalente a 256 bits, no es coincidencia, ya que lo que estamos firmando será un escalar para
\(G\text{.}\) Para asegurarnos de que lo que firmamos tenga exactamente 32 bytes, aplicamos primero una función
hash al documento. En Bitcoin, se utiliza la función
hash256, que consiste en dos rondas de
sha256 3 . Esto garantiza que el resultado tenga la longitud deseada; es llamado “hash de firma” o
\(z\text{.}\) Las firmas que tendremos que verificar, también tienen dos componentes
\((r,s)\text{;}\) donde igual
\(x\) es la coordenada de algún punto
\(R\) y
\(s\) es nuestra ecuación anterior:
\(s = \frac{z + re}{k}\text{.}\)
Conocemos \(e\) (a partir de: \(P = eG\text{,}\) o lo que estamos demostrando que sabemos en primer lugar), conocemos \(k\) (de: \(kG = R\)) y conocemos \(z\text{.}\) Ahora construiremos \(R = uG + vP\) definiendo \(u\) y \(v\) de esta manera: \(u=z/s\) y \(v=r/s\text{,}\) luego:
\begin{equation*}
uG + vP = (\frac{z}{s})G + (\frac{r}{s})P = (\frac{z}{s})G + (\frac{re}{s})G = (\frac{z
+ re}{s})G
\end{equation*}
Como conocemos: \(s = \frac{z + re}{k}\text{,}\) resulta:
\begin{equation*}
uG + vP = (\frac{(z + re)}{(z + re)/k})G = kG = R
\end{equation*}
Hemos elegido con éxito \(u\) y \(v\) de tal manera que generamos \(R\) como pretendíamos. Además, usamos \(r\) en el cálculo de \(v\text{,}\) lo que demuestra que sabíamos cuál sería \(R\text{.}\) La única forma en que podemos conocer los detalles de \(R\) de antemano es si conocemos \(e\text{.}\)
Algoritmo de verificación de firma ECDSA.
Algoritmo
ECDSA para verificar una firma digital:
A partir de \((r,s)\) como la firma, \(z\) como el hash de la ‘cadena de texto’ que se está firmando y \(P\) como la clave pública (o punto elíptico público) del firmante.
Se calcula:
\(u = \frac{z}{s}\) y
\(v = \frac{r}{s}\text{;}\) donde
\((u,v)\) se obtienen mediante el inverso multiplicativo de
\(s\text{,}\) con:
\(u = z \times s^{-1}
\pmod{N}\) y
\(v = r \times
s^{-1} \pmod{N}\) [En Sage:
Nota A.2.6]; donde
\(N\) es el suborden del subgrupo de puntos en la curva elíptica SECP25k1
4 .
Se calcula: \(uG + vP = R\text{.}\)
Si la coordenada \(x\) de \(R\) es igual a \(r\text{,}\) la firma es válida.