Estos dos últimos días he estado utilizando la herramienta de línea de comandos que tiene el toolkit de openssl para realizar varias tareas de firmado y generación de claves en un entorno de criptografía asimétrica, también conocida como criptografía de clave pública.
Quería probar la facilidad con la que se pueden generar claves para firmado y cifrado con el toolkit. Lo primero que hay que tener claro es que tipo de algoritmos de clave pública se quiere utilizar. En función de la versión del toolkit que se tenga instalada y las opciones que se hayan elegido a la hora de compilar el mismo, se dispondrán de algoritmos basados en curvas elípticas, DSA (Digital Signature Algorithm), extandar FIPS 186-3 , RSA ( Ron Rivest, Adi Shamir and Leonard Adleman) o claves para el intercambio usando el algoritmo de Diffie–Hellman. Lo primero que hay que hacer es elegir el algoritmo que se desea usar . Cada uno de los algoritmos tiene sus particularidades, para quien tenga curiosidad un buen libro que habla del tema es el Applied Cryptography: Protocols, Algorithms, and Source Code in C, Second Edition de Bruce Schneier.
Generación de claves
La secuencia de órdenes para generar un par de claves públicas y privadas para firmado es:
- Generar los parámetros para las claves en función del algoritmo que se desee usar (con la excepción de RSA)
- Generar la clave a partir de los parámetros del punto anterior y guardarlo en el formato que se desee.
- Extraer la información de la clave pública que se usa para las verificaciones.
- Realizar las correspondientes operaciones que se desee.
Si se desea realizar los pasos anteriores para una clava de tipo DSA, las órdenes que habría que introducir serían:
openssl dsaparam -outform PEM -out dsa.params.pem 4096
openssl gendsa -out private.pem dsa.params.pem
openssl dsa -in private.pem -outform PEM -out public.pem -pubout
- Se genera un fichero de parámetros para poder generar una clave de tipo DSA de 4096 bits de longitud. Este fichero de parámetros se va almacenar en formato PEM (-outform PEM) con el nombre dsa.params (-out dsa.params). Con el formato elegido, el fichero dsa.params es un archivo de texto que puede verse en un editor fácilmente.
- Generamos la clave privada y pública DSA que se va a almacenar en el fichero private.pem (-out private.pem) a partir de la información que hay en dsa.params.pem. Decir que el fichero resultante, private.pem puede estar protegido cifrado usando el algoritmo DES (-des), tripe DES (-3des) o IDEA (-idea) o AES (-aes128,-aes192 o -aes256). Sino se especifica ninguno, no se cifrará. El fichero de parámetros debe de tener codificación PEM para que funcione correctamente esta orden.
- Se obtiene la clave pública (-pubout) desde el fichero que contiene ambas (-in private.pem), para almacenarla en formato PEM (-outform PEM) en el fichero public.pem (-out public.pem).
Firmado de un fichero
A la hora de firmar ficheros, se utiliza las opciones de dgst. Una particularidad es que con claves DSA, hay que usar el message digest dss1, lo que implica usar la opción -dss1. Para firmar es necesario la clave privada.
openssl dgst -dss1 -sign private.pem -out file.sign file
En este caso openssl generará una firma del fichero file, con el message digest dss1 (-dss1) usando la clave privada que está en private.pem (-sign private.pem) cuyo resultado almacenará en el fichero file.sign (-out file.sign)
Verificación de una firma
A la hora de verificar una firma se utiliza la clave pública que es pareja de la clave privada que se utilizó para firmar. Al igual que en el caso anterior, al estar usando claves DSA el message digest que hay que usar obligatoriamente es dss1
openssl dgst -dss1 -verify public.pem -signature file.sign file
Verificamos el fichero file cuya firma está contenida en el fichero file.sign (-signature file.sign) con la clave pública que está en public.pem (-verify public.pem), usando el message digest dss1 (-dss1). Decir que en este caso la opción -verify indica tanto el fichero de clave pública como que se va a proceder a realizar una verificación usando la misma.
Notas
Se que he dejado muchas cosas en el tintero, por ejemplo la necesidad de tener una fuente de entropía que se utiliza para calcular números aleatorios o la posibilidad de utilizar diversos motores para realizar las operaciones, que permitan descargar el procesador de las tareas de cálculo. He pasado de puntillas por los formatos de codificación que se pueden usar y no he hablado de como cifrar un fichero usando (se puede ver la página de manual de enc)
Technorati Tags: openssl,criptografía,cifrado
No hay comentarios:
Publicar un comentario