Desmenuzando el Bitcoin Wallet, Parte 1

¿Qué es exactamente un bitcoin wallet?

En el sentido más estricto, el “wallet” de bitcoin no es más que un par de llaves criptográficas: Llave privada y llave pública, generadas bajo el algorítmo asimétrico ECDSA (Elliptic Curve Digital Signature Algorithm). No obstante es muy común llamarle “wallet” al software que además de gestionar tales llaves, también se encarga de realizar transacciones, almacenar copia de las transacciones relacionadas con el usuario, ofrecer una interfaz gráfica, facilitar respaldos de las llaves ,entre otras cosas.

Normalmente se pudiera pensar que un wallet (monedero) resguarda los bitcoins de un usuario, tal como sucedería en la vida real. En verdad lo único que se guarda en estos wallets es la llave criptográfica que te permite reclamar los bitcoins que posees y que se encuentran registrados en el Blockchain. Descuida, precisamente el fin de esta serie de artículos es disipar todas estas dudas de manera gradual y definitiva, razón por la cual nos enfocaremos en los aspectos técnicos más relevantes de un wallet que son:

  • Generar par de llaves criptográficas
  • Construir una transacción

Para ello utilizaramos mayormente el lenguage Python. Es conveniente aclarar que esta serie de artículos va dirigida al lector ansioso de conocer lo que sucede “detrás del telón”, es decir, para aquellos interesados en el funcionamiento detallado de un wallet en forma más minimalista.

Pero antes de adentrarnos en tales temas veremos algunos conceptos pertinentes los cuales trataremos en esta primera parte:

  1. Criptografía Asimétrica (Criptografía de Llave Pública)
  2. Función Hash Criptográfica
  3. Firma Digital

Estos conceptos criptográficos se abordarán de la manera más coloquial posible con el propósito de atender a una mayor diversidad de lectores. Por lo tanto pido un poco de paciencia a los lectores con mayor experiencia.

¿Qué es la Criptografía Asimétrica o Criptografía de Llave Pública?

Pese a que el adjetivo “asimétrico” puede escucharse un poco intimidante, realmente es más sencillo de lo que parece, sobre todo si analizamos primero la criptografía simétrica con la que la mayoría estamos familiarizados.

La criptografía simétrica es la forma más común de cifrar datos. Básicamente consiste en cifrar el texto claro (texto claro se le llama al dato o mensaje en su forma original) utilizando una “contraseña” o “llave”, misma que sirve también para descifrarlo de vuelta. Dicho de otra manera, la misma llave que se utiliza para cifrar el texto claro es la misma que se utiliza para descifrarlo.

En el caso de la criptografía asimétrica, en lugar de utilizar una sola llave para cifrar y descifrar datos, se utilizan dos: Llave privada y llave pública. Estas llaves generadas se encuentran matemáticamente asociadas. Se genera primero la llave privada, y posteriormente ésta se encarga de generar su respectiva llave pública.

¿Pero por qué dos llaves?

Lo que se cifra con una de las llaves, sólo puede ser descifrado por su contraparte. Es decir, si cifras el texto claro con una llave privada, sólo podrás descifrarlo con su respectiva llave pública. En este caso, ni siquiera la misma llave privada podrá descifrar el criptograma (el texto claro en su forma cifrada, “cyphertext” en inglés). Lo mismo sucede si el cifrado se realiza con la llave pública en cuyo caso sólo la llave privada correspondiente servirá para descifrar.

El hecho de poder cifrar datos con una llave y descifrarlos con otra, abre un mundo de posibilidades.

Pongamos algunos ejemplos de ambos tipos de criptografía.

Criptografía Simétrica:

Supongamos que Alicia desea comunicarse de forma secreta con Beto. Alicia conoce un poco de seguridad de redes. Sabe que enviar mensajes en texto claro por la red no es seguro, por ello le sugiere a Beto cifrar los mensajes eligiendo el algoritmo simétrico AES-256. Ya sólo falta que ambos instalen un software que se encargue de tal tarea. Tratándose de criptografía simétrica, bastará con que compartan una misma contraseña para cifrar y descifrar. Finalmente empiezan a compartirse mensajes cifrados (criptogramas) por distintos medios y con total tranquilidad, pues saben que ningún hacker o curioso podrá conocer el contenido original, aún interceptando el mensaje.

