Saltar al contenido
El bit perdido
Newsletter

¿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 ee, otro exponente dd devuelve el mensaje original. Y ese exponente dd 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 (n,e)(n, e) y la llave es otro número, dd.

Lo que lo sostiene es una asimetría. Multiplicar 41×6741 \times 67 se hace en un momento: 27472747. Pero si te doy 27472747 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

  1. n = p · q 61 · 53 = 3233 (12 bits)
  2. φ(n) = (p − 1)(q − 1) 60 · 52 = 3120
  3. e, primo con φ(n) 7
  4. 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)).

cocienteresto rst
312010
701
44551-445
12-1446
213-1337
20-73120

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.

bloquem (mensaje)c = me mod n
1721087
21113183
31081877
4971818
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 em^(2^i) mod nacumulado
17272
119511453
111601087

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.

Abrir la herramienta a pantalla completa

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.

  1. Eliges dos primos secretos: p=41p = 41 y q=67q = 67.
  2. Publicas su producto: n=41⋅67=2747n = 41 \cdot 67 = 2747.
  3. Calculas en secreto φ(n)=(41−1)(67−1)=40⋅66=2640\varphi(n) = (41-1)(67-1) = 40 \cdot 66 = 2640.
  4. Eliges un número ee sin factores comunes con 2640. Tomamos e=7e = 7. Tu clave pública es (n,e)=(2747,7)(n, e) = (2747, 7).
  5. Buscas dd tal que 7d7d deje resto 1 al dividir entre 2640. Sale d=2263d = 2263, porque 7⋅2263=15841=6⋅2640+17 \cdot 2263 = 15841 = 6 \cdot 2640 + 1. Esa es tu clave privada.

Alguien quiere mandarte el mensaje m=1234m = 1234 (un número menor que nn). Calcula 123471234^7 y se queda con el resto al dividir entre 2747: obtiene c=517c = 517 y te lo envía. Tú calculas 5172263517^{2263} módulo 2747 y recuperas 12341234.

Quien espía ve n=2747n = 2747, e=7e = 7 y c=517c = 517. Para calcular dd necesita φ(n)\varphi(n), y para eso necesita 4141 y 6767. Aquí es trivial. Con primos de mil bits cada uno, no.

Las matemáticas de verdad

Aritmética modular. Escribimos a≡b(modn)a \equiv b \pmod n si nn divide a a−ba - b: es decir, aa y bb dejan el mismo resto al dividir entre nn. Las sumas y los productos se pueden hacer «a trozos»: se reduce módulo nn en cualquier paso. Por eso 12347 mod 27471234^7 \bmod 2747 se calcula sin escribir el número gigante, elevando al cuadrado y reduciendo cada vez.

La función φ\varphi. φ(n)\varphi(n) es la cantidad de números entre 1 y nn sin factores comunes con nn. Si pp es primo, φ(p)=p−1\varphi(p) = p - 1. Si n=pqn = pq con p≠qp \neq q primos, φ(n)=(p−1)(q−1)\varphi(n) = (p-1)(q-1): entre los números 1,2,…,pq1, 2, \dots, pq hay qq múltiplos de pp y pp múltiplos de qq, y solo pqpq está en las dos listas, así que se excluyen p+q−1p + q - 1 y quedan pq−p−q+1=(p−1)(q−1)pq - p - q + 1 = (p-1)(q-1). Con n=2747n = 2747 se excluyen 41+67−1=10741 + 67 - 1 = 107 números y quedan 26402640.

Euclides extendido para hallar dd. Como mcd⁡(e,φ(n))=1\operatorname{mcd}(e, \varphi(n)) = 1, existen enteros s,ts, t con s φ(n)+t e=1s\,\varphi(n) + t\,e = 1, y entonces t⋅e≡1(modφ(n))t \cdot e \equiv 1 \pmod{\varphi(n)}. Se calculan con el algoritmo de Euclides, arrastrando los coeficientes. Para φ=2640\varphi = 2640 y e=7e = 7:

cocienterestosstt
264010
701
37711−377-377
70−7-72640

La penúltima fila dice 1⋅2640−377⋅7=11 \cdot 2640 - 377 \cdot 7 = 1. Luego e−1≡−377≡2263(mod2640)e^{-1} \equiv -377 \equiv 2263 \pmod{2640}, y d=2263d = 2263.

Teorema de Euler. Si mcd⁡(a,n)=1\operatorname{mcd}(a, n) = 1, entonces

aφ(n)≡1(modn).a^{\varphi(n)} \equiv 1 \pmod{n}.

