Teoría de la complejidad y acuerdo Diffie-Hellman

Juan Vera del Campo - juan.vera@professor.universidadviu.com

Como decíamos ayer...

center

El cifrados de flujo y de bloque permiten enviar mensajes computacionalmente seguros

Solo necesitamos que las dos partes tenga una clave secreta en común

¿Cómo conseguimos que las dos personas que no se han visto nunca tengan una clave secreta común?

Hoy hablamos de...

  1. Teoría de la complejidad
  2. Acuerdo de clave Diffie-Hellman
  3. Conclusiones

Teoría de la complejidad

Algoritmos de ordenamiento

center

Algoritmos Complejidad temporal Complejidad espacial
Selection
Bubble
Quick Sort

¿Cuál es la velocidad máxima teórica a la que podemos ordenar?

https://www.geeksforgeeks.org/time-complexities-of-all-sorting-algorithms/

Teoría de la complejidad

Ciencia que estudia cuánto tiempo lleva resolver un problema al algoritmo más rápido posible

Criptografía: dado un mensaje cifrado con cierto algoritmo ¿existe un algoritmo más rápido que la fuerza bruta... aunque aún no sepamos cuál?

¿Cuánto tiempo tardarías en resolver este sodoku?

center

  • Normas normales de Sudoku, y además...
  • Las casillas separadas por movimientos de rey o caballo de ajedrez no pueden tener el mismo número
  • Las casillas directamente adyacentes no tienen números consecutivos. Ejemplo: no hay un 6 encima, debajo, a la izquierda o la derecha de un 5 (en diagonal sí se puede)
  • Pruébalo: The Miracle, de Mitchell Lee
  • ¿Cuánto tiempo estimas que te llevará resolverlo?
  • ¿Cuánto tiempo le llevará a un algoritmo que sea el más rápido posible?

Simon Anthony: "It might have a unique solution but it's not gonna be findable by a human being"

Hacer un algoritmo de fuerza bruta para un Sudoku es "sencillo": vamos comprobando números y, si funcionan, los dejamos

Eso se parece mucho a resolver por fuerza bruta un cifrado clásico

Pero estamos interesados en conocer el tiempo teórico que le llevará al algoritmo más rápido posible

center

10 veces más casillas... ¿necesita 10 veces más tiempo? ¿ó 100 veces más tiempo? ¿ó 1000 veces más tiempo? ¿podremos acaso solucionarlo?

Si al aumentar el tamaño de un problema el tiempo necesario para resolverlo sigue siendo "razonable", decimos que es un "problema P"

¿Cuánto tiempo tardarías en comprobar si ésta es la solución?

center

https://www.youtube.com/watch?v=yKf9aUIxdb4

Mucho tiempo para resolver, poco para comprobar

Existen algunos problemas que si aumenta el tamaño ya no podremos solucionarlos en un tiempo razonable

Pero si nos dan una solución, es muy rápido decidir si la solución correcta

Si lleva poco tiempo decidir si una solución es válida para un problema, decimos que es "un problema NP"

¿Cuánto tiempo tardas en colorear este mapa con 9 colores diferentes?

center

Transformación de problemas

  • Si los el Sudoku y colores parecen similares, es porque lo son
  • Se puede expresar un Sudoku como un problema de colorear mapas y viceversa
  • Si podemos pasar rápidamente de un problema a otro y tenemos un algoritmo rápido para resolver uno, podemos resolver también el otro rápidamente

Si un problema NP se puede transformar en otro problema NP, entonces es un "problema NP-Completo"

Seguridad basada en problemas NP

Los matemáticos se han dado cuenta de que existen...

  • Problemas P: se pueden resolver en un tiempo razonable
  • Problemas NP: si te dan una solución, se puede verificar en un tiempo razonable. Fíjate: no sabemos si estos también se pueden resolver en un tiempo razonable
  • Problemas NP-completos: se pueden convertir en otro problema que sepamos resolver en un tiempo razonable

A partir de ahora vamos a basar la seguridad en problemas:

  • Que el criptoanálisis sea NP y por tanto probablemente no razonable
  • Que sea corto decidir si algo es solución: el cifrado y descifrado es P y es razonable

Si además podemos convertir unos problemas en otros y sabemos que un problema es "computacionalmente seguro", el otro también lo será. Por tanto:

  • El problema concreto en el que basemos la seguridad no importa siempre que sea equivalente a otro considerado seguro
  • Escogeremos el problema que sea más sencillo de programar

Requisitos de New Directions in Cryptography, Diffie y Hellman, 1976. Hablaremos más de este paper en unos minutos

P = NP?

  • Un problema P es también un problema NP, pero...
  • ¿Todos los problemas NP son también P? ¿Y qué pasa con los NP-Completos?
  • No sabemos si P es igual a NP, o si todos los problemas NP son NP-completos
  • La seguridad actual se basa en la fuerte sospecha de que hay problemas NP que no son P ni NP-Completos

center

Definición formal: https://en.wikipedia.org/wiki/P_versus_NP_problem
¿Afecta a la criptografía?: https://security.stackexchange.com/questions/12802/how-will-security-need-to-be-changed-if-p-np

Ejemplos de problemas NP

  • Sodoku, Colorear mapas, El problema del viajante...

center

  • Logaritmos discretos, Factorizar números...

https://www.explainxkcd.com/wiki/index.php/399:_Travelling_Salesman_Problem

"Mucho tiempo": una definición

Hemos hablado de "tiempos razonables", "rápidamente" y "mucho tiempo"

... ¿podemos formalizarlo?

Cota superior asintótica: notación "big-O"

Escribimos que un algoritmo es de complejidad si el tiempo que lleva ejecutarlo cuando es como máximo

Fíjate que también puede tender a infinito...

Lo importante es comparar las velocidades: ¿cómo crece el tiempo de ejecución cuando crece ?

¿Linealmente? ¿Exponencialmente?

Fuente: https://en.wikipedia.org/wiki/Big_O_notation

center

Fuente: https://laptrinhx.com/time-complexity-and-big-o-529699432/

big-O en criptografía

En criptografía, es el tamaño de la clave en bits

Queremos algoritmos que el atacante necesite realizar operaciones de fuerza bruta: crecimiento exponencial con el tamaño de la clave

Pero también queremos que, conociendo la clave, el descifrado solo necesite operaciones: crecimiento polinomial con el tamaño de la clave

Un algoritmo está roto si el atacante necesita muchas menos de operaciones

Ejemplo: si queremos aumentar la seguridad de un algoritmo, pasamos de una clave de 128 a 256 bits

  • Cifrado : ahora costará el doble descifrar con la nueva clave
  • Mejor ataque posible : al atacante le costará veces más encontrar la nueva clave

Nota que no necesitamos conocer el ataque: si se demuestra que el mejor ataque es de orden , entonces el sistema es seguro aunque no conozcamos cómo es el ataque

"Tiempo razonable", la definición

Nota: las clases de problemas P, NP, NP-completo... en realidad se definen con notación big-O:

  • P: problemas resolubles en tiempo polinomial
  • NP: problemas comprobables en tiempo polinomial para algún valor de .

Recuerda: un sistema es seguro computacionalmente si cualquier algoritmo probabilístico en tiempo polinomial solo puede romper el algoritmo con probabilidad negligible en

(falta definir eso de "probabilidad negligible", pero no lo haremos en este curso)

Problemas útiles en criptografía

  • Factorización en números primos
  • Logaritmo discreto
  • Curvas elípticas: las veremos en el tema 5

Ejemplo: factorización en números primos

Es un problema NP y probablemente ni P ni NP-Completo

El algoritno conocido más rápido es GNFS:

Logaritmo discreto

Problema NP y probablemente no es NP-completo

Si conoces , y ...

Problema: encuentra

1 5
2 8
3 6
4 13
5 14
6 2
7 10
8 16
9 12
10 9
11 11
12 4
13 3
14 15
15 7
16 1

¿Cuánto vale ? Solo podemos calcularlo por fuerza bruta, probando valores de m

Gupo cíclico

La transparencia anterior muestra un ejemplo de grupo cíclico:

  • y tienen que ser primos relativos: no tienen factores comunes
  • Llamamos generador al número , y es el orden
  • contiene todos los números entre 1 y una sola vez

El "aspecto" es el de una permutación pseudoaleatoria del cifrado de bloque, con el mensaje en claro y el cifrado

Dado un mensaje cifrado y conocido y , decidir si el mensaje en claro es el mensaje original es tan complejo como resolver el problema del logaritmo discreto.

https://en.wikipedia.org/wiki/Cyclic_group

D-H

Acuerdo de clave Diffie-Hellman

D-H

center

El cifrados de flujo y de bloque permiten enviar mensajes computacionalmente seguros

Solo necesitamos que las dos partes tenga una clave secreta en común

¿Cómo conseguimos que las dos personas que no se han visto nunca tengan una clave secreta común?

D-H

Diffie-Hellman

Método de acuerdo de clave simétrica (RFC2631, 1999)

New Directions in Cryptography, Whitfield Diffie y Martin Hellman en 1976

Primer algoritmo de criptografía asimétrica conocido y base de muchos de ellos

Lo estamos utilizando constantemente

D-H

Hipótesis DDH (Decisional D-H)

es grupo cíclico con el elemento generador y primo

Problema: dado , ¿cuál es el valor de ?

Calcular solamente a partir de es computacionalmente difícil: primero tendríamos que calcular a partir de , y eso es el problema del logaritmo discreto

(Recuerda que )

Pero si también nos diesen ó , entonces y es muy fácil de calcular

Que nos den ó se conoce como "trampa" o "trapdoor". Sin conocer la trampa, el problema se considera muy difícil computacionalmente

D-H

Vamos a diseñar un protocolo entre Alice y Bob para que usen la clave :

  • El atacante solo conoce y : problema difícil
  • Pero Alice y Bob conocen también ó : problema fácil

Se asume que es computacionalmente difícil de calcular para el atacante al ser equivalente al problema del logaritmo discreto. En 50 años no hemos encontrado una forma rápida (es decir, polinomial ) de hacer este cálculo sin conocer previamente ó

Si lo necesitas, consulta la definición de Alice y Bob en el glosario

D-H

Protocolo D-H

Dos usuarios y que no se han visto nunca:

  1. Acuerdan y primos entre sí
  2. Escogen números en secreto y
  3. Se envían entre ellos:
  4. Calculan en secreto:
    • :
    • :
  5. Y usan como clave de cifrado un algoritmo simétrico
D-H

Ejemplo sencillo:

center

Aunque un atacante conozca , , y , no podría calcular más que por fuerza bruta. En cambio, Alice y Bob han podido calcular muy fácilmente

D-H

Claves secretas y claves públicas

  • Alice y Bob acuerdan y primos entre sí por canales que no son seguros. El atacante conoce y
  • Cuando Alice y Bob se intercambian y , el canal aún no es seguro. El atacante conoce y
  • y nunca salen de los ordenadores de Alice ni Bob, nunca se intercambian. El atacante no los conoce, Bob no conoce y Alice no conoce

Dado que el atacante (o cualquiera) conoce , , y , esta información es pública

y es información privada y solo conocida por Alice y Bob, respectivamente

D-H
Paso 1 Qué sabe Alice Qué sabe Bob Qué es público
1 , , ,
2 , ,
3 ,
4

Recuerda hipótesis DDH: solo se puede calcular fácilmente si conoces o bien o bien , pero no se puede calcular fácilmente si conoces solo y

Alice y Bob, que no se habían visto nunca antes, puede utilizar como clave de un cifrado simétrico de flujo o bloque como ChaCha20 ó AES

D-H

Llamamos:

  • Claves de Alice:
    • Clave pública:
    • Clave privada:
  • Claves de Bob:
    • Clave pública:
    • Clave privada:

Después del D-H ya no necesitan más estas claves y puede borrarlas...

... pero quedaos con el concepto, que lo usaremos dentro de poco

D-H

Selección de parámetros

D-H tiene cuatro parámetros: los secretos , y los públicos ,

"Paso 1: Alice y Bob acuerdan y primos entre sí"

La seguridad del algoritmo depende de que estos números estén bien escogidos

  • Si no son primos entre sí o si no es primo, es más fácil calcular
  • Si no cumple algunas propiedades, existen algoritmos que pueden calcular
  • Si no es lo suficientemente grande, se puede romper por fuerza bruta
  • tiene que ser generador de

¡Estas son muchas condiciones! ¿Cómo podemos escoger y bien?

D-H

Afortunadamente no tenemos que escogerlos:

Ejemplo real:

p = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A6
7CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F
14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B
7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF
0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552B
B9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B
E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183
995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A8
5521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF
5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D876
02733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24
FA074E5AB3143DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF
g = 2

Fuente: https://github.com/amiralis/pyDH/blob/master/pyDH/pyDH.py

D-H

Debilidades

¿Qué sucede si Malloy se pone en medio de un D-H?

center

Alice y Bob están hablando en secreto... con el atacante

D-H

D-H necesita claves mucho más largas que AES: tiene que ser primo, y los primos están separados entre sí

Para acordar claves AES (que podemos aprovechar todos los números, primos o no) necesitamos una clave D-H (la , que solo puede ser primo) de...

AES (bits) D-H (bits)
128 3072
256 15360

NIST recomienda hasta 2030

Compara, para AES:

https://blog.cloudflare.com/why-are-some-keys-small/
https://www.keylength.com/en/3/

D-H

Uso de la clave D-H con AES o Chacha: Función derivación de clave KDF

El número secreto generado por el intercambio Diffie-Hellman no debe utilizarse como clave en protocolos de cifrado simétrico AES o Chacha ChaCha20: no es perfectamente uniforme

Se utiliza una transformación KDF (Key Derivation Function). ​ Las KDF se pueden utilizar para extender claves en otras más largas o para obtener claves en un cierto formato. Las funciones de hash pueden usarse como KDF, aunque suelen incluir también inputs adicionales

Más información aquí:

D-H

Composición de elementos criptográficos

Acamos de ver una composición de elementos criptográficos: D-H y AES

  • Alice y Bob acuerdan una clave AES-256 utilizando DH-4096
  • Alice y Bob utilizan esa clave para comunicaciones seguras con AES.

Esto es solo una presentación de TLS. En la última parte de la asignatura veremos este protocolo con mucho más detalle.

Hash

Conclusiones

Hash

Resumen

  • Hay una serie de problemas difíciles de resolver pero fáciles de comprobar: son los NP, en los que basaremos los demás sistemas que veremos
  • La existencia de que estos problemas realmente son difíciles de resolver es una asunción de la criptografía actual. Amenaza: computación cuántica
  • El problema del logaritmo discreto es uno de estos problemas y la base de muchos algoritmos
  • D-H (en realidad, su actualizació para curvas elípticas "ECDH" que veremos en el tema 5) se utiliza para acordar una clave simétrica al inicio de una comunicación entre dos personas que no se conocen previamente
  • Ahora tenemos claves divididas en dos partes: una parte es pública, la otra es privada
Hash

Referencias

  • New Directions in Cryptography, Whitfield Diffie y Martin E. Hellman, 1976. El paper describe parte de la teoría de la complejidad que hemos estudiado aquí y describe el intercambio de claves Diffie-Hellman
  • NP-Hardness, capítulo 12 del libro Algorithms de Jeff Erickson. Aunque no está enfocado a la criptografía, es una buena explicación de los problemas P y NP.
Hash

Ejercicios

https://colab.research.google.com/github/Juanvvc/crypto/blob/master/ejercicios/04/T4 - Acuerdo de claves D-H.ipynb

Hash

¡Gracias!

Parecería que con lo que conocemos ya hemos resuelto el problema de comunicar dos personas de forma secreta Pero en realidad tenemos un "elefante en la habitación": las dos personas necesitan tener una clave en común. Fíjate que no se conocen de antes: no pueden tener un "libro de claves" como los espías del siglo XX, y solo tienen Internet para comunicarse. No pueden llamarse por teléfono para enviarse la clave. ¿Cómo se intercambian una clave de forma segura dos personas que no han hablado nunca antes, ni tienen otra forma de comunicació que Internet? Este es el problema de intercambio de clave. No fue resuelto hasta 1976 con una serie de conceptos completamente nuevos: cada persona tiene dos claves, una pública conocida por todo el mundo y otra privada y secreta. El algoritmo inventado en 1976 se llama Diffie-Hellman, y aún lo estamos utilizando. Antes de empezar necesitaremos un poco de teoría de complejidad. Vamos allá.

Hablaremos de la teoría de la complejidad desde un punto de vista abstracto y sin entrar en detalles Todo lo que vamos a decir tiene una enorme literatura detrás y basada en la lógica y el álgebra Por si fuera poco, es un campo del que aún no conocemos casi nada: hay aún muchas preguntas abiertas El nombre "teoría de la complejidad" está muy bien escogido para describir el campo. Vamos a intentar saber de qué va

Dado un conjunto de datos, existen varios algoritmos que permiten ordenadores: quick sort, bubble, merge... ¿Por qué hay varios algoritmos? Algunos son muy rápidos pero consumen más memoria, otros son muy rápidos si los datos ya están casi ordenados... ¿Existe un algoritmo que sea "el mejor de todos"? Igual que existe una velocidad máxima de la luz... ¿existe una velocidad máxima para ordenar un array?

No dice **cuál** es el algoritmo más rápido posible, solo calcula **cuánto tiempo** le llevará resolver el problema al mejor algoritmo posible. Si nuestro algoritmo tarda más... sabemos que aún podemos mejorar "el tiempo mínimo en resolver un problema" es para el problema general, puede haber algunos problemas que teóricamente son complejos pero que "con suerte o por las características concretas d eeste problema" se puede resolver fácilmente A veces no interesa resolver un problema "en el menor tiempo posible", sino que utilizando "la menor cantidad de memoria posible". Aquí solo he hablado del tiempo como criterio de "mejor", pero en ocasiones se buscará optimizar el uso de "memoria"

Una manera de resolver el sudoku es simplemente probar números uno a uno hasta que se verifique el resultado. Esto es fuerza bruta. ¿Hay algoritmos mejores? Claro que sí, podemos ser inteligentes: "si esto es un 2, entonces todas estas casillas no pueden contener un 2". **Esto es mucho más eficiente que la fuerza bruta** ¿Cuánto tiempo mínimo le lleva al algoritmo más eficiente posible? De esto va la teoría de la complejidad. Nota: el objetivo de la teoría de la complejidad no es descubrir el algoritmo más eficiente. **Queremos saber cuánto tiempo le llevará al algoritmo más eficiente para resolver un problema incluso aunque no sepamos cuál es ese algoritmo perfectamente eficiente**. Si diseñamos un sistema de cifrado y podemos demostrar que el mejor atacante, el que use los mejores algiritmos posibles, incluso aquellos que no están aún inventados, va a tardar un tiempo descomunal para romper el sistema... entonces el cifrado es seguro.

Nota: casi siempre será posible resolver las cosas por fuerza bruta, pero a veces habrá algoritmo mejores En AES no, en AES y en otros algoritmos simétricos sospechamos que la fuerza bruta es el mejor algoritmo posible. Eso es estupendo. Pero AES no resuelve el problema de intercambiar claves. Para intercambiar una clave de forma segura, a los criptógrafos se les ocurrió probar unos sistemas basados en problemas que podrían tener soluciones mejores que la fuerza bruta. Y decidieron que usar esos problemas era aceptable, siempre que el mejor algoritmo necesitase un tiempo no razonable para resolverlos. Definiremos qué significa tiempo creciente con el tamaño del problema exactamente:creciente de forma .... ¿lineal? ¿polinomial? ¿exponencial? Adelanto: razonable significa polinomial: el tiempo necesario para resolverlo crece de forma polinomial con respecto a su tamaño

No es una pregunta trampa: tardamos pocos segundos. Mucho menos tiempo que en resolver el Sudoku En el vídeo, Simon resuelve el Sudoku que parecía imposible en 20 gloriosos y emocionantes minutos

La teoría de la complejidad se centra en "problemas de decisión", aquellos cuya respuesta es Sí/No - ¿Es esta solución válida para un problema? - ¿Es esta solición óptima? Casi todos los problemas se pueden replantear como una pregunta SI/NO.

El problema tradicional es "con 4 colores", que resulta ser el mínimo posible con cualquier mapa. Pero vamos a exigir 9 colores para poder hacer una observación interesante a continuación. Obviamente, si 4 colores es el mínimo posible, tiene que ser posible hacerlo con 9 que son más y por tanto además será más fácil.

Los problemas NP-completos son muy interesantes: si podemos resolver uno de ellos rápidamente, de rebote podremos resolver una clase enorme de problemas a la vez. En el enlace, solucionan un Sudoku transformándolo primero a un problema de coloreado de mapas, resolviendo el problema de coloreado de mapas y deshaciendo la transformación a un Sudoku

Esta es una discusión muy interesante para las matemáticas y que podría tener alguna implicación en criptografía, pero a niveles prácticos nos afecta poco

Vamos a ver con más detalles el problema del logaritmo discreto, porque es el que se usa en casi todos los sistemas que veremos a partir de ahora

Fijaos: se están mapeando todos los números de 1 a 17 en otros números de 1 a 17 de forma "aleatoria". Esto es un "grupo cíclico" Eso se parece mucho a una permutación pseudoaleatoria, de las que usábamos en el cifrado de bloque

Ya tenemos los conocimientos suficientes para presentar el problema de la primera transparencia:

Simplemente recordemos cuál es el problema que queremos resolver hoy: ¿cómo conseguimos que las dos personas que no se han visto nunca tengan una clave secreta común?

Su paper de 1976 es, junto con el de Shannon (capítulo 1), uno de los más importantes en cruptografía

Recuerda: sabemos que el problema del logaritmo discreto es NP, pero no sabemos si también es P y por tanto y fácil de resolver. Sospechamos muchísimo que no es P y que el algoritmo más rápido posible tomará un tiempo exponencial con el tamaño de la clave. Pero no estamos *matemáticamente* seguros. ¿es P=NP o no? No lo sabemos.