MOOC El algoritmo RSA


Lección 7. Generación de claves con OpenSSL
Dr. Jorge Ramió Aguirre - 27/07/2012 

Esta séptima lección la dedicaremos a presentar el estándar de criptografía OpenSSL y a realizar algunas prácticas con él, generando claves RSA en modo comando y observando sus características. Usaremos, además, los parámetros que nos entrega OpenSSL para usar el teorema chino del resto en el descifrado.

Si deseas descargar las diapositivas del curso en formato pptx animado o bien en pdf, puedes hacerlo desde esta dirección.

Este icono y el fondo de color amarillo te indican que entras en una zona de prácticas.

Este icono y el fondo de color azul te indican que entras en una zona de cuestiones para reflexionar e investigar.

El tiempo recomendado para el seguimiento de esta lección, la realización de sus prácticas y ejercicios, así como la búsqueda de información en la red sobre los temas abiertos planteados al final de cada apartado, es de dos semanas.

Temario

Objetivos

  • 1. Conocer cómo se generan claves RSA con el software OpenSSL.
  • 2. Comprobar las características de las claves RSA que genera OpenSSL.
  • 3. Usar los parámetos que entrega OpenSSL en la generación de claves para el descifrado con el teorema chino del resto.
  • 4. Obtener conclusiones sobre el comportamiento de OpenSSL en la generación de claves RSA.

Software que vas a utilizar en esta lección


APARTADO 7.1. INSTALACION DEL SOFTWARE WIN32 OPENSSL

Basado en la librería SSLeay desarrollada por Eric A. Young y Tim Hudson, OpenSSL es un proyecto de open-source escrito en lenguaje C y que implementa un buen número de funciones criptográficas, entre ellas la generación de claves RSA que nos interesa en este curso. Una característica interesante de este software es su condición multiplataforma y su constante actualización.

De hecho, de todas las versiones que observarás en la página de descarga indicada, si tu ordenador es de 32 bits, la versión que se recomienda descargar desde comienzos de 2012 es la Win32 OpenSSL v1.0.0j. Además, es necesario tener instalada la librería Visual C++ 2008 Redistributables.

Las siguientes capturas de pantalla muestran los distintos pasos y estados de esta instalación desde Shining Light Productions. Es recomendable hacerlo desde este sitio Web porque se encuentran en el mismo lugar los dos archivos necesarios: el programa y la librería C++.

Página Web de Shining Light Productions

Archivos de instalación

Archivos de instalación descargados

Si lo deseas, puedes descargar también el programa desde la propia página Web de OpenSSL. En este caso, es posible que encuentres una versión más actual, como así ocurre en julio de 2012 en que la última versión en la página Web de OpenSSL es la 1.0.1c de fecha 10 de mayo de 2012.

Práctica 7.1.1
Sigue los pasos que se indican e instala OpenSSL Win32 en tu PC.
1. Ve a la página de Shining Light Productions y descarga en C:\Criptolab la librería Visual C++ 2008 Redistributables e instala el software en tu disco duro. Si no lo haces no funcionará OpenSSL y tendrás un mensaje de error.
2. Desde el mismo sitio Web descarga en C:\Criptolab la versión necesaria de Win32 OpenSSL para tu ordenador.
3. Instala el software aceptando por defecto la carpeta que te indica, normalmente C:\OpenSSL-Win32.
4. Deberán aparecerte estas dos ventanas, al inicio y al final de la instalación. Puedes desmarcar esa donación y pulsar Finish.
5. Ya tienes instalado correctamente OpenSSL.

   

Inicio y término de la instalación

Error al no instalar la librería Visual C++ 2008 Redistributable

Una vez intalado Win32 OpenSSL, desde el indicador del sistema puedes ejecutar en modo comando el programa que se encuentra en C:\OpenSSL-Win32\bin>.

Ventana del sistema

En la siguiente figura se muestran los comandos más importantes de OpenSSL.

Comandos de OpenSSL

Observa que entre ellos aparecen los comandos genrsa y rsa, que nos permitirán generar claves, al igual que hacíamos con el software genRSA. Como caso anecdótico, en una búsqueda en Google por genrsa, aparecerá primero el software de laboratorio de desarrollo propio de D. Carlos Pérez García que hemos venido usando en este curso. Otro dato curioso es que OpenSSL no tiene una ayuda online con algún comando como ? o help.

