Hosted on hyper.media via the Hypermedia Protocol.
¿Qué es la propiedad? ¿Cómo estás seguro de que algo te pertenece? ¿Cuándo lo tuyo es realmente tuyo?
Antes de continuar leyendo, párate a reflexionar.
Seguro que no has encontrado una respuesta certera, ni una que cubra todas las casuísticas. ¿Sería tuya la casa que compraste sin un registro de la propiedad que lo afirme? ¿Sería tuyo el coche que compraste sin un registro donde lo hayan ligado a tu identidad?
Es rara la ocasión en la que podemos decir que algo es nuestro, sin que un tercero (normalmente el Estado) avale esa afirmación.
Es decir, ¿puedo decir que algo es mío sin que otro lo diga por mí?
«Tu eres tú porque una autoridad central, que es el Estado, te permite tener una identidad» – 50:10 L228 – Lunaticoin
Propiedad
Algo te pertenece si eres capaz de defenderlo.
Cuando no eres capaz de hacerlo, o no tienes medios para llevar a cabo esa tarea, confías en que un tercero lo haga. Ese tercero normalmente tiene la capacidad, por no decir el monopolio, de ejercer la violencia.
Esto presenta una gran ventaja: no tener que ejercer la violencia constantemente; y una gran desventaja: el mismo que defiende tu propiedad, podría tornarse contra ti, haciendo que lo que era tuyo en principio deje ahora de serlo.
No es idóneo que solo podamos decir que algo es nuestro cuando otro, con más poder, lo afirma.
Ante esto debemos plantearnos: ¿existe alguna manera de afirmar con rotundidad que algo es tuyo sin depender de la acción de otro?
La respuesta corta: No.
La respuesta que todos queremos: Sí, pero sólo en el mundo digital.
La tecnología al rescate
Cuando un autor concibe, por ejemplo, una obra escultórica, la propiedad de la creación, del concepto, siempre pertenecerá a ese autor, por mucho que a nivel físico la escultura haya sido vendida.
Podríamos decir que la propiedad puede residir de manera atemporal en la mente, en nuestra cabeza.
Aquello que almacenamos en nuestro córtex frontal es absolutamente nuestro.
Sin embargo, de poco sirve tener la propiedad de la creación de una obra escultórica: no se me malinterprete, es muy meritorio tener la capacidad creativa necesaria, pero por mucho que la tengas en tu cabeza, no puedes utilizar esa propiedad para adquirir bienes y servicios.
Donde te quiero llevar con esta reflexión es a la conveniencia de que exista un formato de propiedad que cumpla con los siguientes requisitos:
    Se almacene en tu mente.
    Te permita adquirir bienes y servicios.
    Sea inconfiscable.
    No necesites del uso de la violencia para su defensa.
    No necesites del permiso de un tercero para poder afirmar que es tuyo.
¿Te haces una idea de que estoy hablando?
Exacto, de Bitcoin.
Es la única forma de propiedad que hemos inventado los humanos que cumple con todos esos requisitos.
Y el puente que vincula tu mente (donde reside tu única propiedad verdadera) y la red de Bitcoin, es el tema principal de este artículo: las Firmas Digitales.
Let me explain:
En Bitcoin recibimos fondos a direcciones que, en la mayoría de los casos, son una representación de una Clave Pública.
Cuando deseamos gastarlos empleamos la Clave Privada asociada a esa Clave Pública para crear la Firma Digital que demuestra que somos los legítimos propietarios.
Esto es, sin la Clave Privada correcta no podremos crear una Firma Digital válida que demuestre al resto de participantes de Bitcoin (“los nodos”) que esos fondos están siendo movidos de manera lícita.
Quién tenga el control de la Clave Privada tendrá la posibilidad de mover esos fondos.
Ahora bien, la Clave Privada se puede almacenar de muchas maneras: entre ellas, es posible respaldarla con 12 o 24 palabras “Mnemonic” que podemos memorizar.
Entonces:
    Si almacenamos la Clave Privada en nuestra mente, memorizándola
    Podemos gastar fondos Bitcoin, adquiriendo Bienes y Servicios
    Sin necesitar permiso de un tercero para demostrar que esos fondos son nuestros, dado que somos nosotros mismos los que creamos una Firma Digital que cualquiera puede validar
    Sin hacer uso de la violencia para defender esos fondos, puesto que se encuentran en el ciberespacio y su acceso está en nuestra mente
    Obteniendo así una propiedad inconfiscable si no le das tu Clave Privada a nadie.
