Tenemos confidencialidad perfecta si y solo si usamos un cifrado con las siguientes características:
Durante 30 años, desde los años 40 a los 70, este sistema se conocía como one-time-pad, "libro de claves un solo uso", y era el más usado.
Preferimos sistemas:
Un sistema así es imposible que sea perfecto, pero ¿puede ser lo suficientemente seguro?
Preferimos sistemas que, aunque puedan descifrarse, el atacante tenga que dedicar tantos recursos que no le sea práctico
Imagen: Nitin Jain, Birgit Stiller, Imran Khan, Dominique Elser, Christoph Marquardt & Gerd Leuchs (2016) "Attacks on practical quantum key distribution systems (and how to prevent them)". DOI: 10.1080/00107514.2016.1148333
Seguridad computacional: un sistema es seguro computacionalmente si cualquier algoritmo probabilístico en tiempo polinomial solo puede romper el algoritmo con probabilidad negligible en
Informalmente: un atacante no puede descifrar el mensaje:
Con la seguridad computacional hay que definir el objetivo: "quiero un sistema criptográfico que mantenga este mensaje secreto durante los próximos 100 años"
La criptografía es una de las ramas más pesimistas de la ciencia. Asume la existencia de adversarios con capacidad ilimitada de ataque, los cuales pueden leer todos tus mensajes, generar información ilegítima o modificar tus claves aleatorias a su antojo.
Curiosamente, también es una de las ramas más optimistas, mostrando cómo incluso en el peor escenario inimaginable el poder de las matemáticas y la algoritmia puede sobreponerse a cualquier dificultad.
Alfonso Muñoz, Evasión de antivirus y seguridad perimetral usando esteganografía, 2021
La criptografía computacionalmente segura permite
Hay que usar un espacio de claves lo suficientemente grande como para que no sea posible hacer fuerza bruta hoy en día, y lo suficientemente pequeño como para que sea práctico
Si tengo una "suerte media" sólo nos hará falta la mitad de las pruebas
Con hardware ad-hoc podemos llegar a multiplicar por
(
El NIST recomienda (2020, sección 5.6.3) claves en las que un atacante
tenga que hacer
A partir del 2030 prevé recomendar que un atacante tenga que realizar
Fortaleza: números de pruebas (en bits) que tiene que hacer un atacante para descifrar un mensaje
Otras recomendaciones: https://www.keylength.com/en/compare/
Cuando la comunidad criptográfica rompe un algoritmo, se sustituye por otro
... pero es mejor prevenir: los algoritmos caducan y se cambian antes de que estén rotos
Un algoritmo está criptográficamente roto si se conoce un ataque más eficiente que la fuerza bruta
AES y ChaCha
Usa la misma clave para cifrar que para descifrar
Ambas partes tienen que conocer la clave
¡Rapido y sencillo!
Ejemplos actuales: AES, ChaCha
Ejemplos rotos y obsoletos: RC4, DES, TDES
Fondo: https://www.pexels.com/photo/photo-of-person-using-magnifying-glass-7319077/
Flujo | Bloque |
---|---|
Cifra un stream continúo de datos | Divide los datos en bloques, que se cifran separadamente |
Más rápido | Más lento (a menos que exista ayuda del hardware) |
Fácil de programar: pequeños dispositivos | Más complejo |
Implementado en software | Implementado en hardware |
RC4, ChaCha20 | 3DES, AES |
Basado en los bloques de una solo uso (one-time-pad)
Idea: crea una clave tan larga como el mensaje:
...a partir de una clave
para después hacer:
PRNG: Pseudo Random Number Generator
La seguridad del cifrado depende del generador PRNG utilizado...
...y de que nunca se envíen dos mensajes cifrados con la misma clave
(vamos a repetir esto muchas veces en el curso)
Lorenz SZ fue una máquina alemana de cifrado de flujo, rota porque un operador envió dos mensajes diferentes seguidos sin cambiar la clave.
Supongamos que tenemos una función PRNG, y usamos una clave k como semilla del PRNG para cifrar un flujo de datos en una conexión
Si ciframos dos mensajes cifrados
¡Un atacante puede hacer XOR de los dos textos cifrados y obtener el XOR de los textos en claro!
Nunca hay que usar la misma clave (ni generada) con dos mensajes diferentes
Información adicional: Chosen plaintext attacks
Generar variaciones de las claves en cada transmisión
Supongamos que la semilla no es directamente la clave, sino una función de la clave y otro parámetro
Y
Ahora la semilla "es diferente" con cada tranmisión
Pero tenemos que asumir que un atacante conoce
Curiosamente: ¡esto es correcto!: reservar algunos bits de la clave para un contador:
SESAMO_1, SESAMO_2, SESAMO_3...
Este elemento se conoce como nonce y forma parte de muchos algoritmos criptográficos
El cifrado de flujo es tan seguro como:
ChaCha es el algoritmo de cifrado simétrico de flujo más usado
Alternativa al cifrado de flujo: cortar el texto en claro en bloques de la misma longitud de la clave y cifrar cada uno de los bloques
El cifrado de bloque es el muy utilizado: es rápido, no necesita exigentes o lentos algoritmos PRNG y ya tenemos hardware especializado en su cifrado/descifrado
Los cifrados de bloque se organizan como "modos de operación": como ordenamos las cajas de cifrados y descifrados.
Cada modo de operación tiene ventajas y desventajas según para qué queremos usar el sistema
Atención: hay un modo de operación que no debe usarse nunca
Si acumulamos estado durante el cifrado, podemos utilizar este estado sobre el cifrado del siguiente bloque:
Fallo obvio: está usando la misma clave para cifrar mensajes diferentes.
Eso nunca se puede hacer.
No se debe usar un cifrado de bloque en modo ECB
Los distintos encadenados requieren de una semilla inicial para empezar el encadenado: vector de inicialización (IV), que cumple la misma función que un nonce.
Esto hace que en lugar de transmitir
AES_128_CTR
es efectivamente un cifrado de flujo, siendo
Desarrollado por Vincent Rijmen y Joan Daemen (aka: Rijndael), que ganaron el concurso celebrado por el NIST para sustituir a DES en 2001.
AES (FIPS 197, 2001) es un cifrado de bloque:
background: https://whatsupcourtney.com/wp-content/uploads/2017/10/Things-to-do-in-Leuven-52-e1560945504897.jpeg
Flujo | Bloque |
---|---|
Más rápido | Más lento (a menos que exista ayuda del hardware) |
Fácil de programar: pequeños dispositivos | Más complejo |
Implementado en software | Implementado en hardware, mucho soporte ya desplegado |
RC4, ChaCha20 | 3DES, AES |
El cifrados de flujo (ej. ChaCha) y de bloque (ej. AES) 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?
El protocolo de intercambio de claves Diffie-Hellman permitió por primera vez en la historia que dos personas cualquiera que no se conocían mantuviesen una conversación confidencial por medios dgitales...
...pero su artículo no se llamó "Solución al problema de intercambio de claves". Tenía un título mucho más ambicioso: Nuevas direcciones en la criptografía
¿Qué direcciones eran esas?
Foto: https://www.publicdomainpictures.net/en/view-image.php?image=363738&picture=signpost-giving-directions (CC0)
Diffie-Hellman, RSA y curvas elípticas
New Directions in Cryptography (Whitfield Diffie y Martin Hellman, 1976) exploraba qué se necesitaba para que dos empresas pudiesen firmar un contrato mercantil:
Es la lista que conocemos como "los servicios básicos de seguridad" (tema 1)
El primer punto, "confidencialidad", se resolvía con los cifrados que estaban apareciendo ese mismo año (DES)...
...pero se necesitaba intercambiar primero una clave simétrica
Propuesta: protocolo de intercambio de claves
Y se dieron cuenta: se puede extender la misma idea para solucionar todo lo demás
También conocida como criptografía de clave pública
Cada persona tiene dos claves:
A veces son intercambiables: lo que se cifra con una se descifra con la otra
Compara con criptografía simétrica: misma clave para cifrar y descifrar, Bob y Alice tienen que manetenarla en secreto
Las matemáticas de la criptografía asimétrica utilizan funciones trampa:
No encontramos una función trampa hasta 1976
Resuelve la
Para más detalles de este problema, consulta tema 4
Resuelve la
Utilizado para acordar una clave simétrica entres dos personas antes de las comunicaciones
Idea básica:
Dos usuarios
Observa: para que un atacante que solo conoce
Paso 1 | Qué sabe Alice | Qué sabe Bob | Qué es público |
---|---|---|---|
1 | |||
2 | |||
3 | |||
4 |
Alice y Bob, que no se habían visto nunca antes, puede utilizar
El DLP, en la versión D-H de 1976, no una solución completa: permite hacer acuerdo de claves, pero no cifrado
En pocos años aparecieron nuevas funciones basadas en esas ideas: RSA, ElGammal, DSA, Pailier...
Luego, las soluciones se refinaron con curvas elípticas: ECDH (Elliptic Curves Diffie-Hellman), ECDSA (Elliptic Curves DSA)...
Fue el primer método de cifrado conocido que usaba claves públicas y privadas
Sigue usándose en la actualidad
A method for obtaining digital signatures and public-key cryptosystems, Ron Rivest, Adi Shamir, Leonard Adleman, 1978
Está basado en la dificultad en factorizar números grandes
Background: https://hsto.org/getpro/habr/post_images/453/10e/602/45310e602d784a489301bf1996edef68.jpg
Cifrado: Para enviar un mensaje a Alice, obtengo su clave pública
Descifrado: Alice utiliza su clave privada
Para crear el par de claves hay que buscar:
Es decir: la elección de un par de claves es un proceso muy lento. Segundos, minutos, horas si las claves son grandes
A cambio: el cifrado y descifrado son relativamente rápidos comparados con otros sistemas de cifrado asimétrico
El cifrado asimétrico es muy lento comparado con cualquier proceso de cifrado simétrico
Hemos visto que tanto Diffie-Hellman como RSA necesitan números primos
Los números primos están muy separados entre sí: el número de primos menores que
Ejemplo: hay
"Son pocos primos"
La criptografía asimétrica necesita claves mucho más largas que la criptografía simétrica
Fuente: https://en.wikipedia.org/wiki/Prime_number_theorem
Gráfico: https://en.wikipedia.org/wiki/Ulam_spiral
Simétrica (bits) | RSA (bits) | D-H ( |
---|---|---|
80 | 1024 | 1024, 160 |
128 | 3072 | 3072, 224 |
192 | 7680 | 7680, 384 |
256 | 15360 | 15360, 512 |
Es decir: para intercambiar una clave AES-256 aprovechando todos sus bits, necesitamos claves RSA de 15360 bits
Si usamos tamaños de clave RSA de 4096 bits (tamaño típico), podremos intercambiar una clave simétrica equivalente a AES-128
Propuestas como trap door function en 1987 por Neal Koblitz y Victor S. Miller de forma independiente
Necesitan claves más cortas que la criptografía asimétrica basadas en DLP o RSAP para ofrecer una seguridad equivalente
Dado un punto
Usamos el símbolo "suma" por tradición, pero no es una "suma geométrica"
Y lo volvemos a aplicar, varias veces, desde el mismo origen
En vez de empezar con dos puntos, podemos empezar con uno solo, y la recta inicial es la tangente a la cura. El resto sigue igual
Fuente: https://medium.com/@icostan/animated-elliptic-curves-cryptography-122fff8fcae
Esta es la trap door function:
Es la aplicación de
Dado
Eso es el problema difícil de las curvas elípticas:
La gran ventaja de las curvas elípticas en criptografía (EEC) es que nos permiten utilizar criptografía asimétrica con una clave mucho más pequeña
Simétrica | RSA | D-H ( |
Curvas elípticas |
---|---|---|---|
80 | 1024 | 1024, 160 | 160 |
128 | 3072 | 3072, 224 | 256 |
192 | 7680 | 7680, 384 | 384 |
256 | 15360 | 15360, 512 | 512 |
Es decir, pone la criptografía asimétrica al alcance de pequeños dispositivos
NOTA: RSA está basado en "factorización", DSA y D-H en "logaritmo discreto"
Característica | Cifrado simétrico | Cifrado asimétrico |
---|---|---|
Eficiencia | Muy rápido | Lento |
Claves | 1 (secreta, compartida) | 2 (una pública y otra privada) |
Tamaño de clave | 256 bits | 15360 bits (RSA), 512 bits (curvas elípticas) |
Servicios | Confidencialidad | Autenticación, integridad, intercambio de claves simétricas (Diffie-Hellman) |
Ejemplos | AES, ChaCha | RSA, ECDSA, ECDH |
RANDOM XOR MENSAJE
.Las curvas elípticas son un concepto complejo. Esto son algunas propuestas explicativas:
Ejercicios: https://colab.research.google.com/github/Juanvvc/crypto2/blob/main/ejercicios/02/Sistemas de cifrado.ipynb
Continúa en: Funciones de Hash y firma digital
Desde que los matemáticos entraron en la criptografía, existe definiciones de todos los términos tan exactas y formales como incomprensibles para un profano Cosas que implica: - Dado un texto cifrado, no conocemos nada de su texto en claro - Dado un texto cifrado, el mensaje en claro podría ser cualquiera:
Desde que los matemáticos entraron en la criptografía, existe definiciones de todos los términos tan exactas y formales como incomprensibles para un profano Lo importante es que relajamos el sistema lo suficiente como para que, por un tiempo determinado, ningún atacante con unos recursos razonables pueda descifrar el mensaje
Recordad: en el cifrado de Verman no sabíamos si habíamos encontrado una clave porque, dado un mensaje cifrado, existe una clave que puede dar cualquier mensaje imaginable con la misma longitud que el original Ahora no sucede así: si al descifrar por fuerza bruta encontramos algo con sentido, con gran probabilidad hemos encontrado la clave y el mensaje es el original Recordad: los ordenadores mejoran constantemente. Los algoritmos se diseñan para que, con la tecnología actual, se tarde miles de años en hacer fuerza bruta. Pero la tecnología mejora con el tiempo, y eso también se tiene en cuenta: aunque "se venda" que un cifrado "no puede romperse en miles de años", en realidad eso es relativo a la tecnología actual y el algoritmo tiene una caducidad de unas pocas décadas. La mejor estrategia puede ser simplemente esperar 20 años para tener un ordenador que haga esa misma fuerza bruta de forma instantánea
algunos sistemas necesitan claves mucho más largas que la media de claves que tiene que probar un atacante para descifrarlos. Esto sucede en los sistemas asimétricos, por ejemplo. La fortaleza en estos sistemas es menor que la longitud de la clave
Estos son los algoritmos de seguridad computacional que utilizamos Esta sesión estudiaremos las dos primeras ramas: clave pública y clave secreta La próxima sesión estudiaremos los algoritmos de hash
Nosotros veremos en detalle los algoritmos ChaCha20 y AES, que los dos más utilizados actualmente - **Cifrado de flujo**. Heredero de "la idea" *one-time-pad*: el mensaje llega como un flujo de bytes que se cifra según va llegando. - **Cifrado de bloque**. Heredero de "la tradición" Vigenère: el mensaje se divide en bloques que se cifran por separado
PRNG: *Pseudo Random Number Generator* es un generador de bits que tiene como entrada una **semilla** (que será la clave de cifrado $k$) y tiene como salida el flujo de bits que aplicaremos sobre el mensaje para cifrarlo con *XOR* La velocidad del cifrado depende totalmente de la velocidad del PRNG, porque el XOR es instantáneo
Qué puede hacer un atacante con el xor de los textos en claro: - Análisis frecuencia: La "clave para cifrar m2" es m1, que ya no es aleatorio y permite el análisis de frecuencias. - Si partes de m1 son conocidas, es aún más sencillo descifrar partes de m2 Es decir, este esquema falla ante ataques de "chosen plaintext attacks": si el enemigo puede forzarnos a cifrar algo, el sistema está roto. Los algotitmos se diseñan para ser resistenentes a ciertos problemas. Por ejemplo, ese "chosen plantext attack", que es un juego como el que hemos visto antes. Puedes encontrar otros ataques en: https://en.wikipedia.org/wiki/Attack_model Mira el ejemplo de ataque japonés en el Pacífico de wikipedia
**Nota**: hasta hace poco, un buen algoritmo PRNG no es sencillo de hacer, o no es rápido. Hasta la aparición de Salsa20, la falta de buenos algoritmos PRNG hacían preferir el cifrado simétrico de bloque que veremos en un momento.
Nota importante: la figura muestra un cifrado de bloque totalmente inseguro, como veremos en un momento Fíjate: los bloques no tienen memoria, al contrario de lo que pasaba en el cifrado de flujo. Veremos que esto es una de sus debilidades.
AES fue desarrollado por Vincent Rijmen y Joan Daemen en el COSIC de la KU Leuven, Bélgica. Es totalmente ubicuo en la seguridad actual: se usa para todo, en todos lados. ChaCha20 es el único algoritmo que puee hacerle sombra. Hay hardware especializado en cifrar y descifrar AES, entre ellas las CPUs de computadora de sobremesa.
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": ¿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á.
en realidad no sabemos si el DLP es difícil: solo lo sospechamos muy fuertemente
Fundaron la empresa RSA Security LLC, que sigue siendo uno de los mayores proveedores de seguridad del mundo - Hablamos de Ron Rivest en el tema 3, creador de RC4 - Adi Shamir hizo más aportaciones fundamentales a la criptografía - Leonard Adleman ha seguido investigando en teoría de la complejidad
Nota: podemos intercambiar claves AES-256 con un D-H de 1024 bits. Solo que, de forma efectiva, solo estaremos escogiendo 80 bits de la clave AES-256. Es decir, sería equivalente a un (no existente) AES-80
A cambio, son más complejas de entender y programar pero eso como usuarios no es algo que importe
ECDSA: Elliptic Curve DSA ECDH: Elliptic Curve Diffie-Hellman