Criptografía 101 (Anexo): RSA Explicado
Este artículo forma parte de una serie más larga sobre criptografía. Si este es el primer artículo con el que te encuentras, te recomiendo comenzar desde el principio de la serie.
El cifrado RSA es uno de los algoritmos de cifrado más utilizados en todo el mundo — y se basa únicamente en el grupo aditivo de enteros módulo . Es un gran ejemplo de cuánto se puede hacer sin necesidad de curvas elípticas o cualquier otra construcción más compleja.
Este anexo está dedicado a explicar los principios de funcionamiento y los matices del algoritmo RSA.
El Problema Subyacente
Muchos mecanismos criptográficos operan bajo el principio de que es realmente difícil realizar cierta operación a menos que conozcas alguna clave secreta. En el cifrado, esa es exactamente la idea: un mensaje cifrado es indescifrable sin el conocimiento de dicha clave secreta.
¿Cómo se logra esto, entonces? Creando un problema que sea realmente difícil de resolver, a menos que tengas información secreta adicional. RSA se basa en uno de estos problemas: la factorización de números grandes en sus factores primos. Esto es: dado un número (grande) , expresarlo como:
Donde y son números primos grandes. Si conoces y , calcular es trivial — y también lo es calcular si conoces y .
¿Qué tan grande es lo suficientemente grande?
Por supuesto, todo esto es inútil si el problema es fácil de resolver. Por ejemplo, si , entonces la factorización realmente solo toma un instante. Sin embargo, a medida que los números primos se vuelven más grandes, la factorización comienza a tomar cada vez más tiempo.
El tamaño recomendado para los factores primos y está entre y bits. Como referencia, así es como se ve un número primo de 1024 bits:
170154366828665079503315635359566390626153860097410117673698414542663355444709893966571750073322692712277666971313348160841835991041384679700511912064982526249529596585220499141442747333138443745082395711957231040341599508490720584345044145678716964326909852653412051765274781142172235546768485104821112642811
Sí, es bastante grande.
Estimar cuánto tiempo llevaría encontrar los factores primos de un número grande, digamos, de 2048 bits de longitud, es difícil. ¡Principalmente porque realmente no se ha logrado hacer!
Aún así, se teoriza que tomaría entre cientos y miles de años, incluso con hardware potente. A menos que la Computación Cuántica esté disponible, claro — pero esa es una historia para otro momento.
Preliminares
¿Cómo usamos el problema anterior para cifrar datos? Para hacerlo, necesitaremos algunas definiciones. En particular, necesitaremos conocer la función totiente de Euler y sus propiedades.
La Función Totiente de Euler
Para cualquier número natural , esta función (denotada como ) cuenta cuántos números naturales menores que (sin contar el ) son coprimos con él.
Ser coprimos significa que los números no comparten factores primos. Otra forma de decirlo es que el máximo común divisor de los números coprimos es .
Por ejemplo, y son coprimos.
Observa que para un número primo , todos los números menores que él son coprimos (¡porque como es primo, su único factor primo es !). Así que podemos escribir:
Y también, es cierto que para , si y son primos, entonces:
Una Propiedad Importante
¿Por qué nos importa la función totiente? Principalmente debido al teorema de Euler, que establece que si y son coprimos, entonces:
Y si multiplicamos ambos lados por , esto es lo que obtenemos:
Aparentemente, hay un cierto número mágico que parece permitirnos recuperar el valor original !

El Algoritmo
Si sustituimos en la ecuación anterior por nuestro mensaje , entonces tenemos una excelente base para un mecanismo de cifrado, ¡porque tenemos una operación en que nos permite recuperar !
Lo que necesitamos hacer es dividir el proceso en dos pasos. Y para hacer esto, simplemente factorizamos .
Aunque esta no es tu factorización habitual. Lo que realmente sucede es que elegimos algún número aleatorio grande , siempre que , y que sea coprimo con . Luego, calculamos otro número tal que:
Esto es realmente solo el inverso multiplicativo modular de , módulo .
Y calcular de esta manera asegura que lo siguiente sea cierto (lo cual es bastante simple de probar, así que te dejo esa tarea a ti):
Y la parte interesante es que, con el conocimiento de y , no es fácil calcular porque para eso, ¡necesitarías los factores primos de ! ¡Lo cual es un problema realmente difícil! Por esta razón, puede hacerse público — y de hecho será la clave pública en RSA.
Los Pasos
Todo lo que queda es separar en dos pasos. Usamos la clave pública para calcular un texto cifrado:
Sin el conocimiento de , esto no puede convertirse de nuevo en . Así que mientras se mantenga en secreto, solo quien posea este valor podrá descifrar . Y debido a esto, va a ser nuestra clave privada.
Para descifrar, simplemente hacemos lo siguiente:
¡Y voilà! ¡El mensaje está descifrado!
Ten en cuenta que también puedes firmar digitalmente con este esquema, usando para producir una firma y para verificarla. Ingenioso, ¿no?
Resumen
¡Y ahí lo tienes! Así es como funciona el cifrado RSA.

No hay mucho más que decir al respecto. Aún así, hay un par de puntos que no hemos tocado — a saber, cómo calcular inversos multiplicativos modulares o cómo generar números primos grandes. No los cubriremos aquí, pero por supuesto, estos también son componentes clave para el cifrado RSA.
Sin embargo, hay algunos puntos particularmente sensibles en RSA que pueden convertirse en grandes trampas para todo el criptosistema, como se explica fantásticamente aquí. La teoría está muy bien, pero implementar este esquema aparentemente simple por tu cuenta puede hacerlo muy vulnerable.

Esta es una de las razones por las que RSA se considera mayormente obsoleto y ha sido reemplazado por la Criptografía de Curvas Elípticas (ECC) para muchas aplicaciones.