El Algoritmo (RSA III)
Damián Domingo 19 de Noviembre del 2006
Este es el último artículo sobre el algoritmo RSA, ahora sí ya vamos a dar el método para cifrar y descifrar mensajes y se harán algunas observaciones que se deben tomar en cuenta a la hora del a implementación.
Esta es la continuación de los artículos:
Un poco de teoría de números (RSA I)
Un poco de aritmética modular (RSA II)
Introducción
Primero se definirá una función un poco particular, luego se dará el resultado de teoría de números que hace posible este algoritmo criptográfico, finalmente se mostrará el algoritmo, un ejemplo básico de uso y recomendaciones sobre implementación.
La función
de Euler
Def. Para un número
natural, la función
(se lee “fi”) de Euler se define como la cardinalidad del conjunto
. O sea 
En otras palabras
es el número de números naturales menores a
tales que tienen con
un máximo común divisor de
. Es la cantidad de primos relativos a
que hay entre
y
.
Esta función cumple ciertas propiedades:
- Si
es un número natural primo, entonces 
- Si
y
son naturales y primos relativos (i.e.
), entonces 
- De la última propiedad se deduce trivialmente que si
y
son números naturales primos distintos, entonces 
Pequeño Teorema de Fermat (sólo dato cultural)
Este resultado nos dice cosas muy interesantes, que serán generalizadas más adelante.
Teorema. Si
es un número natural primo y
es un entero tal que
no es múltiplo de
, entonces
.
Teorema de Euler
Teoremón. Si
es un número natural y
es un número entero tal que
, entonces
.
Primeros pasos para usar el algoritmo RSA
- Se eligen dos números naturales primos distintos muy grandes, digamos
y
. - Se calcula
. - Se elige un número entero positivo
tal que
(i.e.
). - Dada la forma en que fue elegido
, entonces 1 se puede escribir como combinación lineal de
y
. Además existe un numero entero positivo y otro negativo,
y
respectivamente, tales que
. Lo último es posible por una observación que se hizo en el artículo anterior cuando se habló de las todas las soluciones de una ecuación diofantina. - La llave pública es la pareja
. La llave privada, que debe mantener secreta, es
. Los valores de los números primos
y
no deben revelarse aunque no es necesario recordarlos, basta recordar
.
Nota:
es llamado comúnmente como módulo RSA,
como el exponente público y
como el exponente privado.
La idea de este algoritmo y de todos los algoritmos de clave pública es la siguiente: publicas en Internet tu llave pública y cuando alguien te quiere mandar algo “confidencial” entonces usa tu llave pública para cifrar el mensaje; si alguien lo interceptara no podrá descifrarlo fácilmente si no conoce tu llave privada.
Ejemplo. Supongamos que:
, entonces
. - Ahora elijo
y busco unos enteros tales que
. Usando el algoritmo llegamos a que
y
. - Falta encontrar
; usando el otro algoritmo (mencionado en el artículo anterior) llego a que
. Tomo
y obtenemos que
.
Cifrado de Mensajes
Supongamos que poseemos un alfabeto numerado (utf-8 o ascii por ej.) y tenemos un mensaje en ese alfabeto. Si mapeamos todo el mensaje con los números que le corresponden a cada caracter y los pegamos, vamos a tener un número entero positivo; llamémosle a ese número
.
Los pasos a seguir para cifrar ese mensaje son:
- Divides
en bloques de igual cantidad de dígitos, de tal manera que el número de dígitos que tenga cada bloque sea menor que el número de dígitos que tiene
. Vas a tener un conjunto de
bloques
.
Nota: Por eso RSA es clasificado como un sistema de llave pública de cifrado por bloques. - Tenemos que verificar que para todo
se tenga que
. Si no pasa esto entonces tendremos que construir bloques
de menos digitos hasta que se logre que todos los bloques cumplan
, o buscar otra 
- Vamos a tener que calcular el residuo de dividir
entre
para toda
. - Finalmente mandamos los residuos
en orden, de
a
, junto con el número de dígitos que tenían los bloques originales. Obsérvese que 
Ejemplo. Usaremos lo que se obtuvo en el ejemplo anterior. Imagínese que se tienen las letras de la A a la Z, numeradas de 01 hasta 27. Alguien nos quiere mandar el mensaje: “MIGUEL DE CERVANTES”. Así que esta persona hace el mapeo con el alfabeto y le queda que
. Ahora separa en bloques de 5 dígitos:

Va a tener que rellenar
con un cero, así que quedará
. Esto se pudo haber evitado si se escogían bloques de 4 o 6 dígitos. Además tiene que comprobar que todos los bloques cumplen
.
Finalmente calcula los residuos:

Nos envía el mensaje, o sea, los bloques en orden.
Descifrado de Mensajes
Recordemos que
, entonces
y
, por lo tanto
. Ahora miremos fijamente a
y veamos que dada la forma en que elegimos
tenemos que
. Con lo anterior hacemos una sustitución y nos queda que:
.
Es fácil ver ahora lo importante del Teorema de Euler ya que de lo anterior se deduce que
. Esto nos dice que el residuo de dividir
entre
es igual al bloque original. O sea que gracias a este resultado podemos descifrar los mensajes.
Resumiendo: para descifrar un mensaje lo que se hace es calcular el residuo de dividir
entre
. Podemos asegurar que ese residuo es igual a
, ya que habíamos pedimos que los bloques del mensaje tengan menos digitos que
. Sólo faltaría completar los ceros a la izquierda de cada residuo obtenido, para después concatenar todos los
y así obtener
(el mensaje original).
Ejemplo. Vamos a usar los datos de los ejemplos anteriores. Imagínese que nos llegan
bloques cifrados y nos dicen que: los bloques originales eran de 5 dígitos,
es de 34 dígitos y usaron
. Cabe mencionar que para un mismo módulo RSA se pueden tener varios exponentes publicos cuando previamente hemos calculado sus respectivos exponetes privados.
Procedemos a descifrar, así que calculamos:

Completamos con ceros a la izquierda cuando sea necesario, en este caso en el último residuo vamos a tener que ponerle un cero a la izquierda para que nos quede
y esté completo el bloque.
Finalmente concatenamos todos los bloques y queda
, quitamos el último cero para que el mensaje sea de 34 dígitos y tengamos
.
Recomendaciones para una implementación segura
- Los números primos que se escojan deben ser grandes (para evitar que factoricen el módulo RSA), se recomiendan mayores a
. Actualmente se usan módulos de 1024 bits, lo que significa que son números más grandes que 
- Que no los tiente la opción de escoger un exponente público chico pretendiendo que los cálculos sean más rápidos; los expertos recomiendan
. Ya que con un exponente público pequeño se puede comprometer la seguridad, sin necesidad de factorizar el módulo RSA. - Dada la naturaleza de
, se puede dar el caso en donde se obtenga una
pequeña, esto es muy inseguro. Por lo que se recomienda buscar otro
de tal manera que
sea grande. Para módulos RSA de 1024 bits se recomienda que
sea de al menos 256 bits (i.e. mayor a
) - Es igual de importante mantener secreto
, pues por eso se pide que
y
sean secretos, ya que es más tardado calcular
, conociendo solamente a
, que factorizar
.
Recomendaciones para la exponenciación
En lugar de hacer la exponenciación completa y luego sacar el residuo, se pueden usar multiplicaciones modulares para obtener el residuo sin tener que operar con números tan grandes, obsérvese que si tenemos
y quisieramos conocer
de
. Entonces se puede implementar así:
- Se calcula el residuo de dividir
entre
y así obtenemos
. - Luego se va multiplicando
consigo misma (tendremos que llegar a multiplicarla
veces), pero si en algún momento (digamos en la
-ésima multiplicación) las multiplicaciones sucesivas de
superan a
(considérese
) entonces procedemos a sacar de nuevo el residuo de
entre
y continuamos multiplicando el residuo anterior por
hasta que nos vuelva a pasar que superamos a
o terminamos.
El algoritmo sería el siguiente (un poco optimizado):
expModular (a,m,n)
b
a % n
for
do
if b > n then
b
b % n
else
if b = n then
b
0
endif
endif
endfor
return b
end
Fin
Aqui termina esta serie de artículos, espero les sirva de algo. Y pido una disculpa si en algún momento dije cosas como “es obvio”, “es fácil ver”, etc… Ahorita ya es obvio para mi, pero me tardé poca más de medio semestre en comprender y demostrar todo esto. Ustedes podrán juzgar si valió la pena ese semestre.
Felices criptogramas.






[...] Lo que se va a resolver esta vez es que el documento sea auténtico, y que no ha sido modificado. Para ello vamos a hacer uso de nuestro conocido algoritmo RSA. [...]