Criptografía Asimétrica:

Juan desea comprar una computadora en la tienda en línea “Avazon”. Uno de los procesos para completar la compra implica crear una cuenta de usuario y proporcionar una tarjeta de crédito o débito. Avazon, estando absolutamente consciente de los riesgos de trasferir este tipo de datos por la red, opta por transferir datos de forma cifrada entre Juan y el sitio web de Avazon.

Haciendo alusión al ejemplo previo, así como Alicia y Beto establecieron un canal seguro de comunicación mediante criptografía simétrica, Avazon necesita cifrar los datos que se transfieran durante el proceso de compra. El problema es que evidentemente Juan no es el único cliente, de hecho hay cientos de miles de usuarios deseando comprar a través del sitio. En vista de que la criptografía simétrica utiliza la misma contraseña para cifrar y descifrar, sería sumamente riesgoso para Avazon entregar esta contraseña a sus clientes, ya que cualquiera de sus clientes o poseedor de la misma pudiera descifrar los datos transferidos. Si bien una manera de aligerar este riesgo fuera generando una contraseña personalizada para cada cliente, mejorando así un poco la confidencialidad, el procedimiento sería complejo e ineficiente.

Afortunadamente existe la criptografía asimétrica y soluciona de maravilla este problema: Avazon genera un par de llaves asimétricas y entrega a cada uno de sus clientes (a través del navegador web) la llave pública con la cual deberán cifrar los datos solicitados por el sitio (contraseña de usuario, datos de tarjeta de crédito, etc.). En vista de que sólo Avazon posee la llave privada, y sólo con la llave privada se puede descifrar aquello cifrado con su respectiva llave pública, ya no importa quien tenga la llave pública, tampoco es necesario generar una llave única por cliente. Millones de usuarios podrán utilizar esta misma llave pública, cifrar los datos y enviárselos a Avazon. Al servidor de Avazon sólo le bastará contar con una sóla llave (privada) para interactuar y descifrar el contenido recibido de todos sus clientes.

Si bien este ejemplo hace referencias muy simplistas a la implementación del estándar SSL utilizado por los navegadores y sitios web, al menos intenta demostrar algunos de los beneficios de la criptografía asimétrica.

Dicho sea de paso, cada vez que ingresas a un sitio mediante el protocolo “https” (la “s” hace alusión a conexión segura), estás utilizando criptografía asimétrica bajo el estándar SSL. El “candado verde” que aparece en los navegadores indica que todos los datos que viajan entre tu computadora y el sitio al cual te estás conectando, viajan de manera cifrada.

Otra caso de uso muy común de criptografía asimétrica es el de la “firma digital”, un tema que veremos después. Antes de continuar dejemos claro a qué nos referimos con “llave”.

¿Qué es una llave y cómo se diferencia de una contraseña?

La diferencia reside mayormente en la longitud y su formación. Hay algoritmos de criptografía tales como el ECDSA los cuales imponen una longitud determinada como parte de sus estándares de seguridad . Esta longitud es tal que sería sumamente difícil memorizarla, a diferencia de las contraseñas las cuales suelen ser por lo general manualmente eligidas por el usuario, memorizables y no se adhieren a un estándar en particular.

Una “llave” no es más que un número enorme elegido al azar, es decir, un número tan grande como aprox. el número de átomos en el universo visible. La razón de utilizar números tan grandes es para elevar la entropía (grado de aleatoriedad) y reducir la posibilidad de colisión (evitar que alguien más descubra o adquiera el mismo número).

Esto significa que cuando generas una llave bajo el algoritmo ECDSA, mismo que utiliza el protocolo bitcoin, realmente estás eligiendo un número aleatorio de 256-bits, es decir, entre 1 y 115792089237316195423570985008687907852837564279074904382605163141518161494336. Este número gigante es normalmente almacenado en un archivo, directamente en bytes.