Cuestiones para reflexionar e investigar:
1. ¿Por qué es necesario instalar además la librería Visual C++ 2008 Redistributables?
2. Con OpenSSL se pueden hacer muchas más operaciones criptográficas. Mira por ejemplo los comandos en esta página Web OpenSSL Command-Line HOWTO.


APARTADO 7.2. GENERACION DE CLAVES RSA Y CONVERSION A TEXTO

Generación de claves RSA con OpenSSL

El comando para generar claves RSA de OpenSSL que aparece en su Web es el siguiente:

  openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

Desde el apartado Documentos de la página Web de OpenSSL observamos los argumentos del comando genrsa.

Argumentos del comando genrsa

Como primer ejercicio, vamos a generar una clave de 1.024 bits de nombre c4yRSA1 como se observa en la siguiente figura. Para ello usaremos el siguiente comando:

  C:\OpenSSL-Win32\bin>openssl genrsa -out c4yRSA1 1024

Generación de la clave c4yRSA1 de 1.024 bits

Seguramente te preguntarás qué significan esos puntos y esas cruces que aparecen en dos líneas mientras se calcula la clave. Se trata de la indicación que nos hace el programa que está intentando encontrar un primo p y luego un primo q, y comprobando que ambos son primos. Más adelante tendrás ocasión de comprobarlo cuando calcules una clave muy grande y por tanto tarde bastante tiempo en generarse. Además comprobamos que si no especificamos nada al respecto, OpenSSL usa como clave pública estándar el número 4 de Fermat: 65.537 ó 0x10001.

Ejecuta el siguiente comando y comprueba que para generar esta clave 8.192 bits el programa tarda varios segundos, lo que se observa en la velocidad en que van apareciendo los puntos y las cruces.

  C:\OpenSSL-Win32\bin>openssl genrsa -out muygrande 8192

Generación de la clave muygrande de 8.192 bits

Si has estado atento a los dos ejercicios anteriores, te habrás dado cuenta que en el primero el programa nos entregaba un mensaje de error diciendo unable to write 'random state' y en el segundo ese mensaje ya no aparecía. Es más, seguramente habrás obtenido en ambas claves que has generado el mismo mensaje de error.

Esto se debe a que para la primera clave hemos ejecutado OpenSSL en Windows sin ser administrador del sistema y en el segundo ejemplo sí lo hemos hecho como administrador. El mensaje de error nos indica que OpenSSL no puede abrir un archivo de semilla, aunque esto no sea un problema para que generemos aquí nuestra clave. Puedes ver varias respuestas sobre esto en Internet o bien desde las FAQs de OpenSSL.

Para no recibir ese mensaje de error, debemos entrar como administrador o, más cómodo, ejecutar DOS como administrador utilizando para ello el botón derecho del ratón en el icono de sistema como se muestra en la siguiente figura.

   

Generación de la clave c4yRSA1 de 1.024 bits como administrador

Práctica 7.2.1
En esta práctica vas generar tres claves RSA de diferentes tamaños. En cada caso observa cómo se genera, el tiempo que tarda y el valor que te indica de la clave pública e.
1. Primero vas a generar una clave de 2.048 bits, no como administrador, desde la línea de comandos del sistema o DOS:
    C:\OpenSSL-Win32\bin>openssl genrsa -out claveRSA1 2048
2. Ya como administrador, genera ahora esta segunda clave de 4.096 bits indicando que la clave pública e es la estándar:
    C:\OpenSSL-Win32\bin>openssl genrsa -out claveRSA2 -f4 4096
3. Y por último, también como administrador, genera esta clave de 1.024 bits y ahora indicas que la clave pública e es igual a 3:
    C:\OpenSSL-Win32\bin>openssl genrsa -out claveRSA3 -3 1024
Saca conclusiones de lo que has visto.

Generada una clave, podemos abrirla por ejemplo con WordPad para ver su valor en representación Base64. Si no ejecutamos ningún otro comando, sólo nos mostrará la clave privada como se observa en la figura siguiente.

Clave privada c4yRSA1 en formato Base64 editada con WordPad

Para ver la clave pública, deberemos ejecutar antes el siguiente comando:

  C:\OpenSSL-Win32\bin>openssl rsa -in c4yRSA1 -pubout

Exportación de la clave pública c4yRSA1 en formato Base64

Si generas varias claves de 1.024 bits, verás que los primeros caracteres Base64 son iguales para todas ellas: MIG... para la clave pública y MII... para la clave privada. Lo comprobarás en la siguiente práctica.

