Cifrado y firma digital con OpenSSL: práctica de clave de sesión, RSA y DES
Práctica de cifrado y firma digital con OpenSSL
A continuación se recoge la secuencia de comandos empleada para generar claves, cifrar y descifrar mensajes, y firmar y verificar documentos entre dos usuarios mediante OpenSSL.
1. Historial de comandos de referencia
188 openssl rsautl -decrypt -inkey privada_alumno -in clave.sesion.cifrada -out clave.sesion
189 openssl rsautl -decrypt -inkey mens1.text.des -in clave.sesion -out mensajeuno
190 openssl enc --help
191 openssl enc -d -in mens1.txt.des -kfile clave.sesion -out mensaje1 -des
192 openssl enc -d -in firma1.des -kfile clave.sesion -out firma1 -des
193 openssl rsautl -verify -in firma1.des -out firma1 -inkey publica -pubin
194 openssl dgst mensaje1
195 openssl enc -d -in mens2.txt.des -kfile clave.sesion -out mensaje2 -des
196 openssl rsautl -verify -in firma2.des -out firma2 -inkey publica -pubin
197 openssl dgst mensaje2
198 openssl enc -d -in mens3.txt.des -kfile clave.sesion -out mensaje3 -des
199 openssl rsautl -verify -in firma3.des -out firma3 -inkey publica -pubin
200 openssl dgst mensaje3
201 cat firma3
202 echo "A qué hora es la entrega" > respuesta
203 openssl enc -e -in respuesta -kfile clave.sesion -out respuesta.des -des
204 cat respuesta.des
205 openssl dgst respuesta.des > resp.des.md5
206 cat resp.des.md5
207 openssl rsautl -sign -in resp.des.md5 -out firmaresp -inkey privada_alumno
208 openssl enc -e -in firmaresp -kfile clave.sesion -out firmaresp.des -des
2. Generación de la pareja de claves del Usuario1
Genera su pareja de claves pública y privada.
openssl genrsa -out privada.usuario1 2048openssl rsa -in privada.usuario1 -pubout > publica.usuario1cp publica.usuario1 ../usuario2
echo "Supercalifragilisticoexpialidoso" > clave.sesion
3. Cifrado de la clave de sesión
Usuario1 cifra la clave de sesión con la clave pública del Usuario2, que previamente ha recibido.
openssl rsautl -encrypt -inkey publica.usuario2 -in clave.sesion -out clave.sesion.cifrada -pubincp clave.sesion.cifrada ../usuario2
4. Creación y cifrado del mensaje
echo -e "Este fichero se va a utilizar para realizar pruebas de cifrado y descifrado con openssl.\nBuenas tardes." > fichero.txt
Usuario1 cifra ahora el fichero del mensaje con la clave de sesión.openssl enc -e -des -in fichero.txt -out fichero.txt.des -kfile clave.sesionopenssl dgst fichero.txt > fichero.md5
5. Firma digital
Usuario1 firma el hash con su clave privada.openssl rsautl -sign -inkey privada.usuario1 -in fichero.md5 -out fichero.md5.firma
Y ahora también se cifra la firma, con la clave de sesión, como cualquier fichero que se transmita a Usuario2.openssl enc -e -des -in fichero.md5.firma -out fichero.md5.firma.des -kfile clave.sesion
cp fichero.txt.des fichero.md5.firma.des ../usuario2
6. Generación de la pareja de claves del Usuario2
Usuario2 genera su propia pareja de claves:
openssl genrsa -out privada.usuario2 2048openssl rsa -in privada.usuario2 -pubout > publica.usuario2
Y transmite su clave pública a Usuario1, que la necesita para cifrar la clave de sesión.cp publica.usuario2 ../usuario1
7. Descifrado y verificación por parte del Usuario2
Usuario2 descifra la clave de sesión con su clave privada.openssl rsautl -decrypt -inkey privada.usuario2 -in clave.sesion.cifrada -out clave.sesion
Usuario2 descifra el fichero del mensaje con la clave de sesión.openssl enc -d -des -in fichero.txt.des -out fichero.txt -kfile clave.sesion
Antes de leer el mensaje, comprueba su autenticidad de procedencia con la firma. Lo primero es descifrar el fichero de firma con la clave de sesión.openssl enc -d -des -in fichero.md5.firma.des -out fichero.md5.firma -kfile clave.sesion
Una vez descifrado, verifica la firma con la clave pública de Usuario1.openssl rsautl -verify -in fichero.md5.firma -out fichero.md5 -inkey publica.usuario1 -pubin
Ya con los ficheros en claro, se puede visualizar el hash de la firma:cat fichero.md5
Este valor debe ser IDÉNTICO al obtenido con openssl dgst fichero.txt.