Fundamentos de la Teoría de Números aplicados a la Firma Criptográfica ECDSA usada por el Protocolo Bitcoin
Imagen N° 1 Ejemplo de Curva Elíptica usada para las Firmas ECDSA --- Fuente: Elaboración propia
La Criptografía Asimétrica es la base de la seguridad de muchos sistemas informáticos en la actualidad, el protocolo Bitcoin utiliza la Criptografía de Curva Elíptica (ECDSA) la cual se sustenta en un par de claves, clave privada y clave pública, que básicamente son números, la clave privada corresponde a un número que permite gastar los fondos mientras que la clave pública es un número en base al cual se genera la dirección a la que se envían los fondos. La clave pública puede ser generada a partir de la clave privada de forma fácil mientras que el proceso inverso es imposible de realizar con la potencia computacional existente en la actualidad.
El proceso mediante el cual se genera la clave pública a partir de la clave privada se conoce como multiplicación de curva elíptica. En un artículo anterior explique al detalle este proceso de generación de clave privada/clave pública, sin embargo, surge la interrogante ¿cómo se asegura el protocolo Bitcoin de que el usuario que firma una transacción es el propietario de la clave privada sin necesidad de que el propietario tenga que compartir su clave privada?
Para explicar este punto primero se hará un repaso de aritmética modular y del proceso de multiplicación de curva elíptica resumiendo lo abordado en un artículo anterior, estos conceptos servirán de base para entender el proceso de firma criptográfica.
Aritmética Modular o Aritmética de Reloj
La aritmética modular consiste en realizar la adición o multiplicación de dos o más números de forma similar a la adición y multiplicación en el conjunto de números enteros y luego calcular el residuo al dividir entre un número entero llamado módulo (denotado por p), por ejemplo:
6 + 10 = 3 (módulo 13) debido a que 6 + 10 = 16 16/13 es 1, y el residuo es 3
9 + 11 = 7 (módulo 13)
8 * 10 = 2 (módulo 13) debido a que 8 * 10 = 80 80/13 es 6 y el residuo es 2
5 * 5 = 4 (módulo 7)
El conjunto de los enteros módulo p también denotado por Fp consiste en todos los números enteros desde 0 hasta p−1 con las operaciones de adición y multiplicación basadas en la aritmética modular (módulo p) también conocida como “aritmética del reloj”.
Curvas elípticas en cuerpos de enteros módulo p
En general, una curva elíptica en Fp , es una función definida de la siguiente forma
y2 = x3+ax+b (módulo p) tal que x,y,a y b pertenecen a Fp
Cada punto de la curva elíptica satisface la ecuación anterior, en el caso de Bitcoin la curva elíptica usada se define específicamente en el estándar secp256k1 de la siguiente forma:
y2 = x3+7 (módulo p)
Donde p es igual a
p = 2256 - 232 - 29 - 28 - 27 - 26 - 24-1
p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
Con el objetivo de simplificar los cálculos en el presente artículo se mostrará un ejemplo del proceso de firma criptográfica ECDSA utilizando un valor de p menor (en este caso 23) para comprender los fundamentos matemáticos de esta criptografía.
Dados los punto de la curva elíptica
y2 = x3+7 (módulo 23)
Y un punto adicional llamado “punto al infinito” (0,0), el cual no satisface la ecuación de la curva se forma un grupo abeliano, la operación de adición de puntos se define de la siguiente manera:
Tres puntos en una curva elíptica están alineados si su suma da cero P1 + P2 + P3 = (0,0), es decir, P1 + P2 = - P3 donde - P3 corresponde al punto simétrico a P3, adicionalmente se puede decir que tres punto en Fp están alineados si existe una línea recta que los una, sin embargo, las líneas rectas en Fp no son iguales a las líneas rectas en los números reales.
Una línea recta en Fp es el conjunto de puntos (x,y) que satisfacen la ecuación
y = ax + b (módulo p)
Que es la misma ecuación para los números reales pero aplicando aritmética modular, por ejemplo en F23 los puntos (1,10) y (6,4) están alineados en la recta
y = 8x+2 (módulo 23)
Probando con los otros puntos de F23 se demuestra que el tercer punto alineado en dicha recta es (11,21), por lo tanto el resultado de la adición es el simétrico de (11,21), es decir, (11,2) en caso de que se sume un punto P1 con el mismo, como no puede trazarse una línea recta entre ambos puntos, la línea recta se extiende para ser la tangente sobre la curva en P1, esta tangente intersectará a la curva en un punto, el simétrico de dicho punto es el resultado de la adición.
Propiedades de la adición de puntos
P1 + 0 = 0 + P1 = P1
P1 + ( - P1) = 0 un punto más su simétrico es igual al punto al infinito
Las ecuaciones para calcular la suma de dos puntos son las siguientes, dados P1 = (x1, y1) y P2=(x2,y2) su suma es igual a P3 =(x3,y3)
x3 = m2 - x1 - x2 (módulo p)
y3 = m * (x1 - x3 ) - y1 (módulo p)
Donde
m = (y2 - y1 ) * (x2 - x1)-1 (módulo p) si P1 ≠ P2
m = (3 * x12 ) * (2 * y1)-1 ( módulo p) si P1 = P2
La demostración del porque se usan estas formula escapa al alcance de este artículo. Ahora se define la multiplicación escalar dentro de la curva elíptica de la siguiente forma
n * P1 = (P1 + P1 + ⋯ + P1) n veces
Donde n es un número entero menor que p, por ejemplo en F23 si se define la curva elíptica y2 = x3+7 (módulo 23) se obtendría la siguiente representación gráfica
Imagen N° 2 Curva Elíptica y2 = x3+7 (módulo 23) en F23 --- Fuente: Elaboración propia
Luego si en la curva anterior se define el punto P1 = (1,10) como punto de partida y se multiplica dicho punto por un escalar n se obtendrían los siguientes puntos dependiendo del valor de n
Tabla N° 1 Puntos de la Curva Elíptica y2 = x3+7 (módulo 23) en F23 --- Fuente: Elaboración propia
Como se puede observar al multiplicar por diferentes valores escalares tomando (1,10) como punto generador se obtiene un subgrupo cíclico compuesto por 24 elementos que se repiten continuamente.
En el caso de la curva elíptica de bitcoin el punto generador G es el siguiente
X=55066263022277343669578718895168534326250603453777594175500187360389116729240
Y=32670510020758816978083085130507043184471273380659243275938904335757337482424
El punto obtenido al multiplicar el punto generador G por la clave privada es la clave pública la cual se suele representar en dos formatos diferentes, comprimida y descomprimida.
A continuación se presenta un ejemplo de la firma criptográfica ECDSA para la curva mostrada anteriormente.
y2 = x3+7 (módulo 23)
La cual es la misma curva con la que trabaja el protocolo de Bitcoin pero cambiando el valor del módulo para simplificar los cálculos, en la curva anterior si se selecciona el número d=20 como clave privada se puede apreciar en la tabla N° 1 que la clave pública correspondiente sería el punto Q = (11,21).
Proceso de Firma Criptográfica ECDSA
1- Se selecciona el mensaje a firmar M en el caso de Bitcoin se corresponde al SHA-256 de cierta información de la transacción en formato hexadecimal, la Curva Elíptica E de orden n (el orden es el número de puntos) y el punto Generador G.
En este artículo se usará como ejemplo de mensaje el número 17, la curva elíptica
y2 = x3+7 (módulo 23)
El punto generador será G= (1,10) esta curva posee 24 puntos por lo tanto su orden es n=24
2- Se selecciona un número aleatorio k entre 1 y n, por ejemplo el número 13.
3- Se calcula k * G, obteniéndose el punto (x1,y1), en este caso sería
13 * (1,10) = (16,3) ver Tabla N°1
4- Se calcula R = x1 mod n, si R = 0 se regresa al primer paso (x1 es tratado como un entero en aritmética modular)
R = 16 mod 24 = 16
5- Se calcula k-1 mod n (mediante el Algoritmo de Euclides Extendido) en este caso
13 mod 24 = 13 lo cual es cierto debido a que 13 * 13 = 1 (mod 24)
6- Se calcula S = k-1 * ( M + d * R) mod n si S = 0 regresar al primer paso
S = 13 * (17 + 20 * 16) (mod 24)
S = 13 * 1 (mod 24)
S = 13
7- La firma del mensaje son los números (R, S).
(16,13)
Proceso de verificación de la Firma Criptográfica ECDSA
El proceso de verificación de la firma se realiza de la siguiente manera
1- Se verifica que R y S estén entre 1 y n-1
16 y 13 son menores que 24, por lo tanto el paso 1 se cumple
2- Se calcula W = S-1 (mod n)
W = 13-1 (mod 24)
W = 13 lo cual es cierto debido a que 13 * 13 = 1 (mod 24)
3- Se calcula U1 = M * W (mod n)
U1 = 17 * 13 (mod 24) = 5
4- Se calcula U2= R * W (mod n)
U2 = 16 * 13 (mod 24) = 16
5- Se calcula el punto U1 * G + U2 * Q = (x0,y0)
5 * G + 16 * Q = (19,9) + 16 * (11,21)
(19,9) + (4,18)
(16,3)
6- Se calcula V = x0 mod n
V = 16 mod 24 = 16
7- La firma verifica si y solo si V = R, lo cual se cumple debido a que
16 = 16
Por lo tanto la firma criptografica ECDSA del mensaje es válida, se puede apreciar que la firma pudo ser verificada sin necesidad de dar a conocer la clave privada, solamente con la clave pública.
Con este post nos muestras las matemáticas ocultas detrás del Bitcoin, una información que es importante tener presente si queremos adentrarnos de lleno en el mundo de las Criptomonedas. Gracias por compartir!
Gracias por el apoyo.
Gracias a ti por tus valiosos aportes en cuanto a matemáticas aplicadas a diversos temas de interés.
todos los días de aprende algo nuevo muy interesante tu post @ydavgonzalez
Muchas gracias, Saludos.
Saludos @ydavgonzalez, excelente publicación. Una pregunta: si deseo iniciarme en el estudio a profundidad de las matemáticas en las que se sustenta el mundo de las criptomonedas, ¿con que me recomendarías comenzar?
El libro Mastering in Bitcoin presenta una introducción bastante sencilla a este tema.
Muy bien estructurado tu articulo. Definitivamente conoces y manejas muy bien tu campo. Felicidades.
Gracias por el apoyo.
Muy bueno tu artículo.
¡Excelente artículo!