Con base en las leyes de la probabilidad, puedes tener la tranquilidad de que nadie más llegará a utilizar, conocer o adivinar tal número, al menos que tú lo reveles o te sea robado/hackeado debido a un mal resguardo. Las posibilidad de que alguien elija el mismo número es astronómicamente improbable, tan improbable como si llegaras a encontrarte en tus próximas vacaciones de verano un prototipo del siguiente iPhone enterrado en la arena, dentro en un cofre de oro adornado con diamantes hope.

En vista de que este número gigante (llave privada) está vinculado matemática y criptográficamente a otro número gigante (llave pública), no existe una medio viable para descubrir la contraparte de cualquiera de los números (gracias a las funciones de ofuscamiento irreversible que proporcionan los algoritmos de cifrado). Es decir, aún conociendo la llave pública, es virtualmente imposible deducir cual número privado le corresponde. Desde luego, siempre queda la opción de recurrir a la fuerza bruta, lo que significaría intentar descifrar un criptograma mediante un proceso recursivo y aleatorio. Si bien esta técnica pudiera funcionar, tomaría (utilizando una computadora convencional) aprox. ¡6.4 cuatrillones de años encontrar el número correcto!

Vayamos ahora al siguiente tema.

Función Hash Criptográfica o Algoritmo de Digestión de Mensajes

Las funciones hash criptográficas o simplemente funciones hash, a diferencia de las funciones de cifrado, sólo producen una especie de huella digital o identificador único coloquialmente conocido como “hash” el cual es irreversible y de una longitud consistente. Es decir, aquello que se “hashea” mediante una función hash no puede de ninguna manera revelar el contenido que lo produjo. Una característica de las funciones hash es que pueden aceptar todo tipo de datos sin importar el formato o tamaño y con base en el contenido proporcionado producir un valor hash consistente y corto. Esto significa que pudiéramos hashear desde una simple palabra, hasta un archivo de miles de Petabytes y aún así obtener como resultado la misma longitud de hash.

La función hash utilizada mayormente en bitcoin es llamada SHA-256. Por ejemplo, si hasheo la palabra “Manzana” con la función SHA-256, el resultado sería “d6d5ea11336d74a0c0b58588e94c327198f63714af423a9022e7e7ebc0ed0bb2”. Puedes intentarlo aquí: http://www.xorbin.com/tools/sha256-hash-calculator

Curiosamente, si hasheo la misma palabra pero con la “m” en minúscula, el resultado será completamente distinto: “5795b07249101ff3a8efedbebc7d4d1282026403b0a1a063cf9931d105776570”. Como puedes observar, una de las características importantes de las funciones hash es la impredecibilidad. No importa cuan mínimo sea el cambio que sufra el contenido original, el resultado del hash será diferente.

Otro punto a observar es la longitud de 64 caracteres. ¿Por qué 64 caracteres? Cada caracter del hash es un valor hexadecimal el cual ocupa 4 bits (medio byte) en la memoria. En vista de que SHA-256 produce un hash de 256 bits, si dividimos 256/4, el resultado son 64 caracteres. Descuida, para fines de este artículo no es necesario que conozcas los sistemas de numeración y formatos de codificación. Dejaremos esos temas para otra ocasión.

¿Para qué nos sirven los valores de hash?

Sirven para otorgarle un identificador único a cualquier tipo de contenido digital, permitiéndonos en cualquier momento verificar la autenticidad e inmutabilidad del contenido original.

Supongamos que Armando desea descargar un software para edición de imágenes llamada GIMP. Armando entra al sitio web oficial para descargarlo pero por alguna razón ninguno de los hipervínculos de descarga funcionan. En su desesperación se da a la tarea de googlear y encuentra un sitio alterno que ofrece la descarga del mismo software. Esta vez el vínculo funciona y la descarga se lleva a cabo. Pero justo antes de darle doble click al ejecutable de instalación, le surge una duda. ¿Cómo saber si el ejecutable es genuino y no contiene algún virus o trojano?

Armando se pone a investigar y alguien en algún foro le sugiere que revise el “hash” del archivo con la función de hash MD5 (al igual que SHA-256, MD5 es otra función de hash) y lo compare con el hash publicado en el sitio oficial. Siendo un tema nuevo para Armando, continua investigando y resulta que efectivamente en el sitio oficial de descarga aparece un texto largo llamado “MD5 Hash Sum”:

El ejecutable gimp-2.8.22-setup.exe produce el valor hash “8e54225029a44ab6ef1fde09686fec7b”

Teniendo ya el hash del archivo oficial, ahora es cuestión de que Armando encuentre una manera de computar el hash del archivo descargado y lo compare con el original. Siendo Armando un usuario de Windows, encuentra esta utilería: https://support.microsoft.com/en-us/help/889768/how-to-compute-the-md5-or-sha-1-cryptographic-hash-values-for-a-file

Finalmente logra generar el hash y al compararlos resulta ser el mismo. Cualquier insignificante modificación que el ejecutable original hubiera sufrido, daría como resultado un hash distinto.

Desde una consola de MacOS. El comando “md5” forma parte parte del sistema.

Como puedes observar, mediante este mecanismo es muy fácil y confiable validar la autenticidad de cualquier tipo de contenido. Puede tratarse de un software, un PDF, una canción, un documento de word, una palabra, una frase, etc. En el tema de la firma digital, veremos los beneficios de hashear texto simple.

Firma Digital

Por último, veamos cómo funciona y para qué sirve una firma digital. Como su nombre lo dice, se trata de una firma la cual no sólo valida la autenticidad del contenido, sino también vincula a un individuo o entidad con el contenido mismo. Es decir, el autor “imprime” evidencia irrefutable de su involucramiento sobre dicho contenido.

La firma digital no es más que el criptograma producido por una llave privada el cual deberá posteriormente descifrarse con la llave pública, para que así cualquier persona pueda verificar su autenticidad al comparar el texto claro descifrado con el contenido original. ¿Un poco confuso? Descuida, ya verás.

¿Para qué sirve la firma digital?

En vista de que el propósito es comprender la firma digital y su relación con el protocolo bitcoin, considero adecuado analizar la manera en cómo se firma digitalmente una factura electrónica debido a ciertas similitudes con algunos procedimientos en bitcoin. Aclaro que trataré el tema de la manera más genérica y simple posible, sin apegarme a los estándares de ninguna institución tributaria.

Una factura electrónica permite autentificar y validar la emisión de la misma, evitando falsificaciones, clonaciones, malformaciones, etc.

El primer paso consiste en obtener un par de llaves asimétricas (privadas y públicas) por parte de la institución tributaria. Ésto sucede generalmente cuando el contribuyente se inscribe y obtiene licencia para operar comercialmente en su localidad. En este caso particular, es la institución la que se encarga de generar el par de llaves asimétricas mediante un procedimiento confidencial, resguardando en sus sistemas sólo la llave pública del contribuyente.

Veamos un ejemplo:

Camilo se dedica a la ganadería y lleva tiempo emitiendo facturas electrónicas. Para ello tuvo que acudir a la institución hacendaria correspondiente para inscribirse y obtener sus llaves criptográficas que le permiten emitir y firmar digitalmente facturas reconocidas por su gobierno.

Imagen obtenida de Google Images. Los datos sensibles fueron ofuscados a propósito.

La imagen previa muestra una factura electrónica y sus distintas secciones, algunas de las cuales nos interesa analizar. Aclaro que fue necesario ofuscar algunos datos debido a que la imagen fue tomada de Google Images.

Una factura por lo general consta de los siguientes datos: Datos del emisor (vendedor), datos del cliente, número de folio, fecha de emisión, descripción del producto, cantidad, precio, subtotal, impuestos, gran total, etc.

Para fines de este ejercicio, supongamos que los datos de la factura son los siguientes:

  • Folio: 12345678
  • Fecha de Emisión: 2012/12/19
  • Vendedor: Camilo López García
  • Domicilio Vendedor: C. Las Rosas 1343, Col. Los Girasoles, 43433, BCS
  • ID Fiscal Vendedor: CAM121212DF3
  • Cliente: Sofía Gómez Hernández
  • Domicilio Cliente: C. Guirnaldas 1242, Col. Los Rosales, 42413, BCS
  • ID Fiscal Vendedor: SOFI131313AF3
  • Producto: 6 TOROS COLORES DISTINTOS
  • Precio: 73, 800
  • Impuestos: 0
  • Gran Total: 73, 800

