¿Por qué funciona RSA? Explicado paso a paso
Nivel bachillerato7 min de lecturaPor Fernando Hernando
Multiplicar dos primos es fácil y deshacerlo no. Con un ejemplo completo y la demostración del teorema de Euler, por qué RSA cifra y descifra sin compartir claves.
cada dato lleva su fuente al final
RSA funciona porque tres hechos encajan. Multiplicar dos primos es fácil, y nadie sabe deshacer esa multiplicación deprisa cuando los primos son enormes. Un teorema de Euler garantiza que, si cifras elevando a un exponente , otro exponente devuelve el mensaje original. Y ese exponente solo se calcula con facilidad si conoces los dos primos. Quien los conoce, abre; quien solo ve su producto, no.
La idea
Imagina que quieres que cualquiera pueda mandarte un mensaje secreto sin haberte visto nunca. El problema clásico de la criptografía era compartir la clave: antes de hablar en secreto había que encontrarse en secreto. En 1976, Whitfield Diffie y Martin Hellman plantearon que no hacía falta: bastaba un sistema donde la clave para cifrar fuera pública y la de descifrar, privada. Su artículo presentó el concepto y un método para acordar una clave secreta hablando en público (el hoy llamado intercambio de Diffie-Hellman), pero no un sistema práctico para cifrar con clave pública: lo dicen Rivest, Shamir y Adleman en la introducción del suyo, que sí lo daba, en 1978.
La imagen es un candado abierto. Tú repartes candados abiertos a todo el mundo; cualquiera puede cerrar uno sobre su mensaje, pero solo tú tienes la llave. RSA es ese candado hecho de aritmética. El candado abierto es un par de números y la llave es otro número, .
Lo que lo sostiene es una asimetría. Multiplicar se hace en un momento: . Pero si te doy y te pido los dos primos, tienes que probar y probar. Con números de dos cifras, un rato. Con números de 617 cifras (un RSA de 2048 bits), no se conoce ninguna forma rápida de hacerlo con un ordenador clásico.
Prueba a generar tus claves, cifrar y luego intentar romperlas, viendo cómo se dispara el tiempo al crecer el número:
Claves de juguete: no las uses para proteger nada real. Todo se calcula en tu navegador.
1 Genera tus claves
- n = p · q
61 · 53 = 3233(12 bits) - φ(n) = (p − 1)(q − 1)
60 · 52 = 3120 - e, primo con φ(n)
7 - d = e⁻¹ mod φ(n)
1783(comprobación: e · d mod φ(n) = 1)
Cómo se calcula d: Euclides extendido paso a paso
Se divide φ(n) entre e, luego e entre el resto, y así hasta llegar a resto 0. Las columnas s y t cumplen siempre r = s · φ(n) + t · e. En la fila del resto 1, t es el inverso de e (si sale negativo, se le suma φ(n)).
| cociente | resto r | s | t |
|---|---|---|---|
| 3120 | 1 | 0 | |
| 7 | 0 | 1 | |
| 445 | 5 | 1 | -445 |
| 1 | 2 | -1 | 446 |
| 2 | 1 | 3 | -1337 |
| 2 | 0 | -7 | 3120 |
Resultado: t = -1337, y d = t mod φ(n) = 1783.
Clave pública (n, e)
Se la das a quien quiera escribirte.
(3233, 7)Clave privada (n, d)
Solo la tienes tú. Sin p y q, calcularla exige factorizar n.
(3233, 1783)2 Cifra un mensaje
El texto se pasa a bytes (UTF-8) y se agrupan de 1 en 1 para formar números menores que n. Cada número m se cifra con c = me mod n.
| bloque | m (mensaje) | c = me mod n |
|---|---|---|
| 1 | 72 | 1087 |
| 2 | 111 | 3183 |
| 3 | 108 | 1877 |
| 4 | 97 | 1818 |
Exponenciación rápida del primer bloque
En lugar de multiplicar m por sí mismo e veces, se elevan al cuadrado sucesivamente (m, m², m⁴, m⁸…) y se multiplican solo los que corresponden a los bits 1 de e = 111₂. Son 3 pasos en lugar de 7.
| bit de e | m^(2^i) mod n | acumulado |
|---|---|---|
| 1 | 72 | 72 |
| 1 | 1951 | 1453 |
| 1 | 1160 | 1087 |
El enlace lleva el mensaje cifrado y tu clave pública, pero no la privada. ¿Podrá leerlo quien lo reciba?
3 Descifra
4 Intenta romperla
Quien tenga n y consiga factorizarlo obtiene p y q, y con ellos d. Vamos a probar la fuerza bruta (dividir n entre 3, 5, 7… hasta √n) con claves cada vez más grandes, en tu propio dispositivo.
Un ejemplo completo con números pequeños
Los números de abajo están comprobados con un programa. Son claves de juguete: no sirven para proteger nada.
- Eliges dos primos secretos: y .
- Publicas su producto: .
- Calculas en secreto .
- Eliges un número sin factores comunes con 2640. Tomamos . Tu clave pública es .
- Buscas tal que deje resto 1 al dividir entre 2640. Sale , porque . Esa es tu clave privada.
Alguien quiere mandarte el mensaje (un número menor que ). Calcula y se queda con el resto al dividir entre 2747: obtiene y te lo envía. Tú calculas módulo 2747 y recuperas .
Quien espía ve , y . Para calcular necesita , y para eso necesita y . Aquí es trivial. Con primos de mil bits cada uno, no.
Las matemáticas de verdad
Aritmética modular. Escribimos si divide a : es decir, y dejan el mismo resto al dividir entre . Las sumas y los productos se pueden hacer «a trozos»: se reduce módulo en cualquier paso. Por eso se calcula sin escribir el número gigante, elevando al cuadrado y reduciendo cada vez.
La función . es la cantidad de números entre 1 y sin factores comunes con . Si es primo, . Si con primos, : entre los números hay múltiplos de y múltiplos de , y solo está en las dos listas, así que se excluyen y quedan . Con se excluyen números y quedan .
Euclides extendido para hallar . Como , existen enteros con , y entonces . Se calculan con el algoritmo de Euclides, arrastrando los coeficientes. Para y :
| cociente | resto | ||
|---|---|---|---|
| 2640 | 1 | 0 | |
| 7 | 0 | 1 | |
| 377 | 1 | 1 | |
| 7 | 0 | 2640 |
La penúltima fila dice . Luego , y .
Teorema de Euler. Si , entonces
Para primo es el pequeño teorema de Fermat: . Euler publicó una demostración de ese caso en 1741 (escrita en 1736) y la generalización a módulos compuestos, la que usa , en 1763. Aquí solo necesitamos el caso de Fermat, y damos una demostración corta (no es la de 1741, que va por inducción): si no es múltiplo de , los números son distintos módulo (si , como no divide a , divide a , y esto solo pasa si ) y ninguno es múltiplo de . Son, por tanto, los mismos restos no nulos en otro orden, y multiplicándolos todos:
Como no divide a , se puede simplificar y queda .
Por qué . Sea con primos, y sean enteros positivos con , es decir, para algún entero . Queremos ver que
Lo probamos por separado módulo y módulo .
Módulo . Como es múltiplo de , tenemos . Hay dos casos. Si no divide a , Fermat da y por tanto . Si divide a , entonces y también , porque .
Módulo . Lo mismo, intercambiando los papeles.
Juntarlo. Hemos visto que divide a y que también. Como y son primos distintos, divide a . Esto es el teorema chino del resto en su forma más sencilla: un sistema , tiene como única solución módulo la clase de . Así, .
El caso no se pierde: es justo cuando o divide a y se resuelve con la rama «» de arriba. Con , por ejemplo, da y . Hay valores así entre 0 y 2746, y hemos comprobado con un programa que los 2747 posibles mensajes se descifran bien. La hipótesis sí hace falta: con , y se cumple , porque , y sin embargo .
Esta es la demostración que recogen Rivest, Shamir y Adleman en su artículo (sección VI), aunque ellos escogen primero y calculan (el papel de los dos exponentes es simétrico) y despachan el caso en que divide a en una línea.
Lo que esto no demuestra. La demostración garantiza que descifrar funciona, no que romper RSA sea difícil. Sabemos que encontrar (o ) es tan difícil como factorizar : quien tiene uno de los dos saca los primos enseguida. Pero no está demostrado que cualquier forma de descifrar sin obligue a factorizar; es un problema abierto, y hay indicios de que para exponentes pequeños podría no ser así (lo resume Boneh, 1999). La seguridad descansa en que nadie sabe factorizar deprisa ni romper RSA de otra manera, no en un teorema.
Dos avisos honestos
- El RSA «de libro» no es seguro. Si cifras sin más, el mismo mensaje da siempre el mismo cifrado, el cifrado deja ver información parcial del mensaje y hay ataques que aprovechan que el producto de dos cifrados es el cifrado del producto. Boneh lo resume así: para que RSA sea seguro hay que añadir azar al cifrar. Por eso el estándar PKCS #1 (RFC 8017) usa RSA solo dentro de esquemas con relleno y, en las aplicaciones nuevas, pide OAEP para cifrar y PSS para firmar.
- Las claves de juguete no protegen nada. Con basta probar divisores hasta 41. El NIST (Estados Unidos) exige claves de 2048 bits o más para el uso de su Gobierno federal, es decir, de unas 617 cifras decimales.
Un dato histórico
Clifford Cocks, matemático del GCHQ británico, escribió el 20 de noviembre de 1973 una nota con un sistema del mismo tipo: el receptor publica y recupera el mensaje con el algoritmo de Euclides y aritmética módulo y . El propio GCHQ atribuye a Cocks el sistema hoy conocido como RSA. El artículo técnico de Rivest, Shamir y Adleman se publicó en 1978, aunque el sistema ya se había dado a conocer en agosto de 1977 en la revista Scientific American (lo cuenta Boneh).
Y ahora, ¿qué?
La seguridad de todo lo anterior necesita que factorizar sea difícil, y eso es una apuesta, no un teorema. Peter Shor demostró, en un trabajo que está en arXiv desde 1995 y se publicó en una revista en 1997, que un ordenador cuántico factorizaría en tiempo polinómico. Cuánto falta para tener uno lo cuenta ¿Puede un ordenador cuántico romper RSA hoy?, con las estimaciones publicadas. Mientras tanto, la respuesta es la criptografía postcuántica: sistemas que se apoyan en problemas distintos, que no se sabe resolver deprisa ni con ordenadores cuánticos.
Fuentes
- R. L. Rivest, A. Shamir y L. Adleman, A method for obtaining digital signatures and public-key cryptosystems, Communications of the ACM 21(2), 1978.
- W. Diffie y M. E. Hellman, New Directions in Cryptography, IEEE Transactions on Information Theory 22(6), 1976.
- C. C. Cocks, A note on «non-secret encryption», 20 de noviembre de 1973 (copia del documento de CESG/GCHQ), y el perfil oficial de GCHQ.
- L. Euler, Theorematum quorundam ad numeros primos spectantium demonstratio (E54, 1741) y Theoremata arithmetica nova methodo demonstrata (E271, 1763), Euler Archive.
- P. W. Shor, Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer, SIAM Journal on Computing, 1997.
- IETF, PKCS #1 v2.2, RFC 8017, 2016.
- D. Boneh, Twenty years of attacks on the RSA cryptosystem, Notices of the AMS 46(2), 1999.
- E. Barker y A. Roginsky, NIST SP 800-131A Rev. 2, NIST, 2019.
Preguntas frecuentes
¿Por qué hay que usar números primos en RSA?
Porque con los dos primos p y q se calcula φ(n) = (p-1)(q-1), el número que permite fabricar la clave privada d a partir de la pública e. Quien solo conoce n = pq no sabe calcular φ(n) sin factorizar n, y factorizar un número grande es, hasta donde se sabe, muy costoso con un ordenador clásico.
¿Se puede descifrar un mensaje RSA sin la clave privada?
Con claves de juguete, sí: basta factorizar n por prueba de divisiones. Con claves reales de 2048 bits o más no se conoce ningún modo eficiente con ordenadores clásicos. Con un ordenador cuántico suficientemente grande, el algoritmo de Shor factorizaría n en tiempo polinómico, pero ese ordenador no existe todavía.
¿Es seguro el RSA que se explica en este artículo?
No. Es el RSA «de libro»: cifrar m como m^e mod n, sin más, es determinista y tiene debilidades conocidas. En la práctica el mensaje se rellena antes de cifrar con un esquema que añade azar (el estándar PKCS #1, RFC 8017, pide OAEP en las aplicaciones nuevas) y se usan claves de 2048 bits o más, el mínimo que fija el NIST de Estados Unidos.
¿Qué pasa si el mensaje comparte un factor con n?
El teorema de Euler no se puede aplicar, pero RSA sigue funcionando: se comprueba por separado módulo p y módulo q, y el teorema chino del resto junta los dos resultados. Es un caso rarísimo con primos grandes, pero la demostración debe cubrirlo.
Publicado el