¿Qué es el cifrado RSA y cómo funciona?

El cifrado RSA es un sistema que resuelve lo que alguna vez fue uno de los mayores problemas de la criptografía: ¿Cómo puedes enviarle a alguien un mensaje codificado sin tener la oportunidad de compartir previamente el código con ellos?

Este artículo te enseñará todo lo que necesitas saber sobre cómo se desarrolló el algoritmo RSA, cómo funciona, las matemáticas detrás de él, para qué se utiliza, así como algunos de los mayores problemas de seguridad que enfrenta. Aprender sobre RSA te brindará algunos conocimientos básicos que te ayudarán a comprender partes de nuestra vida en línea se mantienen seguras.

¿Qué es el cifrado RSA?

Digamos que quieres contarle un secreto a tu amigo. Si estás justo al lado de él, puedes susurrarlo. Si estás en lados opuestos del país, eso no funcionará. Puedes escribirlo y enviárselo por correo, o usar el teléfono, pero estos canales de comunicación no son seguros y cualquier persona con una motivación lo suficientemente fuerte podría interceptar fácilmente el mensaje.

Si el secreto fuera lo suficientemente importante, no te arriesgarías a escribirlo normalmente: los espías o un empleado postal deshonesto podrían estar revisando tu correo. Del mismo modo, alguien podría estar pinchando tu teléfono sin tu conocimiento y registrando cada llamada que realizas.

Una solución para evitar que los espías accedan al contenido del mensaje es encriptarlo. Básicamente, esto significa agregar un código al mensaje que lo convierte en un desorden. Si tu código es lo suficientemente complejo, las únicas personas que podrán acceder al mensaje original serán aquellas que tendrán acceso al código.

Si tuviste la oportunidad de compartir el código con tu amigo de antemano, cualquiera de vosotros puede enviar un mensaje encriptado en cualquier momento, sabiendo que vosotros dos son los únicos con la capacidad de leer el contenido del mensaje. Pero, ¿y si no tuvieras la oportunidad de compartir el código de antemano?

Este es uno de los problemas fundamentales de la criptografía, que ha sido abordado por esquemas de cifrado de clave pública (también conocido como cifrado asimétrico) como RSA.

Bajo el cifrado RSA, los mensajes se cifran con un código llamado clave pública, que se puede compartir abiertamente. Debido a algunas propiedades matemáticas distintas del algoritmo RSA, una vez que se ha activado un mensaje con la clave pública, solo se puede descifrar con otra clave, conocida como clave privada. Cada usuario de RSA tiene un par de claves que consta de sus claves públicas y privadas. Como sugiere el nombre, la clave privada debe mantenerse en secreto.

Los esquemas de grabado de clave pública son diferentes del grabado de clave simétrica, donde tanto el proceso de grabado como el de descifrado utilizan la misma clave privada. Estas diferencias hacen que el cifrado de clave pública como RSA sea útil para comunicarse en situaciones en las que no ha habido oportunidad de distribuir claves de forma segura de antemano.

Los algoritmos de clave simétrica tienen sus propias aplicaciones, como el cifrado de datos para uso personal o cuando existen canales seguros a través de los cuales se pueden compartir las claves privadas.

¿Dónde se usa?

El cifrado RSA se usa a menudo en combinación con otros esquemas de cifrado o para firmas digitales que pueden probar la autenticidad e integridad de un mensaje. Por lo general, no se usa para cifrar mensajes o archivos completos, porque es menos eficiente y consume más recursos que el cifrado de clave simétrica.

Para hacer las cosas más eficientes, un archivo generalmente se encriptará con un algoritmo de clave simétrica y luego la clave simétrica se encriptará con encriptación RSA. Bajo este proceso, solo una entidad que tenga acceso a la clave privada RSA podrá descifrar la clave simétrica.

Sin poder acceder a la clave simétrica, el archivo original no se puede descifrar. Este método se puede utilizar para mantener seguros los mensajes y los archivos, sin tardar demasiado ni consumir demasiados recursos informáticos.

El cifrado RSA se puede utilizar en varios sistemas diferentes. Se puede implementar en OpenSSL, wolfCrypt, cryptlib y otras bibliotecas criptográficas.