Práctica 7.2.2
Esta práctica te va a permitir observar algunas características de las claves generadas por OpenSSL como, por ejemplo, sus valores en formato Base64 y el hecho de que los primeros caracteres en dicho formato son iguales, siempre y cuando sean iguales también los tamaños de las mismas.
Genera 10 claves de 1.024 bits, 10 claves de 2.048 bits y 10 claves de 4.096 bits. En cada una de ellas observa el archivo Base64 de la clave privada y de la clave pública y comprueba que los primeros caracteres son iguales.

Claves públicas RSA de 1.024 bits en formato Base64

Claves privadas RSA de 1.024 bits en formato Base64

Conversión de claves RSA binarias a formato texto

Convertir la clave pública RSA a formato texto Base64 tiene sentido porque nos permite exportarla y darla a conocer a todo el mundo. La pregunta que te puedes estar haciendo en este momento es porqué queremos también convertir toda la clave RSA de formato binario a formato texto.

La respuesta es simple. Con esta transformación obtendremos un archivo en donde se mostrarán todos los parámetros de esa clave en formato hexadecimal; es decir, los números p, q, n, e y d. Además veremos que hay otros tres parámetros que nos permitirán usar en el descifrado el teorema chino de los restos, a tratar en el apartado 7.4.

Usaremos entonces esos valores de los primos p y q, y la clave pública e entregados por OpenSSL, como entrada al software genRSA y generaremos manualmente esa clave. Entre otras cosas, esto nos permitirá comprobar si OpenSSL usa o no primos seguros en la generación de tales claves, especialmente cuando generemos de forma automática varias claves en el siguiente apartado.

Generada la clave c4yRSA1 de 1.024 bits con OpenSSL, vamos a convertirla a formato texto (hexadecimal) con el siguiente comando:

  C:\OpenSSL-Win32\bin>openssl rsa -in c4yRSA1 -text -out c4yRSA1Texto

Conversión de la clave c4yRSA1 a formato hexadecimal

Si abrimos el archivo c4yRSA1Texto por ejemplo con WordPad (para mantener el formato) tendremos un documento como éste:

Clave c4yRSA1Texto abierta con WordPad

Observamos los valores en hexadecimal del módulo de n, de la clave pública e, de la clave privada d y de los dos primos p y q indicados como prime1 y prime2. Hay otros parámetros que de momento no veremos.

Para poder utilizar estos valores, primero vamos a eliminar los : que separan los bytes y además la sangría de 4 espacios en blanco que se observa a la izquierda de los números. Simplemente le indicamos a WordPad que sustituya : por "nada" en todo el archivo y luego que sustituya "cuatro espacios en blanco" otra vez por "nada" en todo el archivo. Ahora, lo único que tenemos que hacer es que los números de p y q estén en una sola línea.

Ten cuidado al hacerlo. Te recomiendo vayas de abajo hacia arriba usando primero la tecla suprimir en el espacio a la derecha de la penúltima línea del número primo en cuestión y luego usa la flecha hacia arriba para hacer lo mismo en la línea superior hasta que se termine ese número. Hecho esto, deberías tener en tu monitor algo similar a esto:

Clave c4yRSA1Texto limpia para usar los valores de p, q y e y generar la clave con genRSA

Ahora sólo nos falta copiar en el portapales esos valores (p, q y e) y pegarlos en el programa genRSA, al que previamente hemos cambiado sus unidades de trabajo a hexadecimal. Hecho esto, pulsamos en el icono superior izquierdo de Generación Manual de clave, obteniendo la clave que se observa en la figura.

Clave c4yRSA1 generada manualmente por genRSA con los valores aportados por OpenSSL

Como puedes apreciar, indicando en el comando solamente que el tamaño de la clave era 1.024 bits, OpenSSL se ha generado una clave RSA con dos primos p y q cada uno de 512 bits, un módulo n de 1.024 bits, la clave pública e estándar con el número 4 de Fermat 0x10001 y una clave privada d con un tamañode 1.023 bits, lo que ya hemos hecho en lecciones anteriores con genRSA pero mediante Generación de Clave Automática.

En este caso la clave generada es de las que hemos denominado óptimas, con una clave privada pareja y 9 números no cifrables. ¿Generará siempre OpenSSL claves óptimas? En el siguiente apartado lo veremos.