Esto es, Bitcoin almacenado en nuestra mente es la única forma verdadera de propiedad.
Y solo Bitcoin, puesto que para que sea propiedad verdadera además depende de condiciones necesarias como la inmutabilidad e incensurabilidad presentes en la red de Bitcoin. De poco serviría tener la Clave Privada en nuestra mente, si los fondos asociados pueden ser bloqueados o alterados. (Nota1)
Esto es, el resto de los activos que creemos poseer como una casa, un teléfono móvil o incluso Bitcoin guardado por un custodio, no son propiedad, sino usufructos.
Condensando todo: con las Firmas Digitales podemos asegurar al resto de humanos que somos los propietarios de una Clave Privada (que solo está en nuestra mente), sin la necesidad de mostrársela para que puedan certificar que la tenemos, auto-legitimándonos para mover y gastar fondos Bitcoin que se encuentran en la Clave Pública asociada a la Clave Privada.
«Your Keys, Your Coins»
De ahora en adelante, y tras dejar atrás la introducción, indagaremos en la Criptografía y las Firmas Digitales con mayor nivel de detalle, pasando por el flujo de las Firmas Digitales, continuando con el funcionamiento de las mismas en Bitcoin y finalizando con cuatro apartados extra donde adentrarse a nivel más técnico en la matemática de las firmas digitales, en el desglose de una transacción y de manera eminentemente práctica en la verificación de las firmas digitales de una transacción.
Criptografía Asimétrica y Firmas Digitales
En 1976, la publicación de «New Directions in Cryptography» por Diffie y Hellman, que se basó en investigaciones previas de figuras como Ralph Merkle, significó un hito tecnológico que condujo a la creación de un revolucionario sistema: la Criptografía Asimétrica, también conocida como Criptografía de Clave Pública.
En este sistema existen dos claves: Privada y Pública, las cuales están interrelacionadas. Desde la Privada se deriva la Pública con un método unidireccional, la Curva Elíptica, que impide hacer la operación contraria (obtener la Privada desde la Pública).
La relación existente entre ambas claves permite no solo encriptar y desencriptar mensajes de manera segura, sino también demostrar que posees la Clave Privada desde la que derivaste la Clave Pública que todo el mundo conoce y asocia con tu perfil. Para ello solo necesitas crear un mensaje y firmarlo digitalmente. Con esta simple acción, todo el mundo puede verificar que quien ha firmado el mensaje es la misma persona que posee la Clave Privada desde la cual derivó la Pública.
Y esto es justo lo que hacemos en Bitcoin: demostramos con una firma digital ligada a un mensaje (la transacción) que somos los propietarios de la Clave Privada desde la cual se derivó la Clave Publica donde actualmente se encuentran los fondos.
Entonces, ¿cuál es el propósito de las firmas digitales?
Demostrar que un individuo posee una Clave Privada sin necesidad de que la revele.
Cuando alguien firma un mensaje, adjunta una firma digital que se genera utilizando su Clave Privada. Cualquier persona que reciba el mensaje puede verificarlo mediante la firma digital y la Clave Pública que habían sido proporcionadas por el firmante. Si la verificación es exitosa, se prueba que el mensaje proviene del poseedor de la Clave Privada (autenticación) y que no ha sido modificado durante la transmisión (integridad del mensaje).
En otras palabras, aquel que firma un mensaje demuestra que posee la Clave Privada desde la que se deriva la Clave Pública conocida por todos y, por tanto, es el legítimo autor del mensaje.
El proceso de firma se fundamenta en dos conceptos “Binding” y “Hiding”, ambos relacionados con la seguridad en los compromisos (commitments) de la criptografía:
    “Binding” (Compromiso vinculante) implica que cuando firmamos un mensaje, lo vinculamos a la firma digital creada con la Clave Privada, haciendo que sea imposible modificar el mensaje sin que la verificación resulte errónea.
    “Hiding” (Compromiso de ocultación) implica que, aunque sea empleada la clave privada para firmar el mensaje, se hace de tal manera que la clave privada en sí misma no se pueda deducir o no se revele en ningún momento.