Como uno de los primeros esquemas de cifrado de clave pública ampliamente utilizados, RSA sentó las bases para gran parte de nuestras comunicaciones seguras. Se usaba tradicionalmente en TLS y también era el algoritmo original usado en el cifrado PGP. RSA todavía se ve en una variedad de navegadores web, correo electrónico, VPN, chat y otros canales de comunicación.

RSA también se usa a menudo para realizar conexiones seguras entre clientes VPN y servidores VPN. Bajo protocolos como OpenVPN, los protocolos de enlace TLS pueden usar el algoritmo RSA para intercambiar claves y establecer un canal seguro.

Historia

Como mencionamos al comienzo de este artículo, antes del cifrado de clave pública, era un desafío comunicarse de manera segura si no había existido la posibilidad de intercambiar claves de manera segura de antemano. Si no hubo una oportunidad de compartir el código con anticipación, o un canal seguro a través del cual se pudieron distribuir las claves, no hubo forma de comunicarse sin la amenaza de que los enemigos pudieran interceptar y acceder al contenido del mensaje.

No fue hasta la década de 1970 que las cosas realmente empezaron a cambiar. El primer avance importante hacia lo que ahora llamamos criptografía de clave pública fue publicada a principios de la década por James H. Ellis. Ellis no pudo encontrar una manera de implementar su trabajo, pero su colega Clifford Cocks lo amplió para convertirlo en lo que ahora conocemos como cifrado RSA.

La pieza final del rompecabezas es lo que ahora llamamos el intercambio de claves Diffie-Hellman. Malcolm J. Williamson, otro compañero de trabajo, ideó un esquema que permitía a dos partes compartir una clave de cifrado, incluso si el canal estaba siendo monitorizado por adversarios.

Todo este trabajo se llevó a cabo en la agencia de inteligencia del Reino Unido, la Sede de Comunicaciones del Gobierno (GCHQ), que mantuvo el descubrimiento clasificado. En parte debido a las limitaciones tecnológicas, el GCHQ no pudo ver un uso para la criptografía de clave pública en ese momento, por lo que el desarrollo permaneció inactivo. No fue hasta 1997 que se desclasificó el trabajo y se reconoció a los inventores originales de RSA.

Varios años después, conceptos similares comenzaron a desarrollarse en la esfera pública. Ralph Merkle creó una forma temprana de criptografía de clave pública, que influyó en Whitfield Diffie y Martin Hellman en el diseño del intercambio de claves Diffie-Hellman.

A las ideas de Diffie y Hellman les faltaba un aspecto importante que convertiría su trabajo en la base de la criptografía de clave pública. Esta era una función unidireccional que sería difícil de invertir. En 1977, Ron Rivest, Adi Shamir y Leonard Adleman, quienes formaron el acrónimo RSA, encontraron una solución después de un año de trabajar en el problema.

Los actores del MIT hicieron su gran avance después de una fiesta de Pesaj en 1977. Después de una noche de copas, Rivest se fue a casa, pero en lugar de dormir, pasó la noche escribiendo febrilmente un artículo que formalizaba su idea de la necesaria función unidireccional.

La idea fue patentada en 1983 por el MIT, pero no fue hasta los primeros días de Internet que el algoritmo RSA comenzó a ver una adopción generalizada como una herramienta de seguridad importante.

¿Cómo funciona RSA?

Lo siguiente va a ser un poco simplificado, porque a muchos lectores probablemente no les hayan gustado las matemáticas en la escuela secundaria. Para evitar que las matemáticas se salgan de control, simplificaremos algunos conceptos y usaremos números mucho más pequeños. En realidad, el RSA activado usa números primos que son mucho más grandes en magnitud y hay algunas otras complejidades.

Hay varios conceptos diferentes que tendrás que comprender antes de que podamos explicar cómo encaja todo. Estos incluyen funciones de trampilla, generación de números primos, la función totient de Carmichael y los procesos separados involucrados en el cálculo de las claves públicas y privadas utilizadas en los procesos de cifrado y descifrado.

Funciones de trampilla