Dicho contenido se tendrá que firmar digitalmente, autentificando así los datos especificados. Estas son algunas de las implicaciones (beneficios) de la facturación electrónica:

  • Camilo (el emisor) no podrá refutar tales datos en caso de alguna disputa con las autoridades fiscales (evasión de impuestos, etc.) ya que se asume legalmente que sólo él posee la llave privada para firmar las facturas, motivo por el cual es de crucial importancia mantener la llave privada bajo absoluto resguardo
  • En caso de que algún impostor utilice los datos fiscales de Camilo para emitir facturas apócrifas, la firma digital no correspondería a la esperada (suponiendo que el impostor no tiene la llave privada de Camilo), por lo tanto no habría ninguna repercusión legal hacia Camilo
  • Las autoridades fiscales no podrán tergiversar de ninguna manera los datos de la factura, tampoco generar facturas sin el consentimiento de Camilo

Ahora bien, ¿De qué manera se produce la firma?

El primer paso consiste en darle estructura a los datos. En la imagen se puede observar esta sección:

En este tipo de facturas, a los datos bajo un formato estructurado se le llama “Cadena Original”.

La “Cadena Original” representa el grupo de datos que deben firmarse. El formato y la posición de cada dato lo determina la institución tributaria. Como podrás observar, en este caso se utiliza un formato delimitado por “pipes”, es decir, el símbolo “|”. Construyamos la cadena utilizando los datos ficticios previamente mencionados:

12345678|2012/12/19|CAMILO LÓPEZ GARCÍA|C. LAS ROSAS 1343, COL. LOS GIRASOLES|43433|BCS|CAM121212DF3|SOFÍA GÓMEZ HERNÁNDEZ|C. GUIRNALDAS 1242|COL. LOS ROSALES|42413|BCS|SOFI131313AF3|6| TOROS COLORES DISTINTOS|73, 800|0|73,800

Bien, ya tenemos los datos estructurados. El siguiente paso consiste en generar el hash de tal cadena. Es este hash el que de hecho se cifrará (firmará).

¿Por qué no simplemente cifrar la cadena directamente?

Si bien lo pudiéramos hacer, es considerada una buena práctica sólo cifrar el hash del contenido. Ésto ayuda a optimizar el proceso de cifrado y a lidiar con otro tipo de problemas. A final de cuentas, el propósito de la firma electrónica no es transferir datos cifrados, sino sólo validar la autenticidad, por lo tanto utilizar sólo el hash tiene absoluto sentido.

El hash de la cadena generado con el algoritmo SHA-256 es el siguiente: 321CC87769609E0BD92FE12F0DADB173BCB34B1312629BF4F010DD5E620038C8

Se puede generar en línea desde este sitio: http://www.xorbin.com/tools/sha256-hash-calculator.

Ya sólo nos queda cifrar el hash con la llave privada, cuyo resultado codificado con Base64 produciría algo similar a ésto:

Tal vez te preguntes con qué herramienta se produce este cifrado. Este tema lo veremos más a detalle en la siguiente parte de este artículo.

Cabe mencionar que “Sello Digital” es sinónimo de “Firma Digital”.

Para corroborar la autenticidad de la firma, sólo se requieren 2 elementos:

  • La llave pública
  • La cadena original

Nótese que en este particular caso no es necesario incluir la llave pública en la factura ya que la institución tributaria mantiene una copia en su sistema.

Para validar la firma basta con revertir el proceso:

  1. Primero se descifra la firma cuyo resultado sería el hash de la cadena original. Llamémosle a este hash “h1”
  2. Después se debe hashear la cadena original encontrada en la factura. Llamémosle “h2”
  3. Finalmente al comparar “h1” y “h2” se debe obtener un resultado idéntico, de lo contrario la firma se consideraría inválida

¡Listo! Si seguiste paso a paso este artículo, seguro tendrás las bases suficientes en criptografía para continuar con la siguiente parte en la cual veremos a detalle cómo se aplican estos conceptos en los wallets y en varios aspectos del protocolo de bitcoin.

¡Felicidades!

Cualquier comentario, sugerencia o pregunta es bien recibido.