En esencia, una firma digital es una herramienta que te permite, de manera unilateral, demostrar al resto de participantes que posees o conoces algo, sin enseñar ese algo y sin que el resto pueda negarlo.
Flujo de las Firmas Digitales
Repasemos ahora el proceso completo de una firma digital, desde que se crea hasta que se verifica:
Alice tiene una Clave privada y un mensaje que debe firmar para que el receptor, Bob, pueda comprobar que ha sido Alice quién lo escribió.
Entonces Alice realiza el hash del mensaje. Esto se hace así para agilizar los procesos de firma, puesto que un hash como el SHA256 genera resultados siempre de la misma longitud, independientemente del tamaño del mensaje original. Esto facilita la firma, evita errores y aumenta la seguridad en la verificación.
Después toma su Clave Privada y firma el hash del mensaje, creando en este proceso la firma digital que enviará a Bob, junto con el mensaje original.
Bob tomará la Clave Pública de Alice, la cual todo el mundo conoce y asocia con Alice, realizará el hash del mensaje que le ha llegado, y con la firma, hará unos cálculos que le permitirán verificar que es Alice quién ha firmado el mensaje y que, en el camino, el mensaje no ha sido modificado.
Firmas Digitales aplicadas a Bitcoin
En Bitcoin existen condiciones de gasto que nos indican la manera en la que es legítimo el movimiento de unos fondos bitcoin.
La condición de gasto puede variar, y la más empleada consiste en demostrar que somos los propietarios de una Clave Privada desde la cual se deriva la Clave Pública donde están los fondos.
Esto se consigue mediante una firma digital que incluimos en la transacción, con la que probamos a los nodos de la red (los que verifican las transacciones):
    Que somos propietarios de la Clave Privada asociada a la Clave Pública donde están los fondos.
    Que la transacción no ha sido modificada y, por tanto, es la original.
La red solo validará la transacción y permitirá que se muevan esos bitcoin si la Firma Digital es CORRECTA.
ECDSA
Las firmas digitales en Bitcoin son creadas mediante el algoritmo ECDSA (Elliptic Curve Digital Signature Algorithm), es decir, el Algoritmo de Firma Digital mediante Curvas Elípticas. Este algoritmo es un conjunto de instrucciones que especifica los pasos necesarios tanto para firmar como para verificar una transacción.
En ECDSA una firma digital está compuesta por dos valores numéricos: “r” y “s”. Ambos son necesarios para la verificación posterior, donde podremos determinar que una firma es válida si “r” es igual a un valor que calcularemos en la verificación: “v”. Si esos dos valores son iguales, quién firmó el mensaje es el propietario de la Clave Privada asociada a la Clave Pública donde se encuentran los fondos.
Un ejemplo de firma digital creada con ECDSA:
r = 00d79836dbd86162e3c3a38bbf31f6547c3600e4f52330a8d55aa591e8896d6190
s = 332331d6d5c2c63db6174465aba6b848a4230ce943cffcf77ffdc02a30a8fbd7
ECDSA depende de que el par de claves privada-pública haya sido creado con la Curva Elíptica, para que toda la matemática interna del algoritmo funcione correctamente. La Curva Elíptica permite derivar la Clave Pública desde la Clave Privada sin que sea posible realizar el proceso inverso. Esto significa que, aunque alguien conozca tu Clave Pública, no podrá obtener tu Clave Privada (ni acceder a tus fondos Bitcoin).
En particular, Bitcoin utiliza la Curva Elíptica «secp256k1». Esta curva es fundamental para garantizar la seguridad de nuestros fondos Bitcoin.
Puedes conocer más sobre la Curva Elíptica «secp256k1» y la creación del par de claves en mi otro artículo "Curva Elíptica en Bitcoin", que te ayudará a entender los fundamentos de este tema. Además, tienes esta charla en “Bitcoin Tuesday” donde explicaba cómo la Curva Elíptica protege tu Bitcoin de que sea robado.
Condiciones de Gasto
La condición de gasto se determinada en la transacción que nos hizo llegar fondos y se conoce como “Locking Script” (en español, “Script de Bloqueo”).
Un script es un pequeño programa embebido en cada transacción, que es ejecutado por los nodos de Bitcoin a la hora de validar transacciones y está compuesto por comandos denominados “Operadores”, los cuales indican al nodo qué pasos debe tomar para validar esa transacción.
Para cumplir la condición de gasto, es decir para desbloquear el “Locking Script”, deberemos aportar un “Unlocking Script” (en español, “Script de Desbloqueo”) donde incluiremos lo necesario para que los nodos puedan validar la transacción.
Como puedes imaginar, el “Locking Script” y el “Unlocking Script” serán diferentes para cada condición de gasto.
Para hacer más sencilla la comprensión de** cómo se emplean las firmas digitales en Bitcoin**, vamos a describir el funcionamiento de éstas en una condición de gasto denominada P2PKH.
P2PKH
P2PKH (Pay To Public Key Hash, en español: “Pagar al Hash de la Clave Pública”) es una condición de gasto, un Locking Script, que obliga a quién recibe Bitcoin y desea gastarlos a proporcionar en el Unlocking Script una Firma Digital válida que demuestre que posee esos fondos.
Con la Firma Digital, los nodos podrán verificar que aquel que crea la transacción es la misma persona con la Clave Privada desde la que se deriva la Clave Pública donde se encuentran los fondos a gastar.
Sin embargo, los fondos no se encuentran vinculados ala Clave Pública, sino al hash de la misma. De ahí proviene el nombre “Pagar al Hash de la Clave Pública”, ya que los fondos se envían al hash de la clave, no a la clave en sí.
Para desbloquear estos fondos y poder gastarlos, el Unlocking Script debe incluir tanto una Firma Digital válida como la Clave Pública sin hashear.
¿Qué sentido tiene todo esto? ¿No sería mejor enviar los fondos directamente a la Clave Pública? Bueno, enviarlos al Hash de la Clave Pública presenta una serie de ventajas:
    La Clave Pública solo se expondrá cuando se deseen gastar los fondos. Mientras tanto, la Clave Pública se mantendrá privada dado que solo se conoce el Hash de la misma (donde llegaron los fondos).
    La Clave Pública ocupa más espacio que el Hash de la misma, reduciendo el tamaño total de la transacción puesto que solo se incluye en el Unlocking Script, mientras que el Locking Script a desbloquear estaba el Hash de la misma. En definitiva, se pagan menos fees.