El cifrado RSA funciona bajo la premisa de que el algoritmo es fácil de calcular en una dirección, pero casi imposible en sentido inverso. Como ejemplo, si te dijeran que 701.111 es un producto de dos números primos, ¿serías capaces de averiguar cuáles son esos dos números?

Incluso con una calculadora o una computadora, la mayoría de nosotros no tenemos ni idea de por dónde empezar, y mucho menos serías capaz de averiguar la respuesta. Pero si le damos la vuelta a las cosas, se vuelve mucho más fácil. ¿Cuál es el resultado de 907×773?

Si estuvieras lo suficientemente aburrido, habrías podido sacar tu teléfono o tal vez calcularlo en tu cabeza para descubrir que la respuesta es el 701.111 mencionado anteriormente. Este 907 y 773 son los números primos que responden a nuestra primera pregunta, lo que nos muestra que ciertas ecuaciones pueden ser fáciles de descifrar de una manera, pero aparentemente imposibles a la inversa.

Otro aspecto interesante de esta formación es que es sencillo descifrar uno de los números primos si ya tienes el otro, así como el producto. Si te dicen que 701.111 es el resultado de 907 multiplicado por otro número primo, puedes averiguar el otro número primo con la siguiente ecuación:

701.111 ÷ 907 = 773

Dado que la relación entre estos números es simple de calcular en una dirección, pero increíblemente difícil en sentido inverso, la ecuación se conoce como función de trampilla. Ten en cuenta que si bien el ejemplo anterior es difícil de entender para las personas, las computadoras pueden realizar la operación en una cantidad de tiempo trivial.

Debido a esto, RSA usa números mucho más grandes. El tamaño de los números primos en una implementación real de RSA varía, pero en RSA de 2048 bits, se unirían para crear claves de 617 dígitos. Para ayudarte a visualizarlo, una clave sería un número de este tamaño:

99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

Generando números primos

Las funciones de trampilla mencionadas anteriormente forman la base de cómo funcionan los esquemas de cifrado de clave pública y privada. Sus propiedades permiten compartir claves públicas sin poner en peligro el mensaje ni revelar la clave privada. También permita que los datos se cifren con una clave de una manera que solo puede descifrarse con la otra clave del par.

El primer paso para cifrar un mensaje con RSA es generar las claves. Para hacer esto, necesitamos dos números primos (p y q) que se seleccionan con una prueba de primalidad. Una prueba de primalidad es un algoritmo que encuentra eficientemente números primos, como la prueba de primalidad de Rabin-Miller.

Los números primos en RSA deben ser muy grandes y también relativamente separados. Los números que son pequeños o más juntos son mucho más fáciles de descifrar. A pesar de esto, usará números más pequeños para que las cosas sean más fáciles de seguir y calcular.

Digamos que la prueba de primalidad nos da los números primos que usamos arriba, 907 y 773. El siguiente paso es descubrir el módulo (n), usando la siguiente fórmula:

n = p x q

Donde p = 907 y q = 773

Por lo tanto:

n = 907 x 773

n = 701.111

Función de totient de Carmichael

Una vez que tenemos n, usamos la función totient de Carmichael:

λ (n) = mcm ( páginas – 1, q – 1)

Si ha pasado un tiempo desde que leíste los libros de texto de matemáticas, lo anterior puede parecer un poco aterrador. Puedes omitir esta parte y simplemente confiar en que las matemáticas funcionan; de lo contrario, quédate con nosotros para realizar algunos cálculos más. Todo se explicará con el mayor detalle posible para ayudar a comprender los conceptos básicos.

Para aquellos que no lo saben, λ(n) representa el totient de Carmichael para n, mientras que lcm significa el múltiplo común más bajo, que es el número más bajo en el que tanto p como q pueden dividirse. Hay algunas formas diferentes de resolver esto, pero la más fácil es confiar en una calculadora en línea para que haga la ecuación por ti. Así que pongamos nuestros números en la calculadora:

λ (701.111) = mcm (907 − 1, 773 − 1)

λ (701.111) = mcm (906, 772)

Usando la calculadora vinculada anteriormente, esto nos da:

λ (701 111) = 349 716

Generando la clave publica