Para n=pn = p primo es el pequeño teorema de Fermat: ap−1≡1(modp)a^{p-1} \equiv 1 \pmod p. Euler publicó una demostración de ese caso en 1741 (escrita en 1736) y la generalización a módulos compuestos, la que usa φ\varphi, 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 aa no es múltiplo de pp, los números a,2a,…,(p−1)aa, 2a, \dots, (p-1)a son distintos módulo pp (si ia≡jaia \equiv ja, como pp no divide a aa, pp divide a i−ji - j, y esto solo pasa si i=ji = j) y ninguno es múltiplo de pp. Son, por tanto, los mismos p−1p - 1 restos no nulos en otro orden, y multiplicándolos todos:

ap−1 (p−1)!≡(p−1)!(modp).a^{p-1}\,(p-1)! \equiv (p-1)! \pmod p.

Como pp no divide a (p−1)!(p-1)!, se puede simplificar y queda ap−1≡1(modp)a^{p-1} \equiv 1 \pmod p.

Por qué (me)d≡m(modn)(m^e)^d \equiv m \pmod n. Sea n=pqn = pq con p≠qp \neq q primos, y sean e,de, d enteros positivos con ed≡1(modφ(n))ed \equiv 1 \pmod{\varphi(n)}, es decir, ed=k φ(n)+1ed = k\,\varphi(n) + 1 para algún entero k≥0k \ge 0. Queremos ver que

med≡m(modn)para todo m con 0≤m<n.m^{ed} \equiv m \pmod n \quad\text{para todo } m \text{ con } 0 \le m < n.

Lo probamos por separado módulo pp y módulo qq.

Módulo pp. Como ed−1=k(p−1)(q−1)ed - 1 = k(p-1)(q-1) es múltiplo de p−1p - 1, tenemos med=m⋅(mp−1)k(q−1)m^{ed} = m \cdot (m^{p-1})^{k(q-1)}. Hay dos casos. Si pp no divide a mm, Fermat da mp−1≡1m^{p-1} \equiv 1 y por tanto med≡m(modp)m^{ed} \equiv m \pmod p. Si pp divide a mm, entonces m≡0m \equiv 0 y también med≡0≡m(modp)m^{ed} \equiv 0 \equiv m \pmod p, porque ed≥1ed \ge 1.

Módulo qq. Lo mismo, intercambiando los papeles.

Juntarlo. Hemos visto que pp divide a med−mm^{ed} - m y que qq también. Como pp y qq son primos distintos, pqpq divide a med−mm^{ed} - m. Esto es el teorema chino del resto en su forma más sencilla: un sistema x≡a(modp)x \equiv a \pmod p, x≡a(modq)x \equiv a \pmod q tiene como única solución módulo pqpq la clase de aa. Así, med≡m(modn)m^{ed} \equiv m \pmod n.

El caso mcd⁡(m,n)≠1\operatorname{mcd}(m, n) \neq 1 no se pierde: es justo cuando pp o qq divide a mm y se resuelve con la rama «m≡0m \equiv 0» de arriba. Con n=2747n = 2747, por ejemplo, m=82=2⋅41m = 82 = 2 \cdot 41 da c=1804c = 1804 y 18042263≡82(mod2747)1804^{2263} \equiv 82 \pmod{2747}. Hay n−φ(n)=107n - \varphi(n) = 107 valores así entre 0 y 2746, y hemos comprobado con un programa que los 2747 posibles mensajes se descifran bien. La hipótesis p≠qp \neq q sí hace falta: con n=25n = 25, e=3e = 3 y d=7d = 7 se cumple ed=21≡1(modφ(25))ed = 21 \equiv 1 \pmod{\varphi(25)}, porque φ(25)=20\varphi(25) = 20, y sin embargo 521≡0≢5(mod25)5^{21} \equiv 0 \not\equiv 5 \pmod{25}.

Esta es la demostración que recogen Rivest, Shamir y Adleman en su artículo (sección VI), aunque ellos escogen primero dd y calculan ee (el papel de los dos exponentes es simétrico) y despachan el caso en que pp divide a mm 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 dd (o φ(n)\varphi(n)) es tan difícil como factorizar nn: quien tiene uno de los dos saca los primos enseguida. Pero no está demostrado que cualquier forma de descifrar sin dd obligue a factorizar; es un problema abierto, y hay indicios de que para exponentes ee 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 me mod nm^e \bmod n 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 n=2747n = 2747 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, nn 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 N=PQN = PQ y recupera el mensaje con el algoritmo de Euclides y aritmética módulo PP y QQ. 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

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

Para saber más

  1. ¿Puede un ordenador cuántico romper RSA hoy?

    Qué haría falta para romper RSA-2048 con el algoritmo de Shor, según las estimaciones publicadas más recientes. Página viva: se actualiza con cada estimación nueva.

    3 min de lectura
  2. Leonhard Euler: el matemático que siguió calculando ciego

    Vida de Leonhard Euler: su obra inmensa, la ceguera, el problema de Basilea (π²/6) y qué símbolos inventó de verdad y cuáles solo popularizó.

    7 min de lectura