Práctica 7.2.3
En esta práctica vas a realizar un ejemplo similar al que acabas de ver en este apartado.
1. Genera con OpenSSL una clave de 1.024 bits con e = 0x10001 de nombre clavePrac723.
2. Guárdala ahora en formato texto con el nombre clavePrac723texto.
3. Edita con WordPad el archivo clavePrac723texto y realiza las mismas operaciones que se han hecho en este apartado.
4. Deja los valores de prime1 y prime2 en una sola línea.
5. Abre la aplicación genRSA y cambia las unidades a hexadecimal.
6. Copia el valor de los primos p y q y de la clave pública e en las casillas correspondientes de genRSA.
7. Pulsa Generación Manual para generar la clave y observa todos los parámetros de la clave generada.
8. Si has obtenido una clave óptima, repite la práctica volviendo a generar una clave del mismo nombre.
9. Repite todos los pasos hasta dar con una clave no óptima, es decir con CPP > 1 o bien NNC > 9.

Cuestiones para reflexionar e investigar:
1. ¿Qué significa el mensaje de la primera línea de la pantalla al crear una clave Loading 'screen' into random state - done?
2. ¿Exactamente qué tipo de actividad indican esos puntos y rayas que va apareciendo en el monitor al generar la clave?
3. ¿Podrías crear una clave de 64.000 bits con OpenSSL? Intenta crear una clave de 24.000 bits con OpenSSL y observa lo que tarda el programa en generarla. Deberás tener mucha paciencia y tiempo porque puede tardar varias horas.
Si tienes curiosidad sobre este tema de la longitud máxima de una clave RSA, mira este enlace: Creating 32768 bit RSA keys for fun and profit.
4. ¿Cuántos y cuáles son los caracteres iguales en Base64 en las claves privadas y públicas RSA para tamaños de 1.024, 2.048 y 4.096 bits?
5. ¿Qué nos indican esos caracteres iguales en Base64 al comienzo de las claves?


APARTADO 7.3. GENERACION DE MULTIPLES CLAVES RSA CON RSA MANAGER

Para saber qué tipo de claves genera normalmente OpenSSL, deberás repetir varias veces, en media unas 10, lo que hicimos al final del apartado anterior.

Como has comprobado, la operación más tediosa era convertir la clave binaria a formato texto y encontrar los valores en hexadecimal de los primos p y q para usarlos en el programa genRSA. Sería por tanto muy interesante tener una aplicación que generase automáticamente estas claves y nos entregase los valores de p y q.

El alumno de la asignatura Seguridad Informática que se impartía en la carrera de Ingeniería Técnica en Informática de Gestión en la UPM D. Miguel Schlereth Martínez presenta como solución a una práctica propuesta en el curso 2007/2008 una aplicación sencilla y fácil de usar que automatiza esta tarea. Al ser el mejor software presentado para esa práctica, con su consentimiento hago público ese software que lleva por nombre RSA Manager. En el mismo archivo de descarga de RSA Manager hay un Manual de Uso de la aplicación.

En las siguientes figuras se muestra la generación automática de varias claves con RSA Manager.

Pantalla del programa RSA Manager

Con la opción por defecto Generar Claves RSA, una vez hemos indicado la ruta donde está instalado OpenSSL, el número de claves a generar, su tamaño y el nombre genérico de estas claves, pulsamos en Ejecutar.

12 claves generadas con RSA Manager

Ahora usamos la opción Procesar claves en formato hexadecimal, damos a Seleccionar archivos, seleccionamos las 12 claves que se han guardado en la misma carpeta donde se ha instalado el programa RSA Manager y pulsamos en Abrir para cargarlos en la ventana. Luego pulsamos en Procesar y se obtiene la siguiente pantalla.

Claves en formato texto

Haciendo un solo clic en un valor de p y de q para seleccionarlo (otro clic para deseleccionar) podemos copiar ese valor al portapales y copiarlo luego en el programa genRSA como ya lo hicimos en el apartado anterior.

Práctica 7.3.1
1. En esta práctica debes generar 20 claves con RSA Manager y obtener los pares de primos p y q para cada clave.
2. Luego, con esos valores de p y q y conociendo que e = 0x10001 vas a generar las correspondientes claves con genRSA.
3. Observa en cada una de ellas la cantidad de claves privadas parejas y de números no cifrables.
4. ¿Son las 20 claves óptimas?

Cuestiones para reflexionar e investigar:
1. ¿Cómo crees que se podría mejorar el software RSA Manager? ¿Qué le añadirías?
2. Si has llegado a la conclusión de que OpenSSL no genera siempre claves RSA óptimas, ¿por qué se dice que esto no significa una vulnerabilidad de la clave?
3. ¿Por qué crees que OpenSSL no se preocupa de este asunto?


APARTADO 7.4. PARAMETROS DE OPENSSL PARA SU USO EN EL TRC

Como habrás observado, cuando editamos la clave en formato texto además de los parámetros característicos de RSA, OpenSSL nos entrega tres parámetros nuevos (exponent1, exponent2 y coefficient) para poder utilizar el teorema chino del resto en el descifrado de un criptograma.

Recordando la fórmula de Garner de la Lección 6, teníamos que:
  m = m2 + h * q
  h = qInv * [(m1 - m2)] mod p
  Donde:   m1 = Cdp mod p ;     m2 = Cdq mod q

Por tanto, reemplazando en estas expresiones la nomenclatura que usa OpenSSL, obtenemos:
  1. m1 = Cexponent1 mod p
  2. m2 = Cexponent2 mod q
  3. h = coefficient * [(m1 - m2)] mod p
  4. m = m2 + h * q

Haremos un ejemplo con números pequeños. Vamos a generar con OpenSSL una clave de sólo 32 bits de nombre RSAejemploTRC y usaremos el programa Fortaleza de Cifrados para las operaciones.

Clave RSAejemploTRC en formato texto

Observa que al ser muy pequeño el tamaño de la clave, OpenSSL nos la muestra en formato decimal y hexadecimal. Vamos a cifrar con esta clave el valor 111.222.333 como muestra la figura.


Cifrado y descifrado con la clave RSAejemploTRC en el módulo n = 3.431.586.937

Para descifrar con el teorema chino del resto utilizamos los valores en las expresiones de la fórmula de Garner para OpenSSL, usando el software Fortaleza de Cifrados:
  1. m1 = Cexponent1 mod p = 1.189.405.58147.415 mod 62.303 = 11.478
  2. m2 = Cexponent2 mod q = 1.189.405.58129.053 mod 55.079 = 17.832
  3. h = coefficient * [(m1 - m2)] mod p = 52.566 * [(11.478 - 17.832)] mod 62.303
      h = 52.566 * [-6.354] mod 62.303 = -334.004.364 mod 62.303 = 2.019
  4. m = m2 + h * q = 17.832 + 2.019 * 55.079 = 17.832 + 111.204.501 = 111.222.333

Práctica 7.4.1
1. Genera con OpenSSL una clave de 900 bits de nombre claveTRCconFortaleza y conviértela en modo texto Base64. Los 900 bits son para que los valores puedan usarse sin problema con el software Fortaleza de Cifrados.
2. Usando el Conversor dec2hex convierte los parámetros hexadecimales de la clave a decimales.
3. Con el software Fortaleza de Cifrados repite la práctica del ejemplo ya visto de descifrado con el teorema chino del resto.

Cuestiones para reflexionar e investigar:
1. ¿Hasta qué valor de bits OpenSSL nos muestra la clave en decimal y en hexadecimal?


APARTADO 7.5. TEST DE EVALUACION DE LA LECCION RSA07

En las siguientes 5 preguntas, elige la respuesta correcta.

1. Para generar una clave RSA con OpenSSL en Windows usaremos:

a) El botón derecho del ratón sobre el programa OpenSSL
b) El modo comando desde DOS
c) La opción doble clic en el programa openssl.exe

2. Si no se especifica el valor de la clave pública e, OpenSSL usa el número:

a) 65.537
b) 65.536
c) 67.535

3. Para usar el TRC OpenSSL nos entrega los siguientes datos extra en la clave:

a) prime1, prime2, coefficient
b) exponent1, exponent2, coefficient
c) modulus, exponent1, exponent2

4. La afirmación OpenSSL genera claves RSA que en formato texto sólo se muestran en hexadecimal es:

a) Cierta
b) No es posible convertir una clave a formato texto
c) Falsa

5. Indica la afirmación más acertada:

a) OpenSSL genera más de un 90% de claves óptimas
b) OpenSSL genera aproximadamente un 50% de claves óptimas
c) OpenSSL genera siempre claves óptimas


Ir a: [Portada c4y]    [Lección 6] [Índice] [Lección 8]