Firmas digitales

Las firmas digitales están en el corazón de Bitcoin. Más de la mitad de los bytes que componen la blockchain son firmas. Una transacción de Bitcoin es, en esencia, un mensaje firmado con la clave privada de quien tiene esos bitcoin. El mensaje describe la transferencia de una cierta cantidad de bitcoins de unas direcciones a otras.

Para quien no conozca nada de criptografía, esta semana será la más complicada del curso. Pero es también esencial. No vamos a ver nada de las complejidades algebráicas de ninguno de los algoritmos pero tenemos que tener los conceptos claros para entender implicaciones. Antes de entrar a las firmas digitales, veamos qué es la criptografía, qué son los algoritmos de cifrado simétrico y los algoritmos de cifrado de clave pública. Con esto estaremos listos para entender las firmas digitales.

Orígenes de la criptografía

La criptografía es el arte o ciencia de ocultar(cifrar) mensajes. Digo arte o ciencia porque en los principios era más un arte que una ciencia, aunque hoy en día, la criptografía moderna es una rama de las matemáticas.

El primero de los algoritmos de cifrado fue el cifrador de César, que consistía en cambiar cada letra de un mensaje por la correspondiente a un número determinado de posiciones más adelante en el alfabeto.

Así por ejemplo si el enemigo interceptaba el mensaje “dwdfdgcdñcdprfkhfhu“, no le valía para nada. En cambio el receptor, conociendo el sistema de cifrado y la clave (en este caso, 3), podía descifrar el mensaje reemplazando cada letra por la correspondiente 3 lugares antes, obteniendo el mensaje “atacad al anochecer“. El cifrador de Cesar toma su nombre por Julio César, quien usó este método para comunicarse con sus generales.

El cifrador de César solo tiene interés histórico, nada más. Es muy malo, tiene todos los problemas. Se basa en el desconocimiento del método de cifrado por parte del enemigo y además la clave solo puede ser una de entre un número muy pequeño de claves.

Criptografía moderna

Un concepto clave en la la criptografía moderna es que la seguridad de un algoritmo de encriptación/desencriptación no debe basarse en el supuesto desconocimiento del algoritmo por parte del adversario. En la criptografía moderna el algoritmo es público y, mejor todavía, un estandar. La seguridad se basa exclusivamente en mantener secreta la clave. Por esto es importantísimo que el “espacio de claves” es decir el conjunto de todas las posibles claves, sea tan grande que el ataque por fuerza bruta (probar con todas las claves) sea inviable.

Hasta 1976, los algoritmos conocidos para cifrar/descifrar o encriptar/desencriptar, usaban siempre la misma clave en ambos procesos. Es decir, si encriptábamos un mensaje M con la clave k, obteniendo el mensaje cifrado C, entonces para desencriptar había que usar la misma clave k, para obtener el mensaje original M a partir de C.

Esta es la criptografía simétrica. Tiene muchos siglos de desarrollo y existen muchos algoritmos muy eficientes y seguros, pero tiene el problema de la distribución de claves. Para que dos personas se puedan comunicar de manera segura, las dos tienen que conocer la clave, un problema que se hace mayor cuanta más gente necesita conocer dicha clave.

Criptografía de clave pública o criptografía asimétrica

En 1976, Whitfield Diffie y Martin Hellman publicaron su trabajo titulado “New directions in criptograpy” en el que introducen el concepto de que las claves podrían venir en parejas, una para encriptar y otra para desencriptar.

A partir de este trabajo empiezan a aparecer los sistemas de clave pública o criptografía asimétrica. En estos sistemas los usuarios tienen dos claves, una privada y una pública que se deriva de la privada. Muy importante: la pública se puede obtener fácilmente de la privada, pero la inversa no es posible (es computacionalmente inviable). Para desencriptar un mensaje encriptado con la clave pública, hace falta la privada, de tal forma que el único que puede desencriptarlo es el poseedor de dicha clave privada.

Esto resuelve el problema de la distribución de claves puesto que cada usuario genera su propia clave privada y no la distribuye a nadie. Con la privada calcula la pública y ésta la distribuye a todos. En los sistemas de clave pública o de criptografía asimétrica tenemos dos algoritmos E(M) para encriptar y D(C) para desencriptar, tales que:

E(M) = C, el emisor encripta el mensaje usando la Kpub del receptor

D(C) = M, el receptor desencripta usando su Kpriv

Fig 1. Encriptación y desencriptación con sistema de clave pública

En la figura, Bob encripta su mensaje (Hello Alice!) con la clave pública de Alice, y envía el mensaje cifrado (6EB6975008E03CE4). Sólo Alice puede desencriptar el mensaje ya que sólo ella conoce su clave privada. Y no han necesitado acordar ninguna clave secreta.

Firmas digitales

Todavía no hemos hablado nada de las firmas digitales pero ya lo tenemos casi todo. En realidad los esquemas de firmas digitales son muy similares a los de encriptación con clave pública. Hay sistemas que sirven para las dos cosas (RSA, El Gamal) y sistemas que sirven solo para firmas como DSA o ECDSA, usado en Bitcoin, pero los conceptos son muy similares.

Supongamos que tenemos un algoritmo que nos permita encriptar con la clave privada y desencriptar con la pública. Igual que en el apartado anterior pero usando las claves al revés. ¿Qué sucedería si encriptamos con la privada? Pues que cualquiera podría desencriptarlo, ya que cualquiera tiene acceso a la pública. ¿Para qué vale esto? podéis pensar… Pues para encriptar no, evidentemente. Todo el mundo puede desencriptarlo (con lo cual no sirve para ocultar el mensaje) pero todo el mundo puede verificar que quien ha “encriptado” ese mensaje es el poseedor de la clave privada, ya que nadie más podría “encriptarlo” así.

En realidad este proceso no puede llamarse “encriptar“. Este proceso es más o menos equivalente a nuestro concepto de firmar. Todo el mundo puede leerlo y todo el mundo puede verificar quién ha producido el mensaje.

Este es el concepto de firma digital. Un mecanismo de criptografía de clave pública con el que podemos “firmar” un mensaje (con nuestra clave privada) y que todo el mundo puede verificar.

Fig 2. Firma digital

En la figura 2, Alice no encripta su mensaje sino que lo firma usando su propia clave privada. El mensaje va en claro, todo el mundo puede leerlo. Transmite el mensaje junto con la firma (BE459576785039E8). Bob (y cualquiera) puede verificar que la firma es auténtica y por tanto el mensaje proviene de Alice.

Una cosa importante: a diferencia de las firmas “normales” (las que hacemos con bolígrafo en un papel), las firmas digitales dependen del mensaje firmado. Es decir, “firmamos el mensaje” y si se cambia una coma del mensaje, la firma deja de ser válida.

En los contratos en papel después de firmarlos alguien podría añadir algo, poner un nombre adicional, una coma, lo que sea y (si no es una chapuza) no podríamos averiguarlo. De igual manera podemos pedir a alguien que ponga su firma en un papel en blanco y después imprimir el texto que queramos en él.

En las firmas digitales esto no sucede. No se puede modificar el mensaje y que la firma siga siendo válida. Para producir una firma válida para el mensaje modificado, por pequeña que sea dicha modificación, es necesario de nuevo la clave privada. Tampoco se puede producir una firma para un mensaje vacío y después añadir el mensaje.

Las firmas digitales no son una invención de Satoshi. Se inventaron en la década de los 70. Pero son un elemento clave en el funcionamiento de Bitcoin. Cada transacción (es decir, la transferencia de valor) es un mensaje firmado. Lo firma quien posee los bitcoin a transferir y se envían “a la clave pública” del receptor. Y de esta manera el receptor será quien los pueda gastar (transferir) a su vez, firmando un siguiente mensaje, con su clave privada.

Esto es esencial para transferir valor (a diferencia de la transferencia de información) pero sigue existiendo el problema del doble gasto. Digamos que Alice tiene 0,5 btc y firma una transacción enviando sus bitcoin a Bob y otra enviando los mismos a Carol. Puede crear las dos transacciones y las dos son válidas, bien firmadas. ¿Cómo diferenciar cuál es la buena y cuál la mala? Este es el llamado problema del doble gasto, que parecía imposible de resolver de forma descentralizada. En las próximas semanas, veremos cómo Satoshi lo consiguió.