Ahora que tenemos el total de Carmichael de nuestros números primos, es hora de averiguar nuestra clave pública. Bajo RSA, las claves públicas están compuestas por un número primo e, así como por un módulo n (explicaremos qué significa módulo en unos pocos párrafos). El número e puede ser cualquier cosa entre 1 y el valor de λ (n), que en nuestro ejemplo es 349.716.

Debido a que la clave pública se comparte abiertamente, no es tan importante que e sea un número aleatorio. En la práctica, generalmente se establece en 65,537, porque cuando se eligen aleatoriamente números mucho más grandes, el encendido es mucho menos eficiente. Para el ejemplo de hoy, mantendremos los números pequeños para que los cálculos sean eficientes. Digamos:

mi = 11

Nuestros datos cifrados finales se denominan texto cifrado (c). Lo derivamos de nuestro mensaje de texto sin formato (m), aplicando la clave pública con la siguiente fórmula:

c = metro mi mod n

Como mencionamos, e mod n es la clave pública. Ya hemos ideado e y también conocemos n. Lo único que necesitamos explicar es mod. Está un poco fuera de la profundidad de este artículo, pero se refiere a una operación de módulo, que significa el resto que queda cuando divides un lado por el otro. Por ejemplo:

10 módulos 3 = 1

Esto se debe a que 3 cabe tres veces en 10, con un resto de 1.

Volvamos a nuestra formula. Para simplificar las cosas, digamos que el mensaje (m) que queremos cifrar y mantener en secreto es solo un número, 4. Conectamos todo:

c = metro millas modelo n

c = 4 11 mod 701,111

c = 4.194.304 módulo 701.111

Una vez más, para facilitar la operación del módulo, usaremos una calculadora en línea. Al ingresar 4,194,304 en la calculadora en línea, nos da:

c = 688,749

Por lo tanto, cuando usamos RSA para encriptar nuestro mensaje, 4 con nuestra clave pública, nos da el texto grabado de 688,749. Los pasos anteriores pueden haber parecido demasiado complicados en matemáticas, pero es importante reiterar lo que realmente sucedió.

Teníamos un mensaje de 4, que queríamos mantener en secreto. Le aplicamos una clave pública, que nos dio el resultado encriptado de 688,749. Ahora que está cifrada, podemos enviar de forma segura el número 688.749 al propietario del par de claves. Es la única persona que podrá descifrarlo con su clave privada. Cuando lo descifre, verá el mensaje que realmente enviamos, 4.

Generando la clave privada

En el cifrado RSA, una vez que los datos o un mensaje se han convertido en texto cifrado con una clave pública, solo se pueden descifrar con la clave privada del mismo par de claves. Las claves privadas se componen de d y n. Ya conocemos n, y la siguiente fórmula se usa para encontrar d:

d = 1/ e mod λ (n)

En la sección Generar la clave pública anterior, ya quisimos que en nuestro ejemplo, e sería igual a 11. De manera similar, sabemos que λ (n) es igual a 349,716 de nuestro trabajo anterior bajo la función totient de Carmichael. Las cosas se complican un poco más cuando nos encontramos con esta sección de la fórmula:

1/ e mod

Esta ecuación puede parecer que te está pidiendo que dividas 1 entre 11, pero ese no es el caso. En cambio, esto simplemente simboliza que necesitamos calcular el inverso modular de e (que en este caso es 11) y λ (n) (que en este caso es 349,716).

Básicamente, esto significa que en lugar de realizar una operación de módulo estándar, usaremos la inversa en su lugar. Esto normalmente se encuentra con el Algoritmo Euclidiano Extendido, pero está un poco fuera del alcance de este artículo, por lo que solo haremos trampa y usaremos una calculadora en línea en su lugar. Ahora que entendemos todo lo que está pasando, introduzcamos nuestra información en la fórmula:

d =1/ 11 mod 349.716

Para realizar esta operación, simplemente ingresa 11 donde dice Entero y 349,716 donde dice Modulo en la calculadora en línea. Si lo has hecho correctamente, deberías obtener un resultado donde:

d = 254, 339

Ahora que tenemos el valor de d, podemos descifrar los mensajes que fueron encriptados con nuestra clave pública usando la siguiente fórmula:

m = c re mod n

Ahora podemos volver al texto grabado que ciframos en la sección Generar la clave privada. Cuando encriptamos el mensaje con la clave pública, nos dio un valor para c de 688,749. De arriba, sabemos que d es igual a 254,339. También sabemos que n es igual a 701.111 . Esto nos da:

m = 688.749 254.339 módulo 701.111.

Como habrás notado, tratar de llevar un número a la potencia 254,339 puede ser demasiado para la mayoría de las calculadoras normales. En su lugar, utilizaremos una calculadora de descifrado RSA en línea. Si quisiera usar otro método, aplicaría los poderes como lo haría normalmente y realizaría la operación del módulo de la misma manera que lo hicimos en la sección Generación de la clave pública.

En la calculadora vinculada anteriormente, ingresa 701,111 donde dice Módulo de suministro: N , 254,399 donde dice Clave de descifrado: D, y 688,749 donde dice Mensaje de texto comprimido en forma numérica.

Una vez que hayas ingresado los datos, presiona Descifrar, lo que hará que los números pasen por la fórmula de descifrado que se detalló anteriormente. Esto te dará el mensaje original en el cuadro de abajo. Si has hecho todo correctamente, deberías obtener una respuesta de 4, que era el mensaje original que encriptamos con nuestra clave pública.

Cómo funciona el cifrado RSA en la práctica

Las secciones anteriores deberían brindarte una comprensión razonable de cómo funcionan las matemáticas detrás del cifrado de clave pública. Puede ser un poco confuso, pero incluso aquellos que no entendieron las complejidades de las ecuaciones pueden obtener información importante sobre el proceso.

En los pasos enumerados anteriormente, hemos mostrado cómo dos entidades pueden comunicarse de forma segura sin haber compartido previamente un código. Primero, cada uno debe configurar sus propios pares de claves y compartir la clave pública entre sí. Las dos entidades deben mantener en secreto sus claves privadas para que sus comunicaciones permanezcan seguras.

Una vez que el remitente tiene la clave pública de su destinatario, puede usarla para cifrar los datos que desea mantener seguros. Una vez que se ha cifrado con una clave pública, solo se puede descifrar con la clave privada del mismo par de claves. Incluso la misma clave pública no se puede usar para descifrar los datos. Esto se debe a las propiedades de las funciones de trampilla que mencionamos anteriormente.

Cuando el destinatario recibe el mensaje cifrado, utiliza su clave privada para acceder a los datos. Si el destinatario desea devolver las comunicaciones de forma segura, puede cifrar su mensaje con la clave pública de la parte con la que se está comunicando. Nuevamente, una vez que se ha cifrado con la clave pública, la única forma de acceder a la información es a través de la clave privada correspondiente.

De esta manera, el cifrado RSA puede ser utilizado por partes previamente desconocidas para enviar datos de forma segura entre ellos. Partes significativas de los canales de comunicación que usamos en nuestras vidas en línea se construyeron a partir de esta base.

¿Cómo se cifran los mensajes más complicados con RSA?

En nuestro ejemplo, simplificamos mucho las cosas para que sea más fácil de entender, por lo que solo encriptamos un mensaje de «4». Ser capaz de cifrar el número 4 no parece particularmente útil, por lo que quizás te preguntes cómo puedes cifrar un conjunto de datos más complicado, como una clave simétrica (que es el uso más común de RSA), o incluso un mensaje. .

Algunas personas pueden estar perplejas de cómo una clave como «n38cb29fkbjh138g7fqijnf3kaj84f8b9f…» o un mensaje como «cómprame un sándwich» puede ser encriptado por un algoritmo como RSA, que trata con números y no con letras. La realidad es que toda la información que procesan nuestras computadoras se almacena en binario (1 y 0) y usamos estándares de codificación como ASCII o Unicode para representarlos de manera que los humanos puedan entender (letras).

Esto significa que claves como «n38cb29fkbjh138g7fqijnf3kaj84f8b9f…» y mensajes como «cómprame un sándwich» ya existen como números, que se pueden calcular fácilmente en el algoritmo RSA. Los números por los que están representados son mucho más grandes y más difíciles de manejar para nosotros, por lo que preferimos tratar con caracteres alfanuméricos en lugar de un revoltijo de binarios.

Si quisiera cifrar una clave de sesión más larga o un mensaje más complejo con RSA, simplemente implicaría un número mucho mayor.

Relleno

Cuando se implementa RSA, utiliza algo llamado relleno para ayudar a prevenir una serie de ataques. Para explicar cómo funciona esto, comenzaremos con un ejemplo. Digamos que estás enviando un mensaje codificado a un amigo:

Estimada Karen,

Espero que te encuentres bien. ¿Cenamos mañana?

Tuyo sinceramente,

Jaime

Digamos que codificaste el mensaje de una manera simple, cambiando cada letra por la que le sigue en el alfabeto.

Si tus enemigos interceptaron esta carta, hay un truco que podrían usar para intentar descifrar el código. Podrían mirar el formato de su carta y tratar de adivinar lo que podría estar diciendo el mensaje. Saben que las personas normalmente comienzan sus cartas con «Hola», «Hola», «Estimado» o una serie de otras convenciones.

Si trataran de aplicar «Hola» o «Hola» como primera palabra, verían que no se ajustaba a la cantidad de caracteres. Luego podrían intentar «Estimado». Encaja, pero eso no significa necesariamente nada. Los atacantes simplemente lo intentarían y verían a dónde los conducía. Entonces cambiarían las letras «e», «f», «b» y «s» con «d», «e», «a» y «r» respectivamente.

Todavía parece bastante confuso, por lo que los atacantes podrían intentar buscar otras convenciones, como la forma en que concluimos nuestras cartas. Las personas a menudo agregan «De» o «Un saludo cordial» al final, pero ninguno de estos se ajusta al formato. En su lugar, los atacantes podrían probar «Atentamente» y reemplazar las otras letras para ver de dónde las obtiene. Cambiando “z”, “p”, “v”, “t”, “j”, “o”, “d” y “m” por “y”, “o”, “u”, “s”, “ i”, “n”, “c” y “l” respectivamente.

Después de esa modificación, parece que los atacantes están comenzando a llegar a alguna parte. Han encontrado las palabras “yo”, “tú” y “eres”, además de las palabras que componían sus suposiciones iniciales.

Al ver que las palabras están en el orden gramatical correcto, los atacantes pueden estar bastante seguros de que van en la dirección correcta. A estas alturas, probablemente también se hayan dado cuenta de que el código implicaba que cada letra se cambiara por la que le sigue en el alfabeto. Una vez que se dan cuenta de esto, les resulta fácil traducir el resto y leer el mensaje original.

El ejemplo anterior era solo un código simple, pero como puedes ver, la estructura de un mensaje puede dar pistas a los atacantes sobre su contenido. Claro, fue difícil descifrar el mensaje solo por su estructura y requirió algunas conjeturas educadas, pero debes tener en cuenta que las computadoras son mucho mejores que nosotros para hacer esto. Esto significa que se pueden usar para descifrar códigos mucho más complejos en un tiempo mucho más corto, basándose en pistas que provienen de la estructura y otros elementos.

Si la estructura puede hacer que se descifre un código y revelar el contenido de un mensaje, entonces necesitamos alguna forma de ocultar la estructura para mantener el mensaje seguro. Esto nos lleva al relleno.

Cuando se rellena un mensaje, se agregan datos aleatorios para ocultar las pistas de formato originales que podrían provocar la ruptura de un mensaje cifrado. Con RSA, las cosas son un poco más complicadas, porque una clave cifrada no tiene el formato obvio de una letra que ayudó a darnos pistas en nuestro ejemplo anterior.

A pesar de esto, los adversarios pueden utilizar una serie de ataques para explotar las propiedades matemáticas de un código y romper los datos cifrados. Debido a esta amenaza, las implementaciones de RSA usan esquemas de relleno como OAEP para incrustar datos adicionales en el mensaje. Agregar este relleno antes de cifrar el mensaje hace que RSA sea mucho más seguro.

Firmar mensajes

RSA se puede utilizar para algo más que cifrar datos. Sus propiedades también lo convierten en un sistema útil para confirmar que un mensaje ha sido enviado por la entidad que dice haberlo enviado, así como para probar que un mensaje no ha sido alterado o manipulado.

Cuando alguien quiere probar la autenticidad de su mensaje, puede calcular un hash (una función que toma datos de un tamaño arbitrario y los convierte en un valor de longitud fija) del texto sin formato y luego firmarlo con su clave privada. Firman el hash aplicando la misma fórmula que se usa en el descifrado (m = c d mod n). Una vez que se ha firmado el mensaje, envían esta firma digital al destinatario junto con el mensaje.

Si un destinatario recibe un mensaje con una firma digital, puede usar la firma para verificar si el mensaje fue firmado de manera auténtica por la clave privada de la persona que afirma haberlo enviado. También pueden ver si los atacantes han cambiado el mensaje después de enviarlo.

Para verificar la firma digital, el destinatario primero usa la misma función hash para encontrar el valor hash del mensaje que recibió. Luego, el destinatario aplica la clave pública del remitente a la firma digital, utilizando la fórmula de encriptación (c = m e mod n), para proporcionarles el hash de la firma digital.

Al comparar el hash del mensaje que se recibió junto con el hash de la firma digital cifrada, el destinatario puede saber si el mensaje es auténtico. Si los dos valores son iguales, el mensaje no ha cambiado desde que lo firmó el remitente original. Si el mensaje hubiera sido alterado incluso por un solo carácter, el valor hash sería completamente diferente.

Seguridad y ataques RSA

Como la mayoría de los criptosistemas, la seguridad de RSA depende de cómo se implemente y utilice. Un factor importante es el tamaño de la clave. Cuanto mayor sea el número de bits en una clave, más difícil será atravesar ataques como la fuerza bruta y la factorización.

Dado que los algoritmos de clave asimétrica como RSA se pueden descifrar mediante la factorización de enteros, mientras que los algoritmos de clave simétrica como AES no pueden, las claves RSA deben ser mucho más largas para lograr el mismo nivel de seguridad.

Actualmente, el tamaño de clave más grande que se ha factorizado es de 768 bits. Esto fue realizado por un equipo de académicos durante un período de dos años, utilizando cientos de máquinas.

Dado que la factorización se completó a fines de 2009 y el poder de cómputo ha crecido significativamente desde ese momento, se puede suponer que un intento de intensidad similar ahora podría factorizar una clave RSA mucho más grande.

A pesar de esto, el tiempo y los recursos necesarios para este tipo de ataque lo colocan fuera del alcance de la mayoría de los piratas informáticos y del ámbito de los estados nacionales. La mejor longitud de clave a utilizar dependerá de su modelo de amenaza individual. El Instituto Nacional de Estándares y Tecnología recomienda un tamaño de clave mínimo de 2048 bits, pero las claves de 4096 bits también se usan en algunas situaciones donde el nivel de amenaza es mayor.

El factoring es solo una forma en que se puede romper RSA. Varios otros ataques tienen el potencial de romper el cifrado con una cantidad menor de recursos, pero estos dependen de la implementación y otros factores, no necesariamente de RSA en sí. Algunos de estos incluyen:

¿Son los números primos realmente aleatorios?

Algunas implementaciones de RSA utilizan generadores de números aleatorios débiles para obtener los números primos. Si estos números no son lo suficientemente aleatorios, es mucho más fácil para los atacantes factorizarlos y romper el cifrado. Este problema se puede evitar utilizando un generador de números pseudoaleatorios criptográficamente seguro.

Mala generación de claves

Las claves RSA deben estar dentro de ciertos parámetros para que sean seguras. Si los primos p y q están demasiado juntos, la clave se puede descubrir fácilmente. Asimismo, el número d que forma parte de la clave privada no puede ser demasiado pequeño. Un valor bajo hace que sea fácil de resolver. Es importante que estos números tengan la longitud adecuada para mantener tu clave segura.

Ataques de canal lateral

Estos son un tipo de ataque que no rompen RSA directamente, sino que usa información de su implementación para dar pistas a los atacantes sobre el proceso de encriptación. Estos ataques pueden incluir cosas como el análisis de la cantidad de energía que se está utilizando o el análisis de predicción de ramificaciones, que utiliza mediciones del tiempo de ejecución para descubrir la clave privada.

Otro tipo de ataque de canal lateral se conoce como ataque de sincronización. Si un atacante tiene la capacidad de medir el tiempo de descifrado en la computadora de su objetivo para una cantidad de mensajes cifrados diferentes, esta información puede hacer posible que el atacante determine la clave privada del objetivo.

La mayoría de las implementaciones de RSA evitan este ataque agregando un valor único durante el proceso de cifrado, lo que elimina esta correlación. Este proceso se denomina cegamiento criptográfico.

¿Es seguro el cifrado RSA para el futuro?

La buena noticia es que RSA actualmente se considera seguro de usar, a pesar de estos posibles ataques. La advertencia es que debe implementarse correctamente y usar una clave que se encuentre dentro de los parámetros correctos. Como acabamos de discutir, las implementaciones que no usan relleno, usan números primos de tamaño inadecuado o tienen otras vulnerabilidades no pueden considerarse seguras.

Si deseas utilizar el cifrado RSA, asegúrate de estar utilizando una clave de al menos 1024 bits. Aquellos con modelos de mayor amenaza deben ceñirse a claves de 2048 o 4096 bits si quieren usar RSA con confianza.

Siempre que seas consciente de las debilidades que tiene RSA y lo uses correctamente, debes sentirte seguro de usar RSA para compartir claves y otras tareas similares que requieren cifrado de clave pública.

Si bien RSA es seguro por ahora, se espera que el auge de la computación cuántica plantee algunos desafíos en el futuro.

¿Afectará la computación cuántica a RSA?

El campo de la computación cuántica continúa mejorando constantemente, pero aún pasarán algunos años antes de que vea mucho uso fuera de un contexto de investigación. Si bien las computadoras cuánticas tienen un inmenso potencial para mejorar nuestras capacidades, también traerán algunas complicaciones al mundo de la criptografía.

Esto se debe a que las computadoras cuánticas pueden resolver fácilmente ciertos problemas que actualmente se consideran inmensamente difíciles, y esta dificultad es a menudo lo que hace que nuestros sistemas criptográficos sean seguros. En el caso de algoritmos de clave simétrica como AES, las poderosas computadoras cuánticas que ejecutan el algoritmo de Grover podrían acelerar significativamente los ataques.

Si bien esto ciertamente representa una amenaza contra nuestros mecanismos criptográficos actuales, también es relativamente fácil de solucionar. Todo lo que tendremos que hacer es duplicar el tamaño de la clave para proteger estos algoritmos de clave simétrica.

Cuando se trata de criptografía de clave pública como RSA, se nos presenta un problema mucho mayor. Una vez que las computadoras cuánticas se vuelvan lo suficientemente fuertes como para ejecutar efectivamente el algoritmo de Shor, será factible resolver los siguientes tres problemas matemáticos:

  • Factorización de enteros
  • Logaritmo discreto
  • Logaritmo discreto de curva elíptica

Esta es una mala noticia, porque la seguridad de nuestros algoritmos de clave pública más utilizados se basa en la premisa de que actualmente no es práctico resolverlos con los recursos computacionales actuales. En el caso de RSA, es el problema de factorización de enteros.

Si bien la computación cuántica y el algoritmo de Shor son ciertamente una amenaza futura para RSA, la buena noticia es que tenemos tiempo para cambiar nuestra infraestructura criptográfica para garantizar nuestra seguridad futura.

Aunque es difícil saber exactamente cuándo será factible que las computadoras cuánticas rompan RSA, ya se están realizando importantes investigaciones y desarrollos. El Instituto Nacional de Estándares y Tecnología de EE.UU. (NIST) se encuentra actualmente solicitando y evaluando varios algoritmos de clave pública que serán seguros en un mundo poscuántico.

La estandarización es un proceso lento, por lo que aún pasarán varios años antes de que se seleccionen los algoritmos finales. Hasta entonces, no tenemos mucho de qué preocuparnos, porque las amenazas de la computación cuántica están aún más lejos.