[skip-to-content]
\(\newcommand{\identity}{\mathrm{id}} \newcommand{\notdivide}{{\not{\mid}}} \newcommand{\notsubset}{\not\subset} \newcommand{\lcm}{\operatorname{lcm}} \newcommand{\gf}{\operatorname{GF}} \newcommand{\inn}{\operatorname{Inn}} \newcommand{\aut}{\operatorname{Aut}} \newcommand{\Hom}{\operatorname{Hom}} \newcommand{\cis}{\operatorname{cis}} \newcommand{\chr}{\operatorname{char}} \newcommand{\Null}{\operatorname{Null}} \renewcommand{\gcd}{\operatorname{mcd}} \renewcommand{\lcm}{\operatorname{mcm}} \renewcommand{\deg}{\operatorname{gr}} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \)

Sección7.6Sage

Debido a que Sage comenzó como software para el apoyo de la investigación en teoría de números, podemos rápida y fácilmente mostrar los mecanismos internos por los que funciona el algoritmo RSA. Reconozcamos que, en la práctica, muchos otros detalles tales como la codificación entre letras y enteros, o la protección de la clave privada, son igualmente importantes para proteger la seguridad de la comunicación. RSA por sí mismo es solo un fundamento teórico.

SubsecciónConstruyendo claves

Supondremos que Alice quiere enviar un mensaje secreto a Bob, junto con un mensaje de verificación (también conocido como firma digital). Comenzaremos con la construcción de un par de claves (privada y pública) para Alice y para Bob. Primero necesitamos dos primos grandes y su producto para cada uno de ellos. En la práctica, los valores de \(n\) tendrían cientos de dígitos, en lugar de solo \(21\) como hemos hecho acá.

Computacionalmente, el valor de la función \(\phi\) de Euler del producto de dos primos \(pq\) puede ser obtenida como \((p-1)(q-1)\text{,}\) pero podemos igualmente usar la función interna de Sage.

Ahora podemos crear los exponentes de encriptación y decriptación. Elegimos el exponente de encriptación como un número (pequeño) relativamente primo con el valor de \(m\text{.}\) Con Sage podemos factorizar \(m\) rápidamente para elegir este valor. En la práctica no querremos hacer este cálculo para valores grandes de \(m\text{,}\) así es que podemos más fácilmente elegir valores “aleatorios” y verificar hasta el primer valor relativamente primo con \(m\text{.}\) El exponente de decriptación es el inverso multiplicativo, mód \(m\text{,}\) del exponente de encriptación. Si construye un exponente de encriptación inadecuado (no relativamente primo con \(m\)), fallará el cálculo de este inverso multiplicativo (y Sage se lo dirá). Hacemos esto dos veces — para Alice y para Bob.

En esta etapa, cada individuo publicaría sus valores de \(n\) y \(E\text{,}\) guardando \(D\) en forma privada y segura. En la práctica \(D\) debiese estar protegido en el disco duro del usuario por una clave que solo conozca el dueño. Para aún mayor seguridad, una persona podría tener solo dos copias de su clave privada, una en un pituto de memoria USB que siempre lleve consigo, y una copia de respaldo en su caja de seguridad en Sage. Cada vez que la persona use \(D\) deberá indicar su clave. El valor de \(m\) puede ser desechado. Para el registro, acá están todas las claves:

SubsecciónFirmando y Encriptando un Mensaje

Alice construirá un mensaje que consiste de una palabra de cuatro letras en inglés. A partir de estas cuatro letras construiremos un número que represente el mensaje en la forma que necesitamos para usar en el algoritmo RSA. La función ord() convertirá una letra en su valor ASCII, un número entre 0 y 127. Si usamos estos números como “dígitos” mód 128, podemos estar seguros que la palabra de cuatro letras de Alice se codificará como un entero menor a \(128^4=268,435,456\text{.}\) El valor particular no tiene importancia, mientras sea menor que el valor de nuestro \(n\) pues toda la aritmética que sigue es mód \(n\text{.}\) Elegimos una palabra popular de cuatro letras, la convertimos en “dígitos” ASCII con una lista, y construimos el entero a partir de los dígitos en la base correcta. Note como podemos tratar la palabra como una lista y que el primer dígito en la lista está en el lugar de las “unidades”.

Primero, Alice firmará su mensaje para proveer una verificación. Para eso usa su clave privada, pues esto es algo que solo ella debiese poder hacer.

Luego Alice encripta el mensaje de manera que solo Bob lo pueda leer. Para esto usa la clave pública de Bob. Note que no es siquiera necesario que conozca a Bob — por ejemplo, ella podría haber obtenido la clave pública de Bob en su página web o quizás Bob la publicó en el New York Times.

La comunicación de Alice está lista para ser transmitida por cualquier red, no importando lo insegura que pueda ser y no importando cuánta gente pueda estar vigilándola.

SubsecciónDecriptación y Verificación del Mensaje

Ahora supongamos que el valor de encrypted a llegado a Bob. Bob podría no conocer a Alice ni necesariamente creer que ha recibido un mensaje genuinamente enviado por ella. Un adversario podría estar tratando de confundir a Bob enviándole mensajes supuestamente provenientes de Alice. Primero, Bob debe deshacer la encriptación hecha por Alice. Esto es algo que solo Bob, como el receptor intencionado, debiese ser capaz de realizar. Y lo hace usando su clave privada, que solo él conoce, y que ha mantenido segura.

En este momento, el mensaje no tiene gran significado para Bob. Cualquiera podría haberle enviado un mensaje encriptado. Pero, este era un mensaje firmado por Alice. Deshagamos ahora la firma. Notemos que esto requiere la clave pública de Alice. Bob no necesita conocer a Alice — por ejemplo podría obtener la clave pública de Alice de su página web o quizás Alice la publicó en el New York Times.

Bob necesita transformar esta representación entera de vuelta a una palabra con letras. La función chr() convierte valores ASCII en letras, y usamos una lista para hacer esto en forma repetida.

Si queremos un resultado más legible, podemos combinar estas letras en una cadena.

Bob está contento de haber recibido un mensaje tan interesante de Alice. ¿Qué habría sucedido si un impostor hubiese enviado un mensaje pretendiendo ser de Alice, o si un adversario hubiese interceptado y adulterado el mensaje original de Alice? (Lo segundo es lo que se conoce como un ataque de “hombre en el medio”.)

En cualquiera de estos casos, el tercero no sería capaz de duplicar la primera acción de Alice — firmar su mensaje. Si un adversario firma de alguna manera el mensaje, o lo altera en cualquier forma, el resultado cuando Bob deshaga la firma producirá pura basura. (Inténtelo!) Como Bob recibió una palabra legítima, con la mayúscula apropiada, puede confiar en que el mensaje que obtuvo es el mismo que fue firmado por Alice. En la práctica, si Alice envía varios cientos de palabras en su mensaje, la probabilidad de obtener un texto coherente a partir de un mensaje adulterado, es astronómicamente pequeña.

¿Qué hemos mostrado?

  1. Alice puede enviar mensajes que solo Bob puede leer.

  2. Bob puede recibir mensajes secretos de cualquiera.

  3. Alice puede firmar mensajes, de manera que Bob sabe que provienen genuinamente de Alice.

Por supuesto, sin hacer nuevas claves, se pueden intercambiar los roles de Alice y Bob. Y si Carol crea un par de claves, ella se puede comunicar tanto con Alice como con Bob de la misma forma.

Si usted desea usar encriptación RSA de clave pública seriamente, investigue el software GNU Privacy Guard, aka GPG, que está libremente disponible en www.gnupg.org/. Notemos que solo tiene sentido usar programas de encriptación que le permitan conocer el código fuente.