Asegurando autenticidad en Tangle mediante firmas

1421

En el blog de hoy examinaremos más de cerca uno de los conceptos centrales de la IOTA y de cualquier moneda criptográfica, la criptografía en las Public Keys (claves públicas) y las Digital Signatures (firmas digitales).

En IOTA, para transferir tokens de una dirección a otra, se crea una operación. Una transacción contiene información sobre el pagador, el receptor y cuántos tokens se deben transferir. Por supuesto, es crucial que no cualquiera pueda crear una transacción de este tipo, sino sólo el propietario de los tokens. En el mundo jurídico esto se hace añadiendo una firma bajo un contrato. En el mundo digital tenemos firmas digitales exactamente para ese propósito. Sin embargo, a diferencia de sus contrapartes de lápiz y papel, son aún más fuertes, ya que también garantizan que ni una sola letra pueda ser cambiada en su contrato después de que haya sido firmada.

En los últimos 50 años, los investigadores en criptografía de todo el mundo han elaborado muchas teorías matemáticas sofisticadas que pueden utilizarse para las firmas digitales. Todos ellos garantizan mensajes infalsificables, pero probablemente los más fáciles de entender son las firmas basadas en hash, es decir, firmas que se basan en funciones hash.

Una función hash es una herramienta útil en criptografía, que toma una entrada y produce una salida aparentemente no relacionada. Si la función de hash es buena, entonces debería ser muy difícil revertir el proceso. Esto significa que si sólo conozco la salida, no puedo adivinar la entrada original en un tiempo razonable. Esta es la razón por la que las funciones hash se denominan funciones unidireccionales.

Eso es todo lo que necesitamos para construir las firmas digitales seguras implementadas en IOTA, utilizando el Winternitz one-time signature scheme.

Cualquier transacción IOTA se representa como una secuencia de trytes. Mientras que en el mundo humano los números están representados por los dígitos 0-9, para la IOTA en el mundo trinario consisten en trytes con valores entre 0 y 26.
Para abreviar, llamaremos a la función hash f y asumiremos que el mensaje a firmar consiste exactamente en dos trytes: m1 y m2.

Digamos que Alice creó una transacción transfiriendo 1i a su amigo Bob, y que ahora quiere probar que fue ella quien la emitió. Alice primero genera dos números aleatorios priv1 y priv2 y los mantiene en secreto como su private key (clave privada). Ella entonces hashea ambos números exactamente 27 veces con la función de hash f para obtener f²⁷(priv1) = pub1 y f²⁷(priv2) = pub2.

Figura 1: Empezando con la clave privada, genere la clave pública con suficientes pasos intermedios para cada valor tryte.

Los dos números resultantes pub1 y pub2 forman la clave pública de Alice, que luego comparte con todos como su dirección IOTA. Dado que f es una función unidireccional, no es posible determinar el priv1 y priv2 originales basándose en la public key (clave pública).

Para firmar un mensaje con esa clave, es decir, para firmar una transacción desde esa dirección IOTA, Alice toma el valor del primer tryte m1 del mensaje y pulsa su clave privada exactamente tantas veces como para obtener sign1. Entonces, cero veces si el valor de m1 es 0, una vez si m1 tiene valor 1, y así sucesivamente. Ella hace exactamente lo mismo con m2 y añade sign1 y sign2 como firma a su transacción.

Figura 2: Diagrama de cómo se deriva la firma del mensaje de ejemplo (26,2) de la private key (clave privada).

Después de esto, cualquier persona que conozca pub1 y pub2 puede verificar esta firma. Todo lo que tienen que hacer es aplicar la función hash f para sign1 y sign2 los tiempos restantes para llegar a 27 (es decir, 27 – m1 y 27 – m2 veces). Si el resultado coincide con pub1 y pub2, entonces la firma es correcta.

Figura 3: La firma del ejemplo de la Figura 2 se verifica con el hash sign1 una vez (27 – 26) y el sign2 25 veces (27 – 2) y comparando los resultados con la public key publicada.

Lamentablemente, el enfoque descrito hasta ahora todavía no es seguro:
Tan pronto como Alice firmó el mensaje (26,2), un atacante puede utilizar esa información para crear una firma válida, por ejemplo para el mensaje (27,3), simplemente pulsando el signo1 y el signo2 publicados del mensaje original, cada uno de los cuales resulta en f(f²⁶(priv1))=f²⁷(priv1) y f(f²(priv2))=f³(priv2) y, por lo tanto, la firma correcta para el nuevo mensaje.

Esto sería desastroso, ya que un atacante podría, por ejemplo, modificar la dirección de recepción en cualquier transacción firmada. Sin embargo, hay un simple truco matemático para prevenir esto: Siempre aseguramos – modificando partes del mensaje – que el mensaje está en cierto sentido normalizado: Por lo tanto, si m1 es mayor que el valor medio de un tryte, es decir, 13, entonces m2 debe ser menor que 13. Normalizado significa que la suma de ambos trytes del mensaje es siempre 26. Por ejemplo (24,2) es un mensaje normalizado válido y cualquier atacante que quiera incrementar el primer tryte a 25 también tendría que disminuir el segundo tryte a 1. Es imposible encontrar la parte correcta de la firma ya que esto requeriría invertir la última aplicación de f.

Pero aún así, este método sólo puede utilizarse para firmar un mensaje por cada private key (clave privada). Se trata del llamado sistema de firma única (OTS). El caso más obvio, para enfatizar por qué firmar más de una vez se vuelve inseguro, es el peor de los casos en el que se han firmado los dos mensajes siguientes:

1.(0,26)
2.(26,0)

Aunque ambos mensajes están normalizados, el primero revela priv1 y el segundo priv2, lo que por supuesto permitiría a un atacante firmar correctamente cualquier tercer mensaje.

Desafortunadamente, no hay una solución realmente fácil y esta es exactamente la razón por la que las direcciones IOTA no deben ser cargadas más de una vez!

Las firmas basadas en hash como las que se utilizan en IOTA dependen de la seguridad de la función de hash subyacente y -a diferencia de las firmas basadas en otras suposiciones- se consideran en su mayoría resistentes a ataques cuánticos como el algoritmo de Shor. Sus principales inconvenientes son que dan lugar a firmas bastante largas y que se trata de esquemas de firma únicos.

La motivación de la IOTA para buscar estas firmas, a pesar de sus inconvenientes, es la seriedad con la que asumimos el riesgo informático cuántico. Sin embargo, estamos considerando varias formas de evitar la limitación de la OET, como la reciente propuesta de direcciones reutilizables.

Como siempre, sus comentarios y preguntas son bienvenidos, ya sea aquí o en nuestro canal de Discord #tanglemath.

Artículo original by Wolfgang Welz: Assuring authenticity in the Tangle with signatures

 

Comentarios

comentarios

pasarela de pagos con criptomonedas