Según si usamos la clave pública o la privada para cifrar, podemos hacer dos cosas:
La criptografía simétrica también nos permitía cifrar, pero no firmar
Las matemáticas de la criptografía asimétrica utilizan funciones trampa:
No encontramos una función trampa hasta 1976
Vimos en teoría de la complejidad que los problemas NP (pero probablemente no P, no NP-Completos) son buenos candidatos para funciones trampa
La mayor parte de problemas NP solo son difíciles en el caso general. Es decir: tenemos algoritmos eficientes que funcionan casi siempre. Ejemplo: sudoku
Pero necesitamos que calcular
La dificultad ha sido encontrar esos problemas matemáticos que fuesen difíciles siempre
Resuelve la
Para más detalles de este problema, consulta tema 4
Resuelve la
La dificultad está en la aritmética modular: partiendo del resultado, no es fácil saber cuántas vueltas ha dado a la rueda
Ejemplo: ¿cuánto vale x? Recuerda que
https://miro.medium.com/max/2400/1*YZieEVE_LsNK4i94KNnZqg.png
Problema: resuelve
Si probamos con
Tiene todas estas soluciones (compruébalo):
Pero:
no tiene solución para ningún número
Problema: resuelve
Si el módulo
Dos usuarios
Observa: para que un atacante que solo conoce
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
Diffie-Hellman no protege contra MitM porque no permite autenticar mensajes.Necesitamos otras tecnologías.
El DLP, en la versión D-H de 1976, no una solución completa: permite hacer acuerdo de claves, pero no cifrado, ni firma, ni autenticado
En pocos años aparecieron nuevas funciones basadas en las mismas ideas que D-H, pero que permitían hacerlo todo: RSA, ElGammal, DSA, Pailier...
Luego, las soluciones se refinaron con curvas elípticas: ECDH (Elliptic Curves Diffie-Hellman), ECDSA (Elliptic Curves DSA)...
Algoritmo | Firma | Cifrado | Acuerdo de claves |
---|---|---|---|
RSA | Sí | Sí | Una parte cifra la clave que va a usarse |
ElGammal | Sí | Sí | Una parte cifra la clave que va a usarse |
DSA | Sí | No | Una parte cifra la clave que va a usarse |
D-H | No | No | Sí, es su único uso |
Técnicamente, los sistemas propuestos sirven o bien para firmar, o bien para cifrar o distribuir claves. Los algoritmos son ligeramente diferentes si se usan para firmar o para cifrar, pero no estudiaremos las diferencias
A method for obtaining digital signatures and public-key cryptosystems, Ron Rivest, Adi Shamir, Leonard Adleman, 1978
trap door function: dificultad del cálculo de la raíz
Background: https://hsto.org/getpro/habr/post_images/453/10e/602/45310e602d784a489301bf1996edef68.jpg
Calcula
Pista:
Es decir, dado
para recuperar (descifrar) el mensaje original a partir de
Si
Es computacionalmente difícil para valores de
Hemos cifrado un mensaje
La "trampa" usa el teorema de Euler: si los factores de
El mensaje se puede descifrar fácil si conoces
No conocemos ningún algoritmo eficiente para factorizar un número. Este es el problema computacionalmente difícil de RSA
Teniendo en cuenta eso, para calcular
Hace falta encontrar una
Es decir,
Cifrado: Para enviar un mensaje a Alice, obtengo su clave pública
Descifrado: Alice utiliza su clave privada
Claves:
Cifrado:
Descifrado:
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
En cualquier caso, 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"
Por eso: la criptografía basada en estas funciones 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
¿Podemos encontrar trap door functions que no estén basadas en primos, y por tanto necesiten claves más cortas?
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
Curva plana en un cuerpo finito que consiste en los puntos que satisfacen la ecuación:
Los cuerpos finitos son estructuras mátemáticas creadas con polinomios y aritmética modular
Ejemplo:
(por ahora simplificamos la explicación representando la curva los reales, sin módulos)
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:
No sabemos calcular
En realidad en criptografía no trabajamos sobre los reales, sino que mapeamos en un grupo finito de los enteros.
Es decir, con aritmética modular de un numero primo muy grande. El número de bits de este entero es "el tamaño de la clave"
Ejemplo número primo grande de 256 bits:
Ejemplos de mapeado en campos finitos: https://graui.de/code/elliptic2/
Ejemplo
Fuente: https://www.youtube.com/watch?v=mFVKuFZ29Fc&list=PLN9KZDpNfsHMd7d7PX87JGesGY_Qzyb3V
Ejemplo de proyección sobre los enteros
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 ( |
EEC |
---|---|---|---|
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"
No se suele escoger "cualquier curva elíptica", sino alguna de las ya existentes. Cada una tiene propiedades ligeramente diferentes, algunas están patentadas y otras provocan dudas (parte de las revelaciones de Snowden, 2013)
La Curve25519, propuesta por Daniel J. Bernstein en 2005, se considera segura:
sobre el cuerpo de los enteros creado por el primo
Tiene un tamaño de clave de 256 bits, equivalente a 128 bits en clave simétrica
Aceptada por varios estándares
Protocolo:
Nota que un atacante no podría calcular
DSA es un algoritmo de firmado digital clásico, basado en ElGammal (1985). Es similar a RSA pero basado en el problema del logaritmo discreto
Ha sido estándar FIPS hasta hace poco, pero probablemente será retirado en el futuro próximo
Existe una adaptación de DSA a curvas elípticas: ECDSA, que es la implementación que probablemente se estandarizará: FIPS 186-5 (2019, aún borrador)
El protocolo RSA no se ha adaptado a criptografía de curva elíptica
Pero RSA ha sido y aún es el sistema más utilizado para certificados digitales, y hay millones de estos certificados activos
(es decir, aún hay millones de claves RSA públicas en uso)
La situación quizá cambie en el futuro
Los esquemas descritos no cifran bytes, sino números: tenemos que ser capaces de codificar nuestro mensaje en un número entero. No ciframos "hola", sino el número "0x686f6c61"
Los mensajes que se pueden cifrar con criptografía asimétrica son muy cortos, de tamaño similar al tamaño de la clave
En RSA, el número "5" siempre se cifrará igual (¡compruébalo!). Eso es mala idea: quizá el enemigo no sepa qué estamos cifrando, pero sabe que es lo mismo que antes. Otros cifrados asimétricos como DSA son naturalmente probabilísticos, no hace falta añadirlo como un extra
Todos ellos son muchísimo más lentos que la criptografía simétrica para cifrar. Tanto, que no se usan par cifrar, solo para distribuir claves o hformar digitalmente
En realidad suele usarse un cifrado mixto: con asimétrica se cifra la clave simétrica que es la que realmente se usa para cifrar
PKCS#1 (RFC8017): recomendaciones para utilizar correctamente RSA, y es obligatorio que las librerías que uses las implementen. Por ejemplo:
https://cso.computerworld.es/cibercrimen/la-amenaza-cuantica-la-computacion-cuantica-y-la-criptografia
https://www.ccn.cni.es/index.php/es/docman/documentos-publicos/boletines-pytec/495-ccn-tec-009-recomendaciones-transicion-postcuantica-segura/file
Las curvas elípticas son un concepto complejo. Esto son algunas propuestas explicativas:
Ejercicios:
Continúa en: Funciones de Hash y Blockchains
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á.
Atención: este tema es matemáticamente denso, pero no es necesario seguir todos los detalles. Si tienes interés en los detalles, por favor, consulta los papers y libros especilizados. Los objetivos del tema es conocer la base de la criptografía asimétrica, cómo funciona y cómo se usa.
Fíjate que no estoy diciendo que la pública se use para cifrar y la privada para descifrar o viceversa Normalmente, si cifras con una puedes descifrar con la otra. Y según la que uses puedes cifrar o firmar documentos, como veremos a continuación
Veremos que la criptografía asimétrica usa el cifrado principalmente para distribuir claves, pero el cifrado real de un mensaje se sigue haciendo con criptografía simétrica
Recuerda que 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
Fíjate: necesitamos alguna manera de convertir mensajes a números. Lo verás en los ejercicios
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
Observa: la curva sobre los reales se mapea en un toroide, con la marca de "números enteros", limitados por aritmética modular. Las intersecciones son los puntos de la gráfica 2D de al lado
A cambio, son más complejas de entender y programar pero eso como usuarios no es algo que importe
Bernstein es el creador de Chacha20 del [tema 3](03-simetrica.html)
Veremos el cifrado mixto en las siguientes sesiones y en los ejercicios