La criptografía es una de las piezas fundamentales sobre la que se construye la tecnología blockchain, por lo que para comprender el funcionamiento de cualquier blockchain (como Bitcoin o Ethereum) debemos tener claros algunos conceptos básicos de esta disciplina.

¡Qué nadie se asuste! Aunque la criptografía es una rama de las matetmáticas y de la informática que trata de algoritmos que pueden llegar a complicarse bastante, la buena noticia es que los conceptos básicos que necesitamos entender para obtener un buen conocimiento de cómo funciona un blockchain se pueden explicar (y entender) de manera sencilla.

Al acabar de leer este artículo entenderás:

  1. algunos conceptos básicos (y no tan básicos) de criptografía y
  2. cómo se aplica la criptografía al blockchain y por qué es una parte fundamental de esta tecnología.

Tabla de contenidos

Criptografía

La criptografía es la ciencia que se encarga del estudio y desarrollo de técnicas de cifrado o codificado destinadas a alterar mensajes de manera que sean inentiligibles excepto para los receptores autorizados. Se encarga así mismo de garantizar la seguridad e integridad de la información en sistemas informáticos y en las redes de comunicaciones.

Algunos ejemplos de sus aplicaciones son:

  • cifrado y descifrado de mensajes,
  • firma digital para garantizar el emisor y la integridad de un mensaje,
  • protocolos de red seguros, etc.

Cifrado y descifrado

El cifrado surge de la necesidad de poder ocultar el contenido de un mensaje a todos aquellos que no sean los destinatarios del mismo. La necesidad surge porque en muchas ocasiones el mensaje no puede ser entregado en mano y por tanto debe circular por un medio de transmisión en el que puede ser observado o interceptado.

El proceso consiste en modificar el mensaje original en una versión cifrada, incomprensible e inútil por sí misma, que sólo puede transformarse de nuevo en el documento original (descrifrarse) mediante el uso de una clave. Esta clave sólo debería estar en posesión del destinatario o destinatarios del mensaje. El mensaje cifrado puede transmitirse entonces por canales "no seguros" porque aunque sea interceptado u observado no será comprensible sin la clave necesaria para descifrarlo.

Por cierto, cifrado y encriptado son sinónimos y usaré ambos términos de forma intercambiable a lo largo del artículo.

Cifrado simétrico y asimétrico

Cuando se utiliza la misma clave para cifrar y para descifrar el mensaje, hablamos de cifrado simétrico.

Diagrama cifrado simétrico
Cifrado simétrico

El ejemplo que suele ponerse tradicionalmente para explicar la criptografía simétrica es el "cifrado César". Se trata de un cifrado por sustitución en el que cada carácter del texto original se reemplaza por otro carácter que está desplazado un número fijo de posiciones en el mismo alfabeto. Así pues, la clave, que sirve tanto para el cifrado como para el descifrado, es el número de desplazamientos en el alfabeto.

Diagrama cifrado César
Cifrado César

Por tanto, en un sistema de cifrado simétrico tanto el emisor como el receptor han de conocer la clave para poder intercambiar mensajes y por tanto se plantea el reto adicional sobre cómo distribuir dicha clave de forma segura. Existen algunas aplicaciones que resuelven este problema de diferentes maneras, así que los sistemas simétricos no son per se un sistema de cifrado inferior u obsoleto (aunque sí lo es el cifrado César que se puede romper fácilmente con técnicas básicas de criptoanálisis).

Por ejemplo el protocolo TLS, que usamos cada día en nuestros navegadores web, utiliza una clave simétrica para cifrar el contenido que viaja desde nuestro ordenador hasta el servidor web correspondiente. La pregunta pertinente en este caso es, ¿y cómo intercambian de manera segura la clave de cifrado / descifrado el servidor y el cliente web? Porque no pudes cifrar un mensaje para intercambiar la clave antes de tener, precisamente, la clave... ¿O sí?

Pues sí, sí se puede intercambiar de manera segura una clave de descifrado. Criptografía asimétrica al rescate.