Además, es necesario que se incluya la Clave Pública sin hashear. Si no se incluyese en el Unlocking Script, no sería posible verificar la Firma Digital.
Es importante aclarar que no menciono Dirección, puesto que una Dirección es simplemente una representación del Hash de la Clave Pública, diseñada para facilitar el envío y la recepción de fondos, minimizando posibles errores humanos. En la blockchain, no existen las direcciones como tal; estas son una convención utilizada por wallets y exploradores de blockchain como “mempool.space”.
Ejemplo de Clave Pública (Nota2):
020ce5eb2757373d469b59c971a498df4cf2484d52ef875024f1d924d22a0cc17c
Hash de la Clave Pública anterior:
610f04edfac91d244149203e48a5a089991a2ac1
Dirección (representación del Hash de la Clave Pública anterior):
19rCYAVvroJXe5VuvzjBUgx4TSmBqjtAp9
Firmar en P2PKH
Quien desee gastar fondos en Bitcoin debe crear primero una proto-transacción llamada «Hash Preimage», que actúa como un mensaje preliminar. Esta proto-transacción incluye información básica como:
    Una referencia al origen de los fondos (El txid de la transacción que hizo llegar los fondos y el Locking Script a desbloquear)
    La cantidad de bitcoin que está siendo enviado
    Las condiciones que deberá reunir el nuevo receptor para que éste a su vez pueda gastar los fondos (El “Locking Script”)
    El destino (La dirección donde van a llegar los fondos, bloqueándose de nuevo con un Locking Script)
    La manera en que se firmará esta proto-transacción. (SigHash)
Una vez construida esta proto-transacción, hay que firmarla para lo cual se realiza dos veces el Hash SHA256 sobre la proto-transacción. Luego se utiliza la Clave Privada para crear la firma digital sobre el resultado del doble hash SHA256. Se realizan dos rondas de hash por convención, no porque sea necesario.
Con la proto-transacción, la firma digital y la Clave Pública del emisor ya preparados, se procede a crear la transacción, que contiene toda la información necesaria, para ser posteriormente emitida a la red.
La transacción que llega a la red diferirá de la proto-transacción en que:
    Incluye la firma, cosa que por razones obvias la proto-transacción no incluye.
    El lugar que en la proto-transacción ocupaba el Locking Script a desbloquear, pasa a ser ocupado por la Firma Digital y la Clave Pública (el Unlocking Script).
    El SigHash cambia de lugar dentro de la composición, aunque se mantiene idéntico.
