Conversión de mensajes en (grandes) enteros
La primera parte de esta sesión es técnica, pero necesaria. Para los criptosistemas modernos, que actúan sobre grandes enteros, necesitamos unas funciones que conviertan mensajes de texto en grandes enteros de un cierto rango, digamos .
La idea es elemental: a cada letra de un mensaje le asignamos un valor, y podemos ver un mensaje como un entero de muchas cifras escrito en una cierta base.
Por comodidad consideramos el código ASCII asociado a cada letra, o quizá el código UNICODE.
En Python, la función ord(c) devuelve el código UNICODE asociado al carácter c.
UNICODE tiene 65.535 caracteres posibles, pero en la práctica no usaremos valores por encima de 1000, que será la base a partir de ahora.
Un mensaje de texto, podemos interpretarlo como un entero largo en base 1000:
Con nuestra convención de fijar como base 1000, este mensaje se interpreta como el entero
Ahora necesitamos la conversión contraria: de un entero muyyyy grande a un mensaje de texto. La idea es reescribir el entero en base 1000,
Y usar la siguiente función para convertir cada entero en un carácter UNICODE:
La función print es necesaria, si no se usa, sale algo raro:
Todavía tenemos que resolver un pequeño problema: si nuestra clave privada es , y necesariamente ha de ser , ¿Cuántos caracteres caben en un mensaje?
La idea es contar bits: si , entonces los mensajes pueden tener un número de caracteres
Redondeando, mandamos los mensajes de 100 en 100 caracteres.
Generación de claves para RSA
Cada usuario necesita un par de claves, que se generan de la siguiente forma:
Se eligen primos y , y , con , o en general con bits y .
Sabemos que . Sea aleatorio, y .
Entonces, y .
Implementamos este algoritmo en SAGE/Python.
Veamos un ejemplo pequeño:
En este caso...
Pero si
entonces, no habremos terminado la factorización cuando vuelvan los Valar.
Las funciones de encriptación y desencriptación son la misma, pero las vamos a codificar por separado.
Supongamos que Bob quiere enviar un mensaje a Alicia:
es pública, todo el mundo puede encriptar PARA Alicia:
ģƙδƪdz͓AƎʤ¶Ƚ˨YÙΗˬxłƙ˟ʠɺƤʰ̯ΦŇȵjAȇȦƉȫȥρ˲ɷ́Ȏ̟ĬđϚÞĕ˓ȱp
Sólo Alicia conoce , y puede hacer
Ejercicios (¡Cómo no!)
Ejercicio 1
Fabiola y Gerardo deciden usar un cifrado RSA para comunicarse entre ellos, de bytes. Fabiola, con las prisas, ha generado una clave débil.
Nerea, una empleada de la odiosa NSA, ha averiguado que la clave pública de Fabiola tiene un factor poco mayor que .
Recuerde que si Fabiola tienen clave pública y secreta respectivamente, y Gerardo quiere enviar un mensaje cifrado a Fabiola, entonces la codificación es
La clave pública de Fabiola es
Nerea ha interceptado el siguiente mensaje:
Rompa la clave pública de Fabiola
Decodifique el mensaje.
Ejercicio 2 Implementa el cifrado de ElGamal de forma parecida a lo que hemos hecho con el RSA.