En un cifrado asimétrico no existe una única clave, sino dos: una clave para cifrar y otra para descifrar. Estas claves se conocen respectivamente como clave pública y clave privada. Las claves no son intercambiables, es decir, la clave pública sólo sirve para cifrar el mensaje y por tanto no se puede utilizar para descifrar y la clave privada sólo sirve para descifrar.

Ambas claves se generan simultáneamente mediante un algoritmo criptográfico determinado y por tanto están "conectadas".

La idea fundamental es que todo aquel que quiera recibir un mensaje cifrado (el receptor) genera un par de claves (generalmente con software en su ordenador) y a continuación distribuye exclusivamente la clave pública entre todos aquellos que quieran enviarle mensajes cifrados. Así pues el emisor del mensaje debe conocer la clave pública del receptor y la utiliza para cifrar el mensaje. El receptor, por su lado, utiliza la clave privada (que no ha compartido nunca con nadie) para descifrar el mensaje.

Diagrama cifrado asimétrico
Cifrado asimétrico

Podemos distribuir sin riesgo la clave pública por cualquier medio de transmisión porque esta sólo va a servir para cifrar el mensaje y no hay ninguna manera que pueda utilizarse para descifrarlo u obtener la clave privada que lo descifraría. Ambas claves están "conectadas" pero la clave privada no es "derivable" (no se puede clacular o construir) a partir de la pública.

Volvamos al ejemplo del protocolo TLS que utilizan los navegadores web para comunicarse de mancera cifrada con los servidores. Vimos que ambas partes usaban una clave compartida con cifrado simétrico, pero ¿cómo comparten el servidor y el cliente web la clave de manera segura? Una versión simplificado del proceso quedaría así:

  1. Intercambio mediante cifrado asimétrico de una clave simétrica (handshake). Al principio de la comunicación, mediante un proceso denominado handshake ("darse la mano" en español y que es una bonita metáfora de "ponerse de acuerdo antes de empezar a trabajar") el cliente y el servidor intercambian una clave simétrica de forma segura:
    1. el cliente (el navegador web) genera una propuesta de clave simétrica y la envía en un mensaje cifrado al servidor mediante criptografía asimétrica utilizando para ello una clave pública que el servidor expone para este propósito;
    2. el servidor web:
      1. utiliza su clave privada para descifrar el mensaje y recupera la clave simética que utilizarán para el resto de las comunicaciones,
      2. le da el ok al cliente.
  2. Conversación cifrada con la clave simétrica compartida. A partir de este momento ambos participantes han compartido de manera segura una clave simétrica que usan para cifrar el resto de las comunicaciones durante esa sesión.
Diagrama protocolo TLS
Protocolo TLS

Hash y funciones hash

Otro concepto criptográfico ampliamente utilizado en blockchain es el de las funciones hash.

Una función hash es un algoritmo (o serie de pasos matemáticos, si se prefiere) que dado un texto de entrada lo transforma en otro texto de salida denominado fingerprint, o bien digest o simplemente hash (algunos algoritmos prefieren una denominación u otra, pero básicamente podemos considerar que son términos sinónimos en este contexto).

Por ejemplo, una función de hash básica podría definirse como "Devuelve el último carácter del texto de entrada":

hash_devuelve_ultimo_caracter("Hola mundo") = 'o'
hash_devuelve_ultimo_caracter("Me encanta la tecnología blockchain") = 'n'

Según la Wikipedia, una buena función de hash criptográfica (a diferencia de una función de hash no criptográfica como en el ejemplo anterior), tiene las siguientes propiedades:

  1. Es determinista: la misma entrada produce siempre el mismo hash.
  2. Es rápida calculando el resultado independientemente de la entrada dada.
  3. Es imposible obtener el valor de entrada a partir del hash salida excepto probando todas las posibles entradas.
  4. Un pequeño cambio en la entrada produce un cambio tan grande en la salida que es imposible establecer una correlación entre el nuevo hash y el antiguo.
  5. No es factible encontrar dos entradas que produzcan el mismo hash.

Yo me permito añadir además que el hash producido tenga siempre la misma longitud, lo que simplifica en gran medida su uso.

Algunos ejemplos de funciones de hash criptográficas que cumplen con todas estas propiedades son: MD5 (aunque hoy día se considera problemático en algunos aspectos), SHA-2 o el más moderno BLAKE3.

Diagrama que ilustra que pequeños cambios en la entrada produce grandes cambios en el hash de salida usando la función de hash SHA-256
Ejemplo que ilustra que pequeños cambios en la entrada produce grandes cambios en el hash de salida usando la función de hash SHA-256

Firma digital

La firma digital es una aplicación criptográfica que permite determinar de forma unívoca que un determinado mensaje ha sido enviado (firmado) por un emisor específico. Esto permite al receptor:

  1. estar seguro del emisor,
  2. que nadie ha modificado el contenido y,
  3. colateralmente, impide al emisor retractarse del mensaje enviado porque no hay ninguna duda que fue él quién firmó el mensaje y que este no ha sido alterado durante la transmisión o el almacenamiento.

La firma digital utiliza hashes y cifrado asimétrico para garantizar estas propiedades.

En esencia, el emisor utiliza su clave privada para firmar el mensaje y el receptor utiliza el mensaje firmado y la clave pública del emisor para verificar la autoría y la integridad del mensaje.

Si vamos más al detalle, lo que sucede es lo siguiente:

  1. El emisor firma el mensaje.
    1. Aplica una función de hash al mensaje y obtiene un hash.
    2. Encripta el hash utilizando su clave privada, obteniendo un hash encriptado.
    3. Envía al recipiente un "sobre" que contiene el mensaje original en claro (sin cifrar) y el hash encriptado.
  2. El receptor verifica la validez de la firma (y del mensaje firmado).
    1. Extrae el mensaje del sobre y le aplica la misma función de hash obteniendo el hash real para el mensaje que ha recibido.
    2. Extrae el hash encriptado y lo descifra usando la clave pública del emisor obteniendo el hash esperado.
    3. Compara los hashes obtenidos en ambos procesos y si son iguales puede estar seguro que el mensaje ha sido firmado unívocamente por el emisor y que además este no ha sido alterado. En caso contrario la firma no se considera válida.

Obviamente, además de firmar el mensaje original, se podría encriptar el sobre resultante y de esta manera se obtendría un mensaje cifrado que contiene un mensaje firmado, de manera que podríamos enviar comunicaciones cifradas que además garantizan el emisor. Este es exactamente el proceso que ocurre cuando se envía un correo electrónico cifrado y firmado.

Diagrama firma digital
Firma digital

Criptografía y Bitcoin

Ahora que estamos armados con todo este nuevo conocimiento criptográfico, vamos a ver cómo aplica a un blockain específico: Bitcoin. Aunque cada blockchain tiene sus peculiaridades, la mayoría de ideas y conceptos se pueden trasladar de forma análoga a cualquiera de ellos.

Firma digital y Bitcoin

Para empezar a operar con el blockchain de Bitcoin, esto es enviar y recibir Bitcoins lo primero que se necesita es una "cuenta" desde la que recibir fondos y hacer transferencias. Bitcoin es una red descentralizada y permissionless por tanto cualquier usuario puede "abrir" su propia cuenta de manera independiente sin requerir la intervención o permiso de un tercero.

La generación de cuentas y el envío de fondos en el blockchain se basa en técnicas de criptografía asimétrica con pares de claves.

Abrir una cuenta, que en Bitcoin se denomina dirección, implica generar un par de claves utilizando el algoritmo ECDSA y después aplicar una serie de transformaciones sobre la clave pública para generar dicha dirección.

Puesto que tanto el algoritmo ECDSA como el algoritmo de derivación de la dirección desde la clave pública son algoritmos públicos, cualquiera puede generar estos artefactos de manera independiente con su propio ordenador (y por supuesto también existen múltiples implementaciones software y wallets que se pueden utilizar directamente).

En este momento un usuario ya tiene:

  • una dirección (cuenta) en el blockchain de Bitcoin que puede compartir con cualquiera para que le envíen fondos,
  • una clave pública que incluirá en las transacciones originadas desde su dirección para que los nodos verificadores del blockchain puedan verificar sus firmas digitales y aceptar las transacciones y
  • una clave privada que no debe compartir jamás y salvaguardar de forma adecuada (posiblemente en un wallet) con la que firmará las transacciones con origen en su dirección.

Cuando el usuario quiera disponer de esos fondos, es decir, enviarlos a otra cuenta, va a tener que demostrar a los nodos que ejecutan el blockchain que la cuenta origen le pertenece. El proceso simplificado quedaría así:

  1. El usuario construye la transacción:
    1. Construye una mensaje que (entre otras cosas) incluye: la dirección origen, la dirección destino, la clave pública y la cantidad a transferir.
    2. Firma digitalmente el mensaje anterior y lo envía a la red.
  2. Los nodos validadores validan y aceptan la transacción:
    1. Comprueban que la clave pública se corresponde a la dirección de origen.
    2. Validan la firma digital con la clave pública garantizando el emisor y la integredida de la transacción.
    3. Aceptan y persisten de manera inmutable la transacción en un bloque de la cadena de bloques.
Diagrama workflow básico de creación y uso de una cuenta en Bitcoin
Workflow básico de creación y uso de una cuenta en Bitcoin

Hashes y Bitcoin

Los diferentes blockchains utilizan las funciones de hash y los hashes asociados en muchos y diferentes lugar. Bitcoin en particular utiliza el algoritmo de hash SHA-256:

  • durante el minado,
  • como identificadores de las transacciones,
  • como identificadores de los bloques para establecer el enlace entre ellos,
  • para asegurar de manera rápida y evidente una posible alteración maliciosa de los datos (que suele ser referido en inglés como data tampering) o accidental, etc.

Cifrado y Bitcoin

El cifrado con el objetivo de encriptar información se utiliza poco o nada en la mayoría de blockchains. De hecho uno de los valores y virtudes de esta tecnología es la transparencia, precisamente lo contrario a la ocultación.

En Bitcoin (y en la mayoría de blockchains), cualquiera puede observar la cadena de bloques y ver toda la información para cualquier transacción así como otros metadatos. Toda esta información está almacenada en "texto plano", es decir sin cifrar y, por tanto, sin necesitar clave alguna para ver sus contenido.

Conclusiones

  • La criptografía es la ciencia que estudia las técnicas de cifrado para permitir el acceso a los mensajes solo a las personas autorizadas así como de garantizar la seguridad y la integridad de la información en los sistemas y redes de comunicación.
    • La criptografía simétrica se basa en el uso de una única clave que sirve tanto para cifrar como para descifrar la información.
    • La criptografía asimétrica hace uso de dos claves, una pública y una privada de manera que la primera se usa exclusivamente para cifrar y la segunda exclusivamente para descifrar.
    • Los algoritmos de hash son funciones que convierten un texto de entrada en un texto de salida, generalmente más corto y de tamaño fijo. Los algoritmos de hash criptográficos tienen una serie de cualidades que los hacen idóneos para aplicaciones criptográficas.
    • La firma digital hace uso del cifrado asimétrico y las funciones de hash para permitir a un emisor firmar un mensaje de manera que el receptor tiene la garantía que el mensaje recibido fue emitido efectivamente por el emisor y que su contenido es íntegro (no ha sido modificado).
  • La tecnología blockhain utiliza la criptografía extensamente.
  • Cada cadena en particular tiene sus peculiaridades y puede utilizar algoritmos sutilmente diferentes pero la mayoría comparte las siguientes características:
    • Utilización de firma digital con criptografía asimétrica con pares de claves pública y privada para demostrar la propiedad de una cuenta (o dirección) y poder disponer de fondos (emitir transferencias a otras cuentas).
    • Generación de cuentas en la cadena de forma permissionless derivando la dirección que representa la cuenta con una función de hash aplicada a la clave pública.
    • Amplia utilización de hashes para diferentes procesos: durante el minado, como identificadores de transacciones o bloques y como mecanismo para identificar de manera eficiente la validez de los datos.

Referencias