NOTA: En el apartado EXTRA 3 se amplia información sobre la diferencia entre proto-transacción y transacción.
Es fundamental entender que una transacción en Bitcoin es algo más que lo que puede parecer a simple vista en un explorador de blockchain como “mempool.space”: es un conjunto de información que no solo muestra desde dónde y hacia dónde se mueven los fondos, sino también la prueba necesaria para verificar que quien envía esa transacción a la red puede mover los fondos que ha indicado de manera legítima y de qué modo el receptor de la transacción deberá demostrar que es la propietario de esos fondos que le llegan.
Verificar en P2PKH
Los Nodos Bitcoin son los encargados de comprobar que toda transacción que llega cumple con las normas y el formato necesario, así como que el Unlocking Script proporcionado desbloquea correctamente el Locking Script.
Son guardianes que solo dejan pasar al reino de Bitcoin aquellas transacciones que sean válidas.
Harán uso de los Operadores “OP_”, ordenándolos en una pila, ejecutando primero aquellos que se encuentren en el Unlocking Script y acto seguido los pertenecientes al Locking Script que debe ser desbloqueado.
En P2PKH, el Locking Script será tal que así:
y será desbloqueado por un Unlocking Script compuesto por:
Siendo SIG la abreviatura de SIGNATURE, firma en inglés.
Una vez unidos ambos scripts, la cadena de operadores resultante es:
Obsérvese que primero va el Unlocking Script, y luego el Locking Script.
Ahora el nodo tomará esa cadena de operadores y comenzará a ejecutarla, en una pila:
1. OP_PUSH72 SIG
Empuja (Push) la firma “SIG” a la Pila.
2. OP_PUSH33 PubKey
Empuja (Push) la Clave Pública “PubKey” a la Pila.
3. OP_DUP
Duplica el último elemento añadido a la Pila, en este caso la Clave Pública “PubKey”.
4. OP_HASH160
Realiza el HASH160 sobre el último elemento de la Pila, reemplazando la PubKey que había sido duplicada por su PubKeyHash (Hash de la Clave Pública).
5. OP_PUSH20 «previousPubKeyHash«
Empuja (Push) el Hash de la Clave Pública donde se encuentran los fondos a mover.
6. OP_EQUALVERIFY
Comprueba que el Hash de la Clave Pública proporcionada en el Unlocking Script es el mismo que el Hash de la Clave Pública donde están los fondos a mover. Si el resultado es que ambos elementos de la Pila son idénticos, los elimina de la misma.
7. OP_CHECKSIG
Verifica que la Firma Digital proporcionada es válida. Para ello empleará los dos elementos restantes en la Pila: la Firma Digital y la Clave Pública. A partir de la transacción que ha recibido reconstruirá la proto-transacción que originalmente fue firmada, para realizarle el doble SHA256, con lo que verificar la Firma Digital.
Recuerda que se firma el Hash del Mensaje, nunca el mensaje en sí. Y para verificar la firma, se hace con el Hash del Mensaje. En Bitcoin, ocurre igual: Puesto que la firma digital de la transacción fue creada sobre el doble SHA256 de la proto-transacción, para poder realizar la verificación se necesitará reconstruir esa proto-transacción y realizarle el doble SHA256.
Finalmente, si la verificación que se ejecuta en el comando OP_CHECKSIG resulta positiva, se devuelve el valor TRUE y se eliminan los dos elementos que quedaban en la Pila, finalizando así el proceso y dando validez a la transacción dentro de la red de Bitcoin. Este proceso será repetido por cada Nodo al que le llegue la transacción.
«Poder decir que uno mismo es propietario de unos fondos bitcoin es sinónimo de tener la capacidad de crear el Unlocking Script que desbloquee la Condición de Gasto; el Locking Script
Conclusión
Las firmas digitales son la gran revolución, la gran revolución silenciosa. Trascienden su base matemática y tecnológica, modificando para siempre cómo nos relacionamos a nivel económico con otros.
Son el avance tecnológico que permite crear activos que redefinen el concepto de propiedad: donde previamente se requerían límites legales para determinar qué te pertenece, ahora deja de ser necesario, al no existir ninguna posibilidad de que un ente, el que sea, traspase tu libertad y confisque el activo.
Te habilitan como individuo a no depender de un tercero para demostrar que algo es tuyo.
En Bitcoin, lo tuyo es tuyo. Y nadie puede decir lo contrario.
Hacerte ver la profundidad de las firmas digitales y cómo ponen en jaque el statu quo de aquellos que, con el monopolio de la violencia en su mano, deciden qué es tuyo, es el objetivo de este artículo.
Son la llave a la libertad.
«La única diferencia que vamos a tener entre la IA y los humanos son las firmas digitales, es la única línea divisoria entre la máquina y nuestra individualidad humana […] porque ninguna IA es capaz de romper una firma digital» – 1:14:00 #28 Introducción a Mintter Hypermedia. Bienvenidos a la Web p2p. – Bitcoin Tuesday
EXTRA 1: Matemática detrás de las Firmas Digitales
Desgranemos paso por paso todo el proceso de firma y verificación, los cuales emplean la aritmética modular:
Datos y Parámetros:
Creamos nuestra Clave Privada aleatoria “d” en el rango (1, n-1) (Nota3)
Derivamos la Clave Pública “P” mediante la Curva Elíptica. Esto se hace multiplicado d -la Clave Privada- por el Punto Generador.
A partir del mensaje a firmar “m” se realiza el hash, obteniendo “h”. En Bitcoin, se realizan dos rondas de hash en vez de una sola.
Creamos un valor aleatorio k. Podremos usar diferentes valores k para crear distintas firmas digitales sobre el mismo mensaje, siendo todas válidas. Además, k deberá ser diferente en cada ocasión en la que firmamos un nuevo mensaje, más adelante veremos el porqué.
Creación de la Firma:
La firma tiene dos valores: “r” y “s”
Calculamos R: Multiplicamos k por el Punto Generador (el resultado es un valor dentro de la curva elíptica, por lo que tendrá una coordenada x y otra coordenada y). (Nota4)
“r” será la coordenada x de R (módulo n). (Nota5)
“s” se obtiene aplicando el módulo n al resultado de multiplicar la inversa multiplicativa (Nota6) del valor aleatorio k por la suma del hash del mensaje más la Clave Privada multiplicada por “r”.
Comprobamos que r y s son distintos a 0, y que se encuentran en el rango (1, n-1).
Verificación:
Calculamos c: la inversa multiplicativa de s.
Calculamos u1: el hash del mensaje “h” multiplicado por c (módulo n).
Calculamos u2: el valor “r” de la firma multiplicado por c (módulo n).
Calculamos V: u1 por el Punto Generador + u2 por la Clave Pública (el resultado es un valor dentro de la curva elíptica, por lo que tendrá una coordenada x y otra coordenada y).
“v” será la coordenada x de V (módulo n).
Comparamos v y r. Si son iguales, la firma es correcta.
A nivel matemático, ¿porqué v tiene que ser igual a r para que la firma sea correcta?
Para que la firma sea correcta la coordenada x de V, es decir “v” y la coordenada x de R, es decir “r”, deben ser iguales. Esto es V y R deben ser también iguales.
Puesto que R es kG (el valor aleatorio k por el Punto Generador), V también deberá ser kG.
Para demostrarlo, partiremos del cálculo de V:
Reagrupando tenemos que:
Dado que se debe demostrar que V es igual a kG, (u1 + u2d) deberá ser igual a k.
Sustituyendo u1 y u2 por su valores:
Considerando las propiedades de la operación módulo para “f(x) = x mod n”:
    Homomorfismo multiplicativo: La operación módulo es homomorfa con respecto a la multiplicación, es decir, si se cumple que “y * f(x) = f(y*x)”.
    Homomorfismo aditivo: La operación módulo también presenta homomorfismo aditivo, lo que significa que “f(y) + f(x) = f(y+x)”.
Podemos reagrupar la anterior expresión de la siguiente manera:
Para despejar “c” debemos saber que “c” es la inversa multiplicativa de “s” con respecto al modulo multiplicador “n”, esto es, “c” es un valor tal que multiplicado por “s”, todo mod n, el resultado es 1:
Multiplicamos y dividimos la expresión por “s”:
Hemos despejado “cs mod n” puesto que equivale a 1, tal y como establecíamos.
Ahora, para despejar “s”, debemos introducir el valor de “s”:
Donde “k^-1” será la inversa multiplicativa de k con respecto al módulo multiplicador “n”, es decir, un valor tal que multiplicado por k, todo mod n, sea igual a 1.
Por lo que s se podrá expresar como:
Quedando la expresión sobre la que estábamos trabajando:
Para despejar, multiplicamos y dividimos por el valor “k”:
Anteriormente establecíamos que “xk mod n” es igual a 1, quedando la expresión:
Demostrándose así que u1 + u2d es igual k, y por tanto, cumpliéndose que V=R.
La Clave Pública (P) será igual a la Clave Privada “d” por el Punto Generador “G”.
“Menos mal!”
La Clave Privada se incluye en el cálculo de s pero no hay forma de despejarla, salvo que no se sigan los pasos correctamente. Esto es, la Clave Privada está implícita en la firma digital pero no existe forma de obtenerla.
Ahora, con el siguiente código Python que he preparado (puedes comprobar que se realizan todas las operaciones que antes he descrito) vas a firmar un mensaje con una Clave Privada generada aleatoriamente, para posteriormente verificar la autenticidad de esa firma y mensaje.
Antes decíamos que Bitcoin utiliza ECDSA, por lo que en este código también vamos a utilizar ECDSA para crear la firma y por consiguiente, la Curva Elíptica “secp256k1” para derivar la Clave Pública.
EXTRA 2: La necesidad de un valor aleatorio k
En la sección anterior decíamos que es imposible extraer la Clave Privada del cálculo del valor s de la firma.
Pues realmente sí se puede, siempre y cuando quien haya implementado las firmas digitales NO haya tenido en cuenta un pequeño detalle: el valor k debe ser aleatorio no solo la primera vez que se utiliza, sino que debe ser aleatorio y distinto para cada nuevo mensaje que se firme.
Siempre que se firma una nueva transacción o un mensaje, es imperativo que el valor aleatorio k sea distinto al empleado anteriormente. De lo contrario, es posible extraer la Clave Privada del firmante. Esto es así puesto que se requiere de un valor lo más aleatorio posible para que haga contraste en los cálculos con la Clave Privada la cual, una vez generada, es la misma para todas las firmas digitales.
Esta vulnerabilidad se evidenció en 2013, cuando un grupo de atacantes se apropiaron de las claves privadas de usuarios de wallets en Android mediante este método, consiguiendo sustraer sus fondos. También fue utilizado para determinar la Clave Privada usada para firmar dentro de la consola PlayStation3, dado que la empresa utilizaba siempre el mismo valor k. En este último caso, más o menos, el código que empleaban para generar un valor aleatorio en cada ocasión lucía así:
int getRandomNumber()
{
     return 4;
}
– De aleatorio tenía poco – siempre devolvía el mismo número.
Para explotar esta vulnerabilidad, el atacante solo necesita dos mensajes distintos y sus correspondientes firmas:
Primero obtenemos el valor aleatorio “k”. Para ello, dos valores «s» han de haber sido creados con el mismo valor «k»:
Restamos s1 – s2, despejando k:
Obtenemos la Clave Privada “d”, despejando del cálculo de s1 o de s2, puesto que ya conocemos k; además conocemos los valores de r, s1 (son la firma) y h1 (es el hash del mensaje). Tenemos todo lo necesario para descubrir el valor de la Clave Privada “d”:
Recuerda que el valor r de la firma es el resultado de multiplicar el valor aleatorio por el punto generador, esto es, si k no es distinto en cada firma, r se mantiene igual.
Puedes probar ha explotar esta vulnerabilidad con el siguiente código en GitHub que he preparado.
Ha quedado clara la importancia de que este valor sea distinto para cada vez que se firma; aunque no debes preocuparte, los wallets (y otras piezas de software que emplean firmas digitales) tienen más que resuelto este problema:
En vez de usar una fuente de aleatoriedad que podría ser de mayor o menor calidad (y convertirse en un punto de fallo), hacen uso del estándar RFC6979, donde el valor k se genera de manera determinista, asegurando que siempre será distinto y sin relación entre un valor k y el siguiente. Esto es posible mediante el uso de HMAC, que emplea el mensaje y la Clave Privada como inputs para generar k.
Se usa un hash como HMAC porque los hashes son fuentes de mayor aleatoriedad al tener inputs distintos en cada ocasión. Aunque el valor k será el mismo si se utilizan el mismo mensaje y Clave Privada, esto no supone un problema de seguridad, ya que la vulnerabilidad solo ocurre al firmar dos mensajes distintos con el mismo valor k.
EXTRA 3: La proto-transacción
Su nombre común es Hash-Preimage, siendo «proto-transacción» un término que he acuñado para que sea un concepto más amigable para el lector. Se le denomina Hash-Preimage porque es el conjunto de información que será sometido a una operación de hash.
He creado una entrada en GitHub donde disecciono tanto la proto-transacción como la transacción correspondiente al mismo envío de fondos, con objeto de facilitar la visualización de las diferencias entre ambas.
EXTRA 4: Verificando Transacciones
Para finalizar, te puedes convertir en un nodo.
Puedes probar a comprobar con el siguiente código python que una transacción existente en la blockchain con condición de gasto P2PKH es válida, siguiendo los mismo pasos que el nodo:
    Que el HASH160 de la Clave Pública es igual al Public Key Hash que obtenemos decodificando la Dirección donde están los fondos
    Que la Firma Digital es válida.
    (Funciona únicamente con transacciones con 1 input y 1 output, ambos P2PKH. En el código se exponen algunos ejemplos a probar, a partir de la línea 187, con su correspondiente enlace para ver la transacción en mempool.space)
Notas
    Siempre y cuando exista otro activo que se pueda almacenar en nuestra mente y que, el medio por el cual se transfiere para realizar transacciones de carácter económico sea incensurable e inmutable, podrá ser propiedad verdadera. Obviamente, deberá tener valor para el mercado.
    Todas las transacciones, claves públicas, hash de claves públicas y direcciones no están ligadas a mi persona y han sido elegidas de manera aleatoria entre las cientos miles que existen en la blockchain.
    Valor n: Representa el número de veces que hay que sumar el Punto Generador de la curva a sí mismo hasta llegar de nuevo al Punto Generador, también conocido como el “Grupo Cíclico”. En la curva secp256k1 el valor de n es “0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141”. En los códigos Python, se invoca al valor de n mediante “secp256k1.order”.
    Todos los cálculos de verificación realmente se realizan en el plano de la curva elíptica.
    mod n: Para aquellos familiarizados con la programación o con las matemáticas, reconocerán la función «mod», que se refiere al operación módulo. Esta función devuelve el resto de la división entera entre dos números. Por ejemplo, si dividimos 10 entre 3 (10 mod 3), la función módulo devolverá 1, que es el resto. La función módulo asegura que el resultado permanezca dentro de un rango específico, es decir, que sea siempre menor que el divisor. En nuestro ejemplo, que sea menor que 3. En el contexto de las firmas digitales, se utiliza la función módulo con el valor n para garantizar que todos los resultados de los cálculos se encuentren entre 1 y n-1. Esto previene problemas como el desbordamiento, donde los valores exceden los límites permitidos, lo que podría comprometer la seguridad de Bitcoin.
    Inversa multiplicativa no es la misma operación que la inversa: La inversa multiplicativa da como resultado un valor tal que multiplicado por el que está siendo invertido y aplicando mod n, de 1.
Fuentes
Los códigos empleados son elaboración propia, todos disponibles en el repositorio de GitHub de este artículo. Recuerda instalar las librerías necesarias con «pip install».
W. Diffie and M. Hellman, «New directions in cryptography,» in IEEE Transactions on Information Theory, vol. 22, no. 6, pp. 644-654, November 1976, doi: 10.1109/TIT.1976.1055638.
National Institute of Standards and Technology (2023) Digital Signature Standard (DSS). (Department of Commerce, Washington, D.C.), Federal Information Processing Standards Publication (FIPS) NIST FIPS 186-5. https://doi.org/10.6028/NIST.FIPS.186-5
Standards for Efficient Cryptography 2 (SEC 2) (2010). https://www.secg.org/sec2-v2.pdf
Pornin, T., «Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA)», RFC 6979, DOI 10.17487/RFC6979, August 2013, https://www.rfc-editor.org/info/rfc6979.
Recomendaciones
Para ampliar conocimientos sobre el desglose de una transacción, te recomiendo encarecidamente la lectura del artículo de @sr_gi: «Diseccionando transacciones Bitcoin»
Para indagar más en los conceptos de Binding and Hiding, el siguiente vídeo.
Agradecimientos
Agradecer a R.O.M. y @PatrimonioBTC por la ayuda con la creación de los visuales y la revisión del artículo, respectivamente.
Activity