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?
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
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"
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"
Si un problema NP se puede transformar en otro problema NP, entonces es un "problema NP-Completo"
Los matemáticos se han dado cuenta de que existen...
A partir de ahora vamos a basar la seguridad en problemas:
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:
Requisitos de New Directions in Cryptography, Diffie y Hellman, 1976. Hablaremos más de este paper en unos minutos
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
https://www.explainxkcd.com/wiki/index.php/399:_Travelling_Salesman_Problem
Hemos hablado de "tiempos razonables", "rápidamente" y "mucho tiempo"
... ¿podemos formalizarlo?
Escribimos que un algoritmo es de complejidad
Fíjate que
Lo importante es comparar las velocidades: ¿cómo crece el tiempo de ejecución cuando crece
¿Linealmente? ¿Exponencialmente?
Fuente: https://laptrinhx.com/time-complexity-and-big-o-529699432/
En criptografía,
Queremos algoritmos que el atacante necesite realizar
Pero también queremos que, conociendo la clave, el descifrado solo necesite
Un algoritmo está roto si el atacante necesita muchas menos de
Ejemplo: si queremos aumentar la seguridad de un algoritmo, pasamos de una clave de 128 a 256 bits
Nota que no necesitamos conocer el ataque: si se demuestra que el mejor ataque es de orden
Nota: las clases de problemas P, NP, NP-completo... en realidad se definen con notación big-O:
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)
Es un problema NP y probablemente ni P ni NP-Completo
El algoritno conocido más rápido es GNFS:
Problema NP y probablemente no es NP-completo
Si conoces
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
La transparencia anterior muestra un ejemplo de grupo cíclico:
El "aspecto" es el de una permutación pseudoaleatoria del cifrado de bloque, con
Dado un mensaje cifrado
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
Problema: dado
Calcular
(Recuerda que
Pero si también nos diesen
Que nos den
Vamos a diseñar un protocolo entre Alice y Bob para que usen la clave
Se asume que
Si lo necesitas, consulta la definición de Alice y Bob en el glosario
Dos usuarios
Ejemplo sencillo:
Aunque un atacante conozca
Dado que el atacante (o cualquiera) conoce
Paso 1 | Qué sabe Alice | Qué sabe Bob | Qué es público |
---|---|---|---|
1 | |||
2 | |||
3 | |||
4 |
Recuerda hipótesis DDH:
Alice y Bob, que no se habían visto nunca antes, puede utilizar
Llamamos:
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 tiene cuatro parámetros: los secretos
"Paso 1: Alice y Bob acuerdan
La seguridad del algoritmo depende de que estos números estén bien escogidos
¡Estas son muchas condiciones! ¿Cómo podemos escoger
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
¿Qué sucede si Malloy se pone en medio de un D-H?
Alice y Bob están hablando en secreto... con el atacante
D-H necesita claves mucho más largas que AES:
Para acordar claves AES (que podemos aprovechar todos los números, primos o no) necesitamos una clave D-H (la
AES (bits) | D-H (bits) |
---|---|
128 | 3072 |
256 | 15360 |
NIST recomienda
Compara, para AES:
https://blog.cloudflare.com/why-are-some-keys-small/
https://www.keylength.com/en/3/
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í:
Acamos de ver una composición de elementos criptográficos: D-H y AES
Esto es solo una presentación de TLS. En la última parte de la asignatura veremos este protocolo con mucho más detalle.
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.