Diferencia entre revisiones de «Página principal»
| (No se muestran 22 ediciones intermedias del mismo usuario) | |||
| Línea 6: | Línea 6: | ||
=== WINDOWS === | === WINDOWS === | ||
| − | |||
| − | |||
Para la instalación de OpenSSL en Windows, se debe de realizar correctamente los pasos que se describen a continuación. Además, al instalar OpenSSL puede que el sistema requiera usar Microsoft Visual C++ ([https://support.microsoft.com/es-es/help/2977003/the-latest-supported-visual-c-downloads Descarga]). | Para la instalación de OpenSSL en Windows, se debe de realizar correctamente los pasos que se describen a continuación. Además, al instalar OpenSSL puede que el sistema requiera usar Microsoft Visual C++ ([https://support.microsoft.com/es-es/help/2977003/the-latest-supported-visual-c-downloads Descarga]). | ||
| Línea 64: | Línea 62: | ||
'''Nota:''' Puede que al instalar la herramienta OpenSSL para equipos de 32 bits, los directorios cambien. | '''Nota:''' Puede que al instalar la herramienta OpenSSL para equipos de 32 bits, los directorios cambien. | ||
| − | === | + | === Ubuntu y CentOS === |
| − | En este apartado se explica como instalar manualmente la última versión de OpenSSL en una distribución | + | En este apartado se explica como instalar manualmente la última versión de OpenSSL en una distribución Ubuntu o CentOS |
| − | ''Nota:'' | + | ''Nota:''Muchas distribuciones de CentOS y Ubuntu ya tienen instalada una versión de OpenSSL que suele ser anterior a la última. Además, la versión instalada es utilizada por varios componentes del sistema operativo. Por ello, mostramos como instalar la última versión sin afectar a la ya instalada en el sistema, que seguirá igual que antes de la instalación. Es decir, después de estas operaciones, el sistema seguirá utilizando las librerías OpenSSL de la versión antigua en todas sus aplicaciones (httpd, etc.) pero los usuarios dispondrán de |
| + | los comandos "openssl" y "c_rehash" de la nueva versión. | ||
| + | |||
| + | ;Antes de empezar: | ||
| + | Tenemos que estar seguros de que el sistema está actualizado y que tiene instalado el compilador gcc y sus librerías, la utilidad "make", librerías de desarrollo,etc. | ||
| + | |||
| + | En Centos: | ||
| + | |||
| + | <code> sudo yum update -y </code> | ||
| + | |||
| + | <code> sudo yum group install 'Development Tools' </code> | ||
| + | |||
| + | <code> sudo yum install perl-core zlib-devel -y </code> | ||
| + | |||
| + | En Ubuntu: | ||
| + | |||
| + | <code> sudo apt-get update && sudo apt-get upgrade </code> | ||
| + | |||
| + | <code> sudo apt install build-essential checkinstall zlib1g-dev -y </code> | ||
;Paso 1: | ;Paso 1: | ||
| − | + | Averiguar cuál es y descargar la última versión de OpenSSL: | |
| − | + | Para averiguar cuál es la última versión de OpenSSL hay que acceder a https://www.openssl.org/source y apuntar el nombre del fichero en la primera línea de la tabla de descargas | |
| − | + | A fecha de la última actualización de esta Wiki la versión disponible es la openssl-1.1.1e.tar.gz y esta es la que usaremos en este ejemplo. | |
| − | <code> | + | <code> cd /tmp</code> |
| + | |||
| + | <code> wget https://www.openssl.org/source/openssl-1.1.1e.tar.gz </code> | ||
| + | |||
| + | <code> tar xvf openssl-1.1.1e.tar.gz </code> | ||
;Paso 2: | ;Paso 2: | ||
A continuación, ejecutamos los siguientes comandos para realizar la instalación de esta herramienta: | A continuación, ejecutamos los siguientes comandos para realizar la instalación de esta herramienta: | ||
| + | Accedemos al directorio de los fuentes de OpenSSL: | ||
| + | |||
| + | <code> cd openssl-1.1.1e</code> | ||
| + | |||
| + | Configuramos el directorio de destino: | ||
| + | |||
| + | <code> sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib </code> | ||
| − | + | Compilamos, probamos e instalamos: | |
| − | <code> | + | <code> sudo make</code> |
| − | + | Empieza la compilación de todas las fuentes... tarda varios minutos | |
| − | <code> | + | <code> sudo make test </code> |
| − | + | Se ejecutan los tests de binarios y librerias ... tarda varios minutos | |
| − | |||
| − | + | Y si todo ha ido bien... | |
| − | <code> | + | <code> sudo make install </code> |
| − | + | Se instalan los binarios y las librerías bajo el directorio /usr/local/ssl | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
;Paso 3: | ;Paso 3: | ||
| − | + | Activar las librerías de la nueva versión, para ello hay que crear el fichero /etc/ld.so.conf.d/openssl-1.1.1e.conf con "/usr/local/ssl/lib" como contenido: | |
| + | |||
| + | <code> sudo echo "/usr/local/ssl/lib" > /etc/ld.so.conf.d/openssl-1.1.1e.conf </code> | ||
| − | <code> | + | El siguiente comando fuerza la recarga de las librerías y con ella se activa la nuestra: |
| + | |||
| + | <code> sudo ldconfig -v </code> | ||
;Paso 4: | ;Paso 4: | ||
| − | + | Añadir /usr/local/ssl/bin al principio de la variable de entorno PATH, esto hará que el comando openssl se busque antes en el directorio de nuestra instalación que en el ya existente (típicamente /usr/bin). Esto se puede hacer para nuestro usuario o para todos los usuarios: | |
| − | + | a) Para todos los usuarios del sistema: la manera más sencilla tanto en CentOS como en Ubuntu es: | |
| − | <code> | + | </code> sudo echo "PATH=/usr/local/ssl:\$PATH" >> /etc/profile </code> |
| − | + | b) Sólo para nuestro usuario, en este caso será distinto si tenemos CentOS o Ubuntu ya que el primero típicamente usa ~/.bash_profile y el segundo ~/.profile | |
| − | ;Paso | + | en Centos : |
| + | |||
| + | <code> sudo echo "PATH=/usr/local/ssl/bin:\$PATH ; export PATH" >> ~/.bash_profile </code> | ||
| + | |||
| + | en Ubuntu : | ||
| + | |||
| + | <code> sudo echo "PATH=/usr/local/ssl/bin:\$PATH" >> ~/.profile </code> | ||
| + | |||
| + | ;Paso 5: | ||
| + | Salir de la sesión, volver a entrar y probar que funciona con | ||
| − | + | <code> openssl version </code> | |
| + | Y debe aparecer la versión instalada. | ||
===MAC OS=== | ===MAC OS=== | ||
| Línea 163: | Línea 190: | ||
== Resúmenes == | == Resúmenes == | ||
| − | === Funciones hash === | + | === Funciones de resumen o funciones "hash" === |
[[File:Hash function2-es.svg|250 px|thumb]] | [[File:Hash function2-es.svg|250 px|thumb]] | ||
| − | A las funciones resumen también se les llama funciones hash o funciones digest. Las funciones hash criptográficas <ref>Colaboradores de Wikipedia. Función hash [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash&oldid=107845867>.</ref> son aquellas que | + | A las funciones de resumen también se les llama funciones hash o funciones digest. Las funciones hash criptográficas <ref>Colaboradores de Wikipedia. Función hash [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash&oldid=107845867>.</ref> son aquellas que aceptan cualquier entrada y producen una salida consistente en una ristra de bits de tamaño fijo, que representa un "resumen" de toda la información del fichero de entrada. <ref>Estilo ISO de citas bibliográficas Colaboradores de Wikipedia. Función hash criptográfica [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.</ref> Uno de los requisitos de estas funciones es que debe ser complejo encontrar colisiones, es decir, debe ser complejo encontrar dos mensajes distintos con el mismo resumen. <ref>D. Eloi Sanfelix. Curso de privacidad y protección de comunicaciones digitales [en línea]. Universidad Politécnica de Madrid, 2013 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.</ref> |
| − | Se llaman funciones hash criptográficas a aquellas funciones hash que se utilizan en el área de la criptografía. Este tipo de funciones se caracterizan por cumplir propiedades ( | + | Se llaman funciones hash criptográficas a aquellas funciones hash que se utilizan en el área de la criptografía. Este tipo de funciones se caracterizan por cumplir propiedades (mezcla fuerte, dificultad de encontrar colisiones, etc.) que las hacen idóneas para su uso en sistemas que confían en la criptografía para dotarse de seguridad, garantizando que no se ha modificado un archivo en una transmisión, hacer ilegible una contraseña, firmar digitalmente un documento, protección de claves, etc. Estas propiedades las hacen resistentes frente ataques maliciosos que intentan romper esa seguridad.<ref>Estilo ISO de citas bibliográficas Colaboradores de Wikipedia. Función hash criptográfica [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.</ref> |
'''''dgst''''' | '''''dgst''''' | ||
| + | |||
| + | A continuación se muestran las opciones más habituales de este comando, que debe ser consultado en la documentación de OpenSSL (https://www.openssl.org/docs/man1.1.1/man1/dgst.html) | ||
; -digest | ; -digest | ||
| − | Especifica el nombre | + | Especifica el nombre de la función de resumen utilizada. |
; -binary | ; -binary | ||
| Línea 188: | Línea 217: | ||
Firma el resumen usando la clave privada en "filename" | Firma el resumen usando la clave privada en "filename" | ||
| + | |||
| + | ; -keyform arg | ||
| + | |||
| + | Especifica el formato de la clave (pública o privada) en "arg", que será PEM (por defecto), DER, P12, ó ENGINE. | ||
; -verify filename | ; -verify filename | ||
| − | Verifica la firma usando la clave pública en "filename". | + | Verifica la firma usando la clave pública en "filename". El resultado será: "Verification OK" o "Verification Failure". |
; -signature filename | ; -signature filename | ||
| Línea 199: | Línea 232: | ||
; -hmac key | ; -hmac key | ||
| − | Crea un hash MAC usando "clave | + | Crea un hash MAC usando "key" como clave. |
| Línea 206: | Línea 239: | ||
==== MD5 ==== | ==== MD5 ==== | ||
| − | MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después de que Hans Dobbertin descubriese su debilidad. Se trata de un algoritmo de reducción criptográfico de 128 bits (32 caracteres hexadecimales) ampliamente usado. Uno de sus usos es el de comprobar que algún archivo no haya sido modificado. A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados desde que, en 1996, Hans Dobbertin anunciase una colisión de hash, plantea una serie de dudas acerca de su uso futuro. <ref>MD5. (2018, 11 de septiembre). Wikipedia, La enciclopedia libre. Fecha de consulta: 16:43, noviembre 5, 2018 desde https://es.wikipedia.org/w/index.php?title=MD5&oldid=110565562.</ref> Cabe destacar, que existe algoritmos anteriores pertenecientes a la familia MD5 como fueron MD1, MD2, MD3 y MD4. Aunque MD5 esté en desuso por sus vulnerabilidades, se debe conocer como funciona, ya que | + | MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después de que Hans Dobbertin descubriese su debilidad. Se trata de un algoritmo de reducción criptográfico de 128 bits (32 caracteres hexadecimales) ampliamente usado. Uno de sus usos es el de comprobar que algún archivo no haya sido modificado. A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados desde que, en 1996, Hans Dobbertin anunciase una colisión de hash, plantea una serie de dudas acerca de su uso futuro. <ref>MD5. (2018, 11 de septiembre). Wikipedia, La enciclopedia libre. Fecha de consulta: 16:43, noviembre 5, 2018 desde https://es.wikipedia.org/w/index.php?title=MD5&oldid=110565562.</ref> Cabe destacar, que existe algoritmos anteriores pertenecientes a la familia MD5 como fueron MD1, MD2, MD3 y MD4. Aunque MD5 esté en desuso por sus vulnerabilidades (se considera "roto" actualmente), se debe conocer como funciona, ya que existe multitud de documentos que han usado este algoritmo a lo largo de los años. |
| + | |||
| + | Se crea un ''texto.txt'' con un texto cualquiera que usaremos tanto para este ejemplo como para el resto del documento. | ||
| + | <pre>En un lugar de la Mancha de cuyo nombre no quiero acordarme...</pre>. | ||
;Paso 1: | ;Paso 1: | ||
| + | Se calcula el resumen MD5 del fichero "texto.txt". | ||
| − | + | <code> openssl dgst -md5 texto.txt </code> | |
| − | <pre> | + | <pre>MD5(texto.txt)= 4fa02d78a06b3833c190b464261d8c08</pre> |
| − | + | Como ejemplo de cómo varía un resumen ante mínimos cambios en el fichero de entrada, usaremos ahora un fichero "texto2.txt" idéntico, salvo la primera letra en minúsculas: | |
| − | </pre>. | + | <pre>en un lugar de la Mancha de cuyo nombre no quiero acordarme...</pre>. |
;Paso 2: | ;Paso 2: | ||
| + | Se calcula el resumen MD5 del fichero "texto2.txt". | ||
| − | + | <code> openssl dgst -md5 texto2.txt </code> | |
| − | <code> openssl dgst -md5 | + | <pre>MD5(texto2.txt)= 5ed88c107e07da73dcfa03893bb8e822</pre> |
| + | |||
| + | Y se observa que es absolutamente diferente del resumen anterior. | ||
| + | |||
| + | ;Paso 3 | ||
| + | En este caso, demostraremos que cualquier función de resumen produce un "hash" de salida, aunque la entrada sea nula: | ||
| + | |||
| + | <code> echo ""| openssl dgst -md5 </code> | ||
| − | <pre> | + | <pre>(stdin)= 68b329da9893e34099c7d8ad5cb9c940</pre> |
| − | |||
| − | </pre> | ||
====SHA-1==== | ====SHA-1==== | ||
| − | SHA-1 ( Secure Hash Algorithm 1 ) es una función criptográfica de | + | SHA-1 ( Secure Hash Algorithm 1 ) es una función criptográfica de resumen que admite cualquier entrada y produce un resultado de 160 bits (20 bytes), que generalmente se representa como un número hexadecimal , de 40 dígitos de longitud. Fue diseñado por la Agencia de Seguridad Nacional de los Estados Unidos y es un estándar de procesamiento de información federal de los Estados Unidos. <ref>Wikipedia contributors. (2018, October 28). SHA-1. In Wikipedia, The Free Encyclopedia. Retrieved 15:50, November 5, 2018, from https://en.wikipedia.org/w/index.php?title=SHA-1&oldid=866182340</ref> |
| + | |||
| + | En 2005, se identificaron fallos de seguridad en el SHA-1, permitiendo que existiera una debilidad matemática (ver la web http://shattered.io) evidenciando así la necesidad de sustituir el empleo de SHA-1 por funciones hash más robustas, como la familia SHA-2 que veremos en el apartado siguiente. | ||
;Paso 1: | ;Paso 1: | ||
| − | + | Se realizará un resumen SHA-1 del mismo fichero "texto.txt", usado en los ejemplos anteriores. | |
| − | Se realizará un resumen del "texto.txt", | ||
| − | |||
| − | |||
<code> openssl dgst -sha1 texto.txt </code> | <code> openssl dgst -sha1 texto.txt </code> | ||
| − | <pre> | + | <pre>SHA1(texto.txt)= 50820e3061249bb5470aa558eeb3da769369a6e3</pre> |
| − | SHA1(texto.txt)= 50820e3061249bb5470aa558eeb3da769369a6e3 | ||
| − | </pre> | ||
| − | |||
====SHA-2==== | ====SHA-2==== | ||
| − | SHA-2 es | + | SHA-2 es una familia de funciones hash criptográficas, con diversos tamaños de salida en bits (SHA2-224, SHA2-256, SHA2-384 y SHA2-512) diseñadas por la Agencia de Seguridad Nacional (NSA) y publicada en 2001 por el Instituto Nacional de Estándares y Tecnología (NIST) como un Estándar Federal de Procesamiento de la Información (FIPS). <ref>Colaboradores de Wikipedia. SHA-2 [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 15 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=SHA-2&oldid=110395255>.</ref> |
| − | |||
| − | |||
===== SHA224 ===== | ===== SHA224 ===== | ||
| − | Produce | + | Produce resúmenes de 224 bits (28 bytes) que generalmente se representan como un número hexadecimal de 56 dígitos de longitud. En las versiones actuales de OpenSSL se acostumbra a nombrar las funciones de la familia SHA-2 indicando directamente el tamaño después de la palabra SHA, es decir, SHA2-224 se nombra como "sha-224". |
;Paso 1: | ;Paso 1: | ||
| − | + | Se realizará un resumen SHA2-224 del mismo fichero "texto.txt" usado en los ejemplos anteriores. | |
| − | Se realizará un resumen del "texto.txt" | ||
| − | |||
| − | |||
<code> openssl dgst -sha224 texto.txt </code> | <code> openssl dgst -sha224 texto.txt </code> | ||
| − | <pre> | + | <pre>SHA224(texto.txt)= 6e911e52c586fb578608f582321eed909b9147569b824bc4eb79d785</pre> |
| − | SHA224(texto.txt)= 6e911e52c586fb578608f582321eed909b9147569b824bc4eb79d785 | ||
| − | </pre> | ||
===== SHA256 ===== | ===== SHA256 ===== | ||
| − | Produce | + | Produce resúmenes de 256 bits (32 bytes) que generalmente se representan como un número hexadecimal de 64 dígitos de longitud. |
;Paso 1: | ;Paso 1: | ||
| − | + | Se realizará un resumen SHA2-256 del mismo fichero "texto.txt" usado en los ejemplos anteriores. | |
| − | Se realizará un resumen del "texto.txt" | ||
| − | |||
| − | |||
<code> openssl dgst -sha256 texto.txt </code> | <code> openssl dgst -sha256 texto.txt </code> | ||
| − | <pre> | + | <pre>SHA256(texto.txt)= 18bd46db70c25f5af60aeaf927754b9d212cadfaa650895631775de3bbb44114</pre> |
| − | SHA256(texto.txt)= 18bd46db70c25f5af60aeaf927754b9d212cadfaa650895631775de3bbb44114 | ||
| − | </pre> | ||
===== SHA384 ===== | ===== SHA384 ===== | ||
| − | Produce | + | Produce resúmenes de 384 bits (48 bytes) que generalmente se representan como un número hexadecimal de 96 dígitos de longitud. |
;Paso 1: | ;Paso 1: | ||
| − | + | Se realizará un resumen SHA2-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores. | |
| − | Se realizará un resumen del "texto.txt" | ||
| − | |||
| − | |||
<code> openssl dgst -sha384 texto.txt </code> | <code> openssl dgst -sha384 texto.txt </code> | ||
| − | <pre> | + | <pre>SHA384(texto.txt)= 5d52867897694aacb4cc9055ea004819d598db736ae86e08980950de1f09a05d4428ec87289191276235c551f6597b22</pre> |
| − | SHA384(texto.txt)= 5d52867897694aacb4cc9055ea004819d598db736ae86e08980950de1f09a05d4428ec87289191276235c551f6597b22 | ||
| − | </pre> | ||
=====SHA-512 ===== | =====SHA-512 ===== | ||
| − | Produce | + | Produce resúmenes de 512 bits (64 bytes) que generalmente se representan como un número hexadecimal de 128 dígitos de longitud. |
;Paso 1: | ;Paso 1: | ||
| + | Se realizará un resumen SHA2-512 del mismo fichero "texto.txt" usado en los ejemplos anteriores. | ||
| − | + | <code> openssl dgst -sha512 texto.txt </code> | |
| − | + | <pre>SHA512(texto.txt)= d05dda99543ca29ec4b9ad2f4b7049c09934ecff527a28a42f88d2bf968a80bdd18c88983ff67bb87a79b3494395702371d8cee0e31127b73252227f39898bf8</pre> | |
| − | + | ==== SHA-3 ==== | |
| − | < | + | La familia de funciones SHA-3 es el último miembro de la familia de estándares de Secure Hash Algorithm, publicado por NIST el 5 de agosto de 2015. SHA-3 es un posible sustituto de los algoritmos SHA-2 si se descubre alguna vulnerabilidad en estos. <ref>Colaboradores de Wikipedia. (2018, 4 de noviembre). SHA-3. En Wikipedia, la Enciclopedia Libre . Consultado a las 17:27, 15 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=SHA-3&oldid=867303479</ref> |
| − | |||
| − | </ | ||
| − | + | SHA-3 genera las mismas longitudes de resumen que SHA-2 (SHA3-224, SHA3-256, SHA3-384 y SHA3-512). En este caso usaremos como ejemplos solamente SHA3-384 y SHA3-512. | |
| − | |||
| − | |||
| − | |||
| − | |||
=====SHA3-384 ===== | =====SHA3-384 ===== | ||
;Paso 1: | ;Paso 1: | ||
| − | + | Se realizará un resumen SHA3-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores. | |
| − | Se realizará un resumen del "texto.txt" | ||
| − | |||
| − | |||
<code> openssl dgst -sha3-384 texto.txt </code> | <code> openssl dgst -sha3-384 texto.txt </code> | ||
| − | <pre> | + | <pre>SHA3-384(texto.txt)= 3e0c626b47f8b9a41b975913801b6076bd8f737483b6b4b14c72f80e701b77f653cebf46a5ade8f9dbe876c7043d829e</pre> |
| − | SHA3-384(texto.txt)= 3e0c626b47f8b9a41b975913801b6076bd8f737483b6b4b14c72f80e701b77f653cebf46a5ade8f9dbe876c7043d829e | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | </pre> | ||
=====SHA3-512 ===== | =====SHA3-512 ===== | ||
;Paso 1: | ;Paso 1: | ||
| − | + | Se realizará un resumen SHA3-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores. | |
| − | Se realizará un resumen del "texto.txt" | ||
| − | |||
| − | |||
<code> openssl dgst -sha3-512 texto.txt </code> | <code> openssl dgst -sha3-512 texto.txt </code> | ||
| − | <pre> | + | <pre>SHA3-512(texto.txt)= 47689e88171715227d8c5dbb48eed6e45ca969dc25895da01eb0b63933dd0363d2671f3e486236c5af2e711f9a003d1f4e6c1beddf6644f0bcaed9b8b80df967</pre> |
| − | SHA3-512(texto.txt)= 47689e88171715227d8c5dbb48eed6e45ca969dc25895da01eb0b63933dd0363d2671f3e486236c5af2e711f9a003d1f4e6c1beddf6644f0bcaed9b8b80df967 | ||
| − | </pre> | ||
=== MAC (Message authentication code)=== | === MAC (Message authentication code)=== | ||
| Línea 369: | Línea 367: | ||
; Paso 1: | ; Paso 1: | ||
| − | |||
Se procede a obtener el HMAC del "texto.txt" usando una contraseña específica ("control1995"). Para ello, se utilizará la función hash "sha-512" como se muestra a continuación: | Se procede a obtener el HMAC del "texto.txt" usando una contraseña específica ("control1995"). Para ello, se utilizará la función hash "sha-512" como se muestra a continuación: | ||
<code> openssl dgst -hmac-sha512 "control1995" texto.txt </code> | <code> openssl dgst -hmac-sha512 "control1995" texto.txt </code> | ||
| + | |||
| + | <pre>HMAC-SHA512(texto.txt)= 62ad3592dbdfc00ce70f16228e66884e82468b94ac18ab44ae6fcaa5b3c39a4c0f94e57d87b2fc7cfba18616081d245858f474944252e1eb6beec2362bf67862</pre> | ||
; Paso 2: | ; Paso 2: | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Para verificar que si se cambia la contraseña se produce un HMAC diferente, se repetirá el mismo paso acortando la contraseña anterior. | Para verificar que si se cambia la contraseña se produce un HMAC diferente, se repetirá el mismo paso acortando la contraseña anterior. | ||
| − | |||
| − | |||
<code> openssl dgst -sha512 -hmac "control" texto.txt </code> | <code> openssl dgst -sha512 -hmac "control" texto.txt </code> | ||
| − | <pre> | + | <pre>HMAC-SHA512(texto.txt)= 0c89913b70372eb77dd0631133275becce14459d57de0e1144d92b3fdba350cb9e9ba5af4eff62469419eb726e722e8e96547fcf3235c63fb55dcfdb8df6fc83</pre> |
| − | HMAC-SHA512(texto.txt)= 0c89913b70372eb77dd0631133275becce14459d57de0e1144d92b3fdba350cb9e9ba5af4eff62469419eb726e722e8e96547fcf3235c63fb55dcfdb8df6fc83 | ||
| − | </pre> | ||
| − | |||
| − | |||
== Criptografía Simétrica == | == Criptografía Simétrica == | ||
| − | La criptografía de clave simétrica, también llamada criptografía de clave secreta, es un método criptográfico en el cual se usa una misma clave para cifrar y descifrar mensajes en el emisor y el receptor. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez que ambas partes tienen acceso a esta clave, el remitente cifra un mensaje usando la clave, lo envía al destinatario, y éste lo descifra con la misma clave. <ref> Criptografía simétrica. (2018, 3 de julio). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:08, octubre 11, 2018 desde https://es.wikipedia.org/w/index.php?title=Criptograf%C3%ADa_sim%C3%A9trica&oldid=109083984.</ref> | + | La criptografía de clave simétrica, también llamada criptografía de clave privada o de clave secreta, es un método criptográfico en el cual se usa una misma clave para cifrar y descifrar mensajes en el emisor y el receptor. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez que ambas partes tienen acceso a esta clave, el remitente cifra un mensaje usando la clave, lo envía al destinatario, y éste lo descifra con la misma clave. <ref> Criptografía simétrica. (2018, 3 de julio). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:08, octubre 11, 2018 desde https://es.wikipedia.org/w/index.php?title=Criptograf%C3%ADa_sim%C3%A9trica&oldid=109083984.</ref> |
Aunque existan algoritmos que vayan siendo desechados por las vulnerabilidades que se van descubriendo, no se pueden dejar de lado, ya que existen documentos anteriores cifrados con estos algoritmos y se necesita conocer su contenido. Con el paso del tiempo, estos documentos irán desapareciendo, siendo reemplazados por algoritmos más seguros y fiables. | Aunque existan algoritmos que vayan siendo desechados por las vulnerabilidades que se van descubriendo, no se pueden dejar de lado, ya que existen documentos anteriores cifrados con estos algoritmos y se necesita conocer su contenido. Con el paso del tiempo, estos documentos irán desapareciendo, siendo reemplazados por algoritmos más seguros y fiables. | ||
| − | Para proceder a cifrar o descifrar mensajes se hará uso del comando <tt>-enc</tt>. Se utiliza tanto para cifrados de bloque como de flujo, haciendo uso de claves basadas en contraseñas o claves proporcionadas explícitamente (clave y vector). | + | Para proceder a cifrar o descifrar mensajes se hará uso del comando <tt>-enc</tt>. Se utiliza tanto para cifrados de bloque como de flujo, haciendo uso de claves basadas en contraseñas o claves proporcionadas explícitamente (clave y vector de inicialización, en su caso). |
| − | + | MUY IMPORTANTE: Cuando se cifra con contraseña, OpenSSL pasa esta contraseña, junto con 64 bits aleatorios de sal criptográfica, por un algoritmo de derivación de claves como el PBKDF1 (obsoleto) o el PBKDF2 (explicado en las "opciones de enc"). Estos algoritmos utilizan funciones de resumen de forma recursiva para obtener suficientes bits para la clave de cifrado y para el vector de inicialización si es necesario. Esto permite que para una misma contraseña, se generen diferentes claves, al variar en cada caso la sal obtenida aleatoriamente. | |
| − | A continuación, se muestra algunas de las opciones más importantes que nos permite realizar el comando <tt>-enc</tt> y de las cuáles se harán uso durante el desarrollo de los ejemplos. Hay que tener en cuenta, que en algunos ejemplos | + | A continuación, se muestra algunas de las opciones más importantes que nos permite realizar el comando <tt>-enc</tt> y de las cuáles se harán uso durante el desarrollo de los ejemplos. Hay que tener en cuenta, que en algunos ejemplos hemos expuesto comandos donde la contraseña aparece explícita y eso es muy peligroso. Por ello, se desaconseja el uso de dichos comandos aunque en esta wiki se use para fines didácticos. En situaciones de uso real, siempre hemos de intentar que la contraseña sea solicitada por el comando e introducida de forma no visible en pantalla. |
| Línea 417: | Línea 405: | ||
; -a: Para cifrar el fichero de entrada en Base64. | ; -a: Para cifrar el fichero de entrada en Base64. | ||
| − | ; -k ''password'': Para especificar una contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass ''pass: password'' | + | ; -k ''password'': Para especificar una contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass ''pass: password'' (aunque desaconsejamos esto) |
; -kfile ''filename'': Fichero que contiene la contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass ''file''. | ; -kfile ''filename'': Fichero que contiene la contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass ''file''. | ||
| Línea 425: | Línea 413: | ||
; -pass ''file'': Igual que "-kfile ''filename''". | ; -pass ''file'': Igual que "-kfile ''filename''". | ||
| − | ; -p: Cifra | + | ; -p: Cifra y muestra en pantalla la clave, el vector de inicialización y el valor de sal. |
| − | ; -P: No cifra, simplemente | + | ; -P: No cifra, simplemente muestra en pantalla la clave, el vector de inicialización y el valor de sal. |
| − | ; -K ''key'': Se proporciona la clave real directamente. Siempre que se introduce la clave, obligatoriamente se | + | ; -K ''key'': Se proporciona la clave real directamente. Siempre que se introduce la clave, obligatoriamente se introducirá también el vector de inicialización (-iv IV) salvo que el algoritmo no lo use. |
| − | ; -iter ''count'': Utilice un número dado de iteraciones en la contraseña para derivar la clave de cifrado. Los valores altos aumentan el tiempo requerido para forzar el archivo resultante. Esta opción permite el uso del algoritmo PBKDF2 para derivar la clave. | + | ; -iter ''count'': Utilice un número dado de iteraciones en la contraseña para derivar la clave de cifrado. Los valores altos aumentan el tiempo requerido para forzar el archivo resultante. Esta opción permite el uso del algoritmo PBKDF2 para derivar la clave (recordemos que PKBDF1 está obsoleto). |
| − | ; -pbkdf1: Leer -pbkdf2. Tiene la misma funcionalidad que su sucesor pero con la diferencia de que este último tiene capacidad para generar claves de más de 160 bits (128, 256, 512 bits). Hay que tener en cuenta que si se usa una de las dos versiones a la hora del cifrado, se tiene que usar la misma función para el descifrado, ya que no son compatibles. Por ello, cuando se | + | ; -pbkdf1: Leer -pbkdf2. Tiene la misma funcionalidad que su sucesor pero con la diferencia de que este último tiene capacidad para generar claves de más de 160 bits (128, 256, 512 bits). Hay que tener en cuenta que si se usa una de las dos versiones a la hora del cifrado, se tiene que usar la misma función para el descifrado, ya que no son compatibles. Por ello, cuando se manipulen ficheros cifrados, hay que saber cuál de las dos versiones se ha usado. Aunque ''-pbkdf1'' está en desuso, hay que conocerla debido a que existen ficheros antiguos cifrados con este sistema de derivación de claves. |
| − | ; -pbkdf2: Usar algoritmo PBKDF2 con el número de iteraciones predeterminado al no ser que diga lo contrario. PBKDF2 aplica una función pseudoaleatoria (HMAC con cualquier función hash aprobada: HMAC-SHA1) a la contraseña de entrada o frase de contraseña junto con un valor de sal y repite el proceso muchas veces (mínimo se recomienda 1000 iteraciones) para producir una clave derivada, que luego se puede usar como una clave criptográfica en operaciones posteriores. El trabajo computacional agregado hace que el craqueo de contraseñas sea mucho más difícil. La norma recomienda una longitud de sal de al menos 64 bits.<ref>Colaboradores de Wikipedia. (2018, 27 de octubre). PBKDF2. En Wikipedia, la Enciclopedia Libre . Obtenido 18:55, 1 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=PBKDF2&oldid=866007861</ref> | + | ; -pbkdf2: Usar algoritmo PBKDF2 con el número de iteraciones predeterminado al no ser que diga lo contrario. PBKDF2 aplica una función pseudoaleatoria (HMAC con cualquier función hash aprobada: HMAC-SHA1) a la contraseña de entrada o frase de contraseña junto con un valor de sal y repite el proceso muchas veces (mínimo se recomienda 1000 iteraciones) para producir una clave derivada, que luego se puede usar como una clave criptográfica en operaciones posteriores. El trabajo computacional agregado hace que el "craqueo" de contraseñas por fuerza bruta sea mucho más difícil. La norma recomienda una longitud de sal de al menos 64 bits, que es la que utiliza OpenSSL.<ref>Colaboradores de Wikipedia. (2018, 27 de octubre). PBKDF2. En Wikipedia, la Enciclopedia Libre . Obtenido 18:55, 1 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=PBKDF2&oldid=866007861</ref> |
| − | ; -md ''messagedigest'' : especifica el resumen del mensaje que se utiliza para la derivación de clave. Puede tomar uno de los valores md2 , md5 , sha o | + | ; -md ''messagedigest'' : especifica el resumen del mensaje que se utiliza para la derivación de clave. Puede tomar uno de los valores md2 , md5 , sha o sha2 . El algoritmo predeterminado es sha2-256. <ref>Colaboradores de Wikipedia. OpenSSL Wiki [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 17 de diciembre del 2018]. Disponible en <https://wiki.openssl.org/index.php/Main_Page>.</ref> |
| − | Antes de empezar con algunos ejemplos de los algoritmos más relevantes de cifrado simétrico, hay que entender que existen diferentes métodos de cifrado que usan a su vez, diferentes modos de | + | Antes de empezar con algunos ejemplos de los algoritmos más relevantes de cifrado simétrico, hay que entender que existen diferentes métodos de cifrado que usan a su vez, diferentes modos de operación. |
| − | ===Cifrado en | + | ===Cifrado en bloque === |
[[Archivo:Cifrado por bloques.png|250px|thumb|Cifrado por bloques.]] | [[Archivo:Cifrado por bloques.png|250px|thumb|Cifrado por bloques.]] | ||
| Línea 448: | Línea 436: | ||
La transformación exacta es controlada utilizando una segunda entrada — la clave secreta. El descifrado es similar: se ingresan bloques de texto cifrado y se producen bloques de texto plano. <ref>Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 24 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.</ref> | La transformación exacta es controlada utilizando una segunda entrada — la clave secreta. El descifrado es similar: se ingresan bloques de texto cifrado y se producen bloques de texto plano. <ref>Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 24 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.</ref> | ||
| − | Un concepto importante en el cifrado por bloques es el '''''Padding'''''. Se trata de un esquema de relleno necesario que usan algunos modos de operación de cifrado en bloque para completar los mensajes que no tengan una longitud múltiplo del tamaño de bloque. | + | Un concepto importante en el cifrado por bloques es el '''''Padding'''''. Se trata de un esquema de relleno necesario que usan algunos modos de operación de cifrado en bloque para completar los mensajes que no tengan una longitud múltiplo del tamaño de bloque. El "padding" estándar en OpenSSL se describe en la especificación PKCS5. |
| − | Otra idea que cabe destacar, es el '''''vector de inicialización''''' o '''''IV'''''. El IV es un bloque de bits que es requerido para permitir un cifrado en flujo o un cifrado por bloques, en uno de los modos de cifrado''', con un resultado independiente de otros cifrados producidos por la misma clave.''' El tamaño del IV dependen del algoritmo de cifrado y del protocolo criptográfico y | + | Otra idea que cabe destacar, es el '''''vector de inicialización''''' o '''''IV'''''. El IV es un bloque de bits que es requerido para permitir un cifrado en flujo o un cifrado por bloques, en uno de los modos de cifrado''', con un resultado independiente de otros cifrados producidos por la misma clave.''' El tamaño del IV dependen del algoritmo de cifrado y del protocolo criptográfico y usualmente es tan largo como el tamaño de bloque (cifradores en bloque) o como el tamaño de la clave (cifradores en flujo). Habitualmente el IV se genera de forma aleatoria o pseudoaleatoria al mismo tiempo que la clave de cifrado (por empleo de funciones del tipo PBKDF2). <ref>Colaboradores de Wikipedia. Vector de inicialización [en línea]. Wikipedia, La enciclopedia libre, 2015 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Vector_de_inicializaci%C3%B3n&oldid=79449760>.</ref> |
| − | ==== Modos de Operación para | + | ==== Modos de Operación de algoritmos de cifrado en bloque para cifrado en bloque==== |
| − | Los | + | Los modos de operación más comunes son: |
* ECB (Electronic CodeBook): Este modo de cifrado es el más simple de todos, pues se limita a partir el mensaje en bloques y cifrarlos por separado. <ref>Colaboradores del Blog de Daniel Lerch. Modos de cifrado: ECB, CBC, CTR, OFB y CFB. [en línea]. El Blog de Daniel Lerch, 2007 [fecha de consulta: 12 de octubre del 2018]. Disponible en <http://dlerch.blogspot.com/2007/07/modos-de-cifrado-ecb-cbc-ctr-ofb-y-cfb.html>.</ref>. | * ECB (Electronic CodeBook): Este modo de cifrado es el más simple de todos, pues se limita a partir el mensaje en bloques y cifrarlos por separado. <ref>Colaboradores del Blog de Daniel Lerch. Modos de cifrado: ECB, CBC, CTR, OFB y CFB. [en línea]. El Blog de Daniel Lerch, 2007 [fecha de consulta: 12 de octubre del 2018]. Disponible en <http://dlerch.blogspot.com/2007/07/modos-de-cifrado-ecb-cbc-ctr-ofb-y-cfb.html>.</ref>. | ||
| Línea 463: | Línea 451: | ||
[[File:ECB decryption.svg]] | [[File:ECB decryption.svg]] | ||
| − | La desventaja de este método es que bloques idénticos de mensaje sin cifrar producirán idénticos textos cifrados, mientras que al resto de modos de operación no les ocurre esta situación porque combinan bloques anteriores de texto claro o cifrado de tal modo que idénticos bloques de texto claro producirán bloques diferentes de texto cifrado. Esto explica la necesidad del vector de inicialización (IV) para enmascarar el primer bloque. | + | La desventaja de este método es que bloques idénticos de mensaje sin cifrar producirán idénticos textos cifrados, mientras que al resto de modos de operación no les ocurre esta situación porque combinan bloques anteriores de texto claro o cifrado de tal modo que idénticos bloques de texto claro producirán bloques diferentes de texto cifrado. Esto explica la necesidad del vector de inicialización (IV) para enmascarar el primer bloque. Este problema se puede observar gráficamente si se cifra una imagen en colores sólidos: |
<gallery> | <gallery> | ||
| Línea 477: | Línea 465: | ||
[[File:CBC decryption.svg]] | [[File:CBC decryption.svg]] | ||
| − | ====Modos de Operación para | + | ====Modos de Operación de algoritmos de cifrado en bloque para cifrado en flujo==== |
| − | Aunque los modos de operación CFB, OFB y CTR se | + | Aunque los modos de operación CFB, OFB y CTR se aplican a cifradores en bloque, realmente producen un cifrado en flujo, ya que el cifrador de bloque se emplea para generar un "keystream" que será combinado con el texto claro bit a bit para producir el texto cifrado. Por ello, los englobamos en este apartado. |
* CFB (Cipher FeedBack): el modo de retroalimentación de cifrado (CFB), un pariente cercano de CBC, convierte un cifrado de bloque en un cifrado de flujo. La operación es muy similar; en particular, el descifrado CFB es casi idéntico al cifrado CBC realizado a la inversa y que además, evita el rellenado de bloques. <ref>Wikipedia contributors. (2018, October 16). Block cipher mode of operation. In Wikipedia, The Free Encyclopedia. Retrieved 17:43, October 25, 2018, from https://en.wikipedia.org/w/index.php?title=Block_cipher_mode_of_operation&oldid=864354561</ref> Por tanto, hace que el cifrado en bloque opere como una unidad de flujo de cifrado: se generan bloques de flujo de claves, que son operados con XOR y el texto en claro para obtener el texto cifrado. <ref>Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.</ref> | * CFB (Cipher FeedBack): el modo de retroalimentación de cifrado (CFB), un pariente cercano de CBC, convierte un cifrado de bloque en un cifrado de flujo. La operación es muy similar; en particular, el descifrado CFB es casi idéntico al cifrado CBC realizado a la inversa y que además, evita el rellenado de bloques. <ref>Wikipedia contributors. (2018, October 16). Block cipher mode of operation. In Wikipedia, The Free Encyclopedia. Retrieved 17:43, October 25, 2018, from https://en.wikipedia.org/w/index.php?title=Block_cipher_mode_of_operation&oldid=864354561</ref> Por tanto, hace que el cifrado en bloque opere como una unidad de flujo de cifrado: se generan bloques de flujo de claves, que son operados con XOR y el texto en claro para obtener el texto cifrado. <ref>Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.</ref> | ||
| Línea 499: | Línea 487: | ||
[[File:CTR decryption 2.svg]] | [[File:CTR decryption 2.svg]] | ||
| − | === | + | ===Algoritmos de cifrado en bloque con modo de operación de bloque=== |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
==== DES (Data Encryption Standard) ==== | ==== DES (Data Encryption Standard) ==== | ||
| Línea 514: | Línea 493: | ||
DES es el algoritmo prototipo del cifrado por bloques — un algoritmo que toma un texto en claro de una longitud fija de bits y lo transforma mediante una serie de operaciones básicas en otro texto cifrado de la misma longitud. En el caso de DES el tamaño del bloque es de 64 bits. DES utiliza también una clave criptográfica para modificar la transformación, de modo que el descifrado sólo puede ser realizado por aquellos que conozcan la clave concreta utilizada en el cifrado. La clave mide 64 bits, aunque en realidad, sólo 56 de ellos son empleados por el algoritmo. Los ocho bits restantes se utilizan únicamente para comprobar la paridad, y después son descartados. Por tanto, la longitud de clave efectiva en DES es de 56 bits, y así es como se suele especificar. <ref>Colaboradores de Wikipedia. Data Encryption Standard [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 12 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Data_Encryption_Standard&oldid=109510549>.</ref> | DES es el algoritmo prototipo del cifrado por bloques — un algoritmo que toma un texto en claro de una longitud fija de bits y lo transforma mediante una serie de operaciones básicas en otro texto cifrado de la misma longitud. En el caso de DES el tamaño del bloque es de 64 bits. DES utiliza también una clave criptográfica para modificar la transformación, de modo que el descifrado sólo puede ser realizado por aquellos que conozcan la clave concreta utilizada en el cifrado. La clave mide 64 bits, aunque en realidad, sólo 56 de ellos son empleados por el algoritmo. Los ocho bits restantes se utilizan únicamente para comprobar la paridad, y después son descartados. Por tanto, la longitud de clave efectiva en DES es de 56 bits, y así es como se suele especificar. <ref>Colaboradores de Wikipedia. Data Encryption Standard [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 12 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Data_Encryption_Standard&oldid=109510549>.</ref> | ||
| − | Este algoritmo es considerado no seguro, ya que su tamaño de clave de 56 bits es corto y con ello, han habido casos en que las claves de DES se han roto en un día. Más adelante, se verá una variante de este algoritmo considerado más | + | Este algoritmo es considerado no seguro, ya que su tamaño de clave de 56 bits es corto y con ello, han habido casos en que las claves de DES se han roto en un día. Más adelante, se verá una variante de este algoritmo considerado más segura, como es el Triple DES. |
===== DES - ECB ===== | ===== DES - ECB ===== | ||
;Paso 1: | ;Paso 1: | ||
| + | En este ejemplo cifraremos el fichero de ejemplo texto.txt con DES en modo ECB (recordemos lo peligroso que es este modo de operación ECB y NO LO USEMOS NUNCA EN LA VIDA REAL) | ||
| − | + | <code> openssl enc -des-ecb -a -in texto.txt -out des_ecb.cif </code> | |
| − | + | Se tendrá que introducir una contraseña, la cuál se usará tanto para cifrar como descifrar. Además, el resultado estará en base 64 ya que utilizamos la opción "-a". | |
| − | |||
| − | |||
| − | |||
| − | |||
;Paso 2: | ;Paso 2: | ||
| + | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | ||
| − | + | <code> cat des_ecb.cif </code> | |
| − | |||
| − | <code> | ||
| − | + | <pre>U2FsdGVkX19kW3Tq3F0Sh9ELdcdlloEOs1pJsOG24MuvuOBPfvaHE/nK0iBtb9F1HlxZw5Whn+eAXXABg/d9DjXnl0pRKjpheO4pP9rPug0=</pre> | |
;Paso 3: | ;Paso 3: | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Se descifra el fichero que se ha cifrado antes de la siguiente manera (Se usa "-d" para indicar que se va a descifrar el fichero de entrada y si se desea se ejecuta un ''cat'' del fichero de salida para verificar el resultado): | Se descifra el fichero que se ha cifrado antes de la siguiente manera (Se usa "-d" para indicar que se va a descifrar el fichero de entrada y si se desea se ejecuta un ''cat'' del fichero de salida para verificar el resultado): | ||
| − | <code> | + | <code> openssl enc -des-ecb -d -a -in des_ecb.cif -out texto_desc.txt </code> |
===== DES - CBC ===== | ===== DES - CBC ===== | ||
| − | Si se pone solo "-des" sin modo de operación, por defecto usará el modo de operación | + | Si se pone solo "-des" sin modo de operación, por defecto usará el modo de operación CBC, mucho más seguro que el ECB del ejemplo anterior. |
;Paso 1: | ;Paso 1: | ||
| − | + | En este caso cifraremos el ''texto.txt'' proporcionando la contraseña "luna77" en la misma línea de comando (opción no recomendada): | |
| − | En este caso cifraremos el ''texto.txt'' proporcionando la contraseña en la misma línea de comando: | ||
<code>1) openssl enc -des-cbc -a -k luna77 -in texto.txt -out des_cbc.cif </code> | <code>1) openssl enc -des-cbc -a -k luna77 -in texto.txt -out des_cbc.cif </code> | ||
| Línea 565: | Línea 528: | ||
;Paso 2: | ;Paso 2: | ||
| − | |||
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | ||
| − | <code> | + | <code> cat des_cbc.cif </code> |
| − | <pre> | + | <pre>U2FsdGVkX18ASWAnYV+LYwjtb8A0jTXXaFYXI9BEtMSyUXPCXmhNrHtC6LFg3+WGQFcXPAWb/ptzZV2lNBkFNrgnlabYRunACGZ3mJSS/xU=</pre> |
| − | U2FsdGVkX18ASWAnYV+LYwjtb8A0jTXXaFYXI9BEtMSyUXPCXmhNrHtC6LFg3+ | ||
| − | |||
| − | </pre> | ||
;Paso 3: | ;Paso 3: | ||
| − | |||
Se descifra el fichero que se ha cifrado antes de la siguiente manera (si se desea se ejecuta un ''cat'' del fichero de salida para verificar el resultado): | Se descifra el fichero que se ha cifrado antes de la siguiente manera (si se desea se ejecuta un ''cat'' del fichero de salida para verificar el resultado): | ||
| − | <code> | + | <code> openssl enc -des-cbc -d -a -k luna77 -in des_cbc.cif -out texto_desc.txt </code> |
==== TRIPLE DES ==== | ==== TRIPLE DES ==== | ||
| Línea 587: | Línea 545: | ||
TDES usa una longitud de 168 bits (3x56) aunque realmente su eficiencia es de 112 bits, es decir, dobla la longitud de clave de DES. Por ello, TDES no se considera vulnerable a los ataques por fuerza bruta, al contrario que su antecesor que poseía una longitud de clave corta. Además, se continúa cifrando bloques de 64 bits. | TDES usa una longitud de 168 bits (3x56) aunque realmente su eficiencia es de 112 bits, es decir, dobla la longitud de clave de DES. Por ello, TDES no se considera vulnerable a los ataques por fuerza bruta, al contrario que su antecesor que poseía una longitud de clave corta. Además, se continúa cifrando bloques de 64 bits. | ||
| − | Existen diferentes tipos de TDES, aunque el más utilizado es el EDE3 (Encrypt-Decrypt-Encrypt). Es decir, el cifrado se aplica al contenido mediante la clave 1, luego este texto cifrado se descifra con la clave 2 y finalmente, el texto descifrado se vuelve a cifrar con la clave 2. | + | Existen diferentes tipos de TDES, aunque el más utilizado es el EDE3 (Encrypt-Decrypt-Encrypt) con dos claves DES. Es decir, el cifrado se aplica al contenido mediante la clave 1, luego este texto cifrado se descifra con la clave 2 y finalmente, el texto descifrado se vuelve a cifrar con la clave 2. |
| − | ===== DES - EDE3 - | + | |
| + | ===== DES - EDE3 - CBC ===== | ||
| − | + | Aprovecharemos un ejemplo de utilización del algoritmo des-ede-cbc para ilustrar el empleo de contraseñas y cómo se introduce automáticamente la sal en el fichero cifrado cuando se emplean contraseñas para el cifrado con cualquier tipo de algoritmo de cifrado y/o modo de operación. | |
| − | La sal se identifica por el encabezado de 8 bytes ( Salted__ ), seguido por la sal de 8 bytes. | + | La sal 'salt' es una cadena aleatoria de 8 bytes que se almacena con el archivo cifrado para que cada vez que cifre un archivo con una contraseña específica el archivo resultante será diferente. La sal está activada siempre por defecto. La sal se identifica por el encabezado de 8 bytes ( Salted__ ), seguido por la sal de 8 bytes. Hay que tener en cuenta que si ciframos el contenido de un fichero con una contraseña, la sal se identifica en el texto cifrado por un encabezado de 8 bytes ( Salted__ ), seguido por la sal de 8 bytes. |
| − | + | En este ejemplo, cifraremos con una contraseña y luego usaremos la clave y el IV para el descifrado, eliminando los primeros 16 bytes del fichero cifrado antes de descifrarlo. | |
;Paso 1: | ;Paso 1: | ||
| + | En este caso cifraremos el ''texto.txt'' de manera que se solicite la contraseña y se muestre en pantalla la sal, la clave y el vector de inicialización (opción -p): | ||
| − | + | <code> openssl enc -des-ede3-cbc -p -in texto.txt -out des_ede3_cbc.cif </code> | |
| − | |||
| − | <code> | ||
<pre> | <pre> | ||
| − | |||
salt=D30F902E2A9DCF99 | salt=D30F902E2A9DCF99 | ||
key=6581AB49BC17A188D8E2BE8C547734F568F78DDAA6442CCD | key=6581AB49BC17A188D8E2BE8C547734F568F78DDAA6442CCD | ||
iv =DFDBFE410F5BD79A | iv =DFDBFE410F5BD79A | ||
| − | |||
</pre> | </pre> | ||
| − | |||
| − | |||
;Paso 2: | ;Paso 2: | ||
| + | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal, el fichero cifrado es binario (no se usó la opción -a) pero los primero ocho caracteres serán textuales, ya que es la cadena "Salted__" que indica que los ocho bits siguientes contienen la sal: | ||
| − | + | <code> cat des_ede3_cbc.cif </code> | |
| − | |||
| − | <code> | ||
<pre> | <pre> | ||
| Línea 626: | Línea 579: | ||
;Paso 3: | ;Paso 3: | ||
| + | Para poder descifrar el fichero con la clave y el IV, primero hemos de "extraer" el texto "Salted__" y los ocho bits de sal (16 bytes en total) como se indica a continuación: | ||
| − | + | <code> cat des_ede3_cbc.cif | dd ibs=16 obs=16 skip=1 > des_ede3_cbc_sinsal.cif</code> | |
| − | |||
| − | <code> | ||
;Paso 4: | ;Paso 4: | ||
| + | Para verificar que se ha extraido correctamente la sal, se muestra el contenido del fichero de salida por la terminal: | ||
| − | + | <code> cat des_ede3_cbc_sinsal.cif </code> | |
| − | |||
| − | <code> | ||
<pre> | <pre> | ||
| Línea 644: | Línea 595: | ||
</pre> | </pre> | ||
| − | Al comparar este fichero con el fichero '' | + | Al comparar este fichero con el fichero ''des_ede3_cbc.cif'', se observa que se han eliminado parte de los bytes correspondientes a la sal (16 primeros bytes). |
;Paso 5: | ;Paso 5: | ||
| + | Para descifrar, se hará uso de la clave y el IV obtenidos por pantalla en el primer paso: | ||
| − | + | <code> 5) openssl enc -des-ede3-cbc -d -in des_ede3_cbc_sinsal.cif -out texto_desc.txt -K 6581AB49BC17A188D8E2BE8C547734F568F78DDAA6442CCD -iv DFDBFE410F5BD79A </code> | |
| − | + | Al realizar un ''cat'' del fichero de salida se podrá leer el texto original. | |
| − | + | '''Nota:''' si no se especifica el modo de operación, por defecto se usará "cbc". | |
| + | |||
| + | ==== AES (Advanced Encryption Standard) ==== | ||
| + | |||
| + | AES, también conocido como Rijndael (pronunciado "Rain Doll" en inglés), es un esquema de cifrado por bloques adoptado como un estándar de cifrado por el gobierno de los Estados Unidos. El AES fue anunciado por el Instituto Nacional de Estándares y Tecnología (NIST) como FIPS PUB 197 de los Estados Unidos (FIPS 197) el 26 de noviembre de 2001 después de un proceso de estandarización que duró 5 años. Se transformó en un estándar efectivo el 26 de mayo de 2002. Desde 2006, el AES es uno de los algoritmos más populares usados en criptografía simétrica. El cifrado fue desarrollado por dos criptólogos belgas, Joan Daemen y Vincent Rijmen, ambos estudiantes de la Katholieke Universiteit Leuven, y fue enviado al proceso de selección AES bajo el nombre "Rijndael".<ref>Colaboradores de Wikipedia. Advanced Encryption Standard [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 14 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Advanced_Encryption_Standard&oldid=110119865>.</ref> | ||
| + | |||
| + | Basado en la estructura de bloques de AES, el cambio de un solo bit, ya sea en la clave, o en el bloque de texto sin cifrado, da como resultado un bloque de texto cifrado completamente diferente <ref>Colaboradores de Boxcryptor. Cifrado AES y RSA [en línea]. Boxcryptor [fecha de consulta: 14 de octubre del 2018]. Disponible en <https://www.boxcryptor.com/es/encryption/>.</ref>. Este algoritmo tiene una longitud de bloque de 128 bits y longitudes de clave de 128, 192 y 256. | ||
| − | + | Se trata de un algoritmo del que todavía no se ha registrado ningún ataque factible hacia él, convirtiéndose en un estándar de cifrado para las principales organizaciones como bancos, gobiernos y sistemas de alta seguridad en todo el mundo. Además, es un estándar mucho más rápido que los vistos anteriormente. | |
| − | + | ===== AES - 128 - CBC ===== | |
;Paso 1: | ;Paso 1: | ||
| + | En este caso se cifrará el ''texto.txt'' de manera que se muestre la sal, la clave y el vector de inicialización para poder observar como varía la ''key'' según el tamaño de clave utilizada(128, 192 o 256 bits). | ||
| + | |||
| + | De la misma manera con la que hemos descifrado en DES - EDE3 - CFB , se podría hacer con AES. En este caso, solo mostraremos la sal, la clave y el vector de inicialización con fines didácticos. | ||
| − | + | <code> openssl enc -aes-128-cbc -p -in texto.txt -out aes_128_cbc.cif </code> | |
| − | < | + | <pre> |
| + | salt=D4CB02846DF52631 | ||
| + | key=E0F912BD4D46C5E051C0E8AB296C087A | ||
| + | iv =F63249B4C246608579EEC44996AEAD7E | ||
| + | </pre> | ||
| − | + | En este caso se tendrá que introducir una contraseña con la que se cifrará y descifrará los ficheros. | |
;Paso 2: | ;Paso 2: | ||
| − | |||
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | ||
| − | <code> | + | <code> cat aes_128_cbc.cif </code> |
<pre> | <pre> | ||
| − | + | Salted__???m?&1???o?~#??[A????6??S(?r+?O?l M<0????{????H???h??(m?!? | |
| − | |||
</pre> | </pre> | ||
;Paso 3: | ;Paso 3: | ||
| + | Para descifrar el fichero lo hacemos directamente sin necesidad de extraer la sal: | ||
| − | + | <code> openssl enc -d -aes-128-cbc -in aes_128_cbc.cif -out aes_128_desc.txt</code> | |
| − | |||
| − | <code> | ||
| − | + | <pre> | |
| − | + | enter aes-128-cbc decryption password: | |
| − | <pre> | ||
| − | |||
</pre> | </pre> | ||
| − | + | ;Paso 4 | |
| + | Verificamos que el descifrado se ha hecho correctamente. | ||
| − | <code> | + | <code> cat aes_128_desc.txt </code> |
<pre> | <pre> | ||
| − | + | En un lugar de la Mancha de cuyo nombre no quiero acordarme... | |
</pre> | </pre> | ||
| − | + | '''Nota:''' si no se especifica el modo de operación, por defecto se usará "cbc". | |
| − | + | ===Cifrado en Flujo === | |
| − | |||
| − | |||
| − | + | [[Image:A5-1 GSM cipher.svg|280px|thumbnail| | |
| + | La operación del generador de flujo de clave en A5 / 1 , un cifrado de flujo basado en LFSR utilizado para cifrar conversaciones de teléfono móvil.]] | ||
| − | + | Para algunas aplicaciones, tales como el cifrado de conversaciones telefónicas, el cifrado en bloques es inapropiada porque los flujos de datos se producen en tiempo real en pequeños fragmentos. Las muestras de datos pueden ser tan pequeñas como 8 bits o incluso de 1 bit, y sería un desperdicio rellenar el resto de los 64 bits antes de cifrar y transmitirlos. Los cifradores de flujo son algoritmos de cifrado que pueden realizar el cifrado incrementalmente, convirtiendo el texto en claro, en texto cifrado bit a bit, es decir, cada dígito de texto sin formato se cifra uno a la vez con el dígito correspondiente de la secuencia pseudoaleatoria, para dar un dígito del flujo de texto cifrado. Una secuencia pseudoaleatoria es una secuencia de bits de tamaño arbitrario que puede emplearse para oscurecer los contenidos de un flujo de datos combinando esta secuencia con el flujo de datos mediante la función XOR. Si la secuencia pseudoaleatoria es segura, el flujo de datos cifrados también lo será. Los bloques se cifran empleando una clave compartida por el emisor y el receptor. <ref>Colaboradores de Wikipedia. Cifrador de flujo [en línea]. Wikipedia, La enciclopedia libre, 2016 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrador_de_flujo&oldid=94383885>.</ref> | |
| − | + | Uno de los algoritmos de flujo más utilizados es el RC4 (ya obsoleto), reemplazado en la actualidad por algoritmos más eficientes como el Chacha20 y los modos de operación en flujo (OFB o CFB) de los cifradores de bloque como TDES, AES, etc. | |
| − | |||
| − | + | ===Algoritmos de cifrado en flujo (nativos)=== | |
| − | + | ==== RC4 ==== | |
| − | + | Dentro de la criptografía RC4 o ARC4 es el sistema de cifrado de flujo Stream cipher más utilizado y se utilizó en algunos de los protocolos más populares como Secure Sockets Layer (SSL) (para proteger el tráfico de Internet) y Wired Equivalent Privacy (WEP) para añadir seguridad en las redes inalámbricas. En los últimos años, RC4 se ha excluido de los estándares de alta seguridad por sus debilidades. No está recomendado su uso en los nuevos sistemas y el estándar TLS de cifrado web y los protocolos WPA de cifrado en Wifi lo excluyen. | |
;Paso 1: | ;Paso 1: | ||
| + | Ahora se procederá a cifrar el fichero ''texto.txt'' pero usando un cifrado de flujo RC4. Se tendrá que introducir una contraseña. | ||
| + | <code> openssl enc -rc4 -a -pbkdf2 -in texto.txt -out rc4.cif </code> | ||
| − | + | ;Paso 2: | |
| + | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | ||
| − | + | <code> cat rc4.cif </code> | |
| − | < | + | <pre> U2FsdGVkX1+NGFlYsDGIrvaeo21Gg7pkI+OD0ZjU7QzS97w7q5HP2xNnz7BxBew2 |
| + | 6tiHQXgAAfp7P0zZq+6PIBFRVEy61wU2wNg+tpVy | ||
| + | </pre> | ||
| − | + | ;Paso 3: | |
| + | Para descifrar, ejecutamos el siguiente comando y posteriormente introducimos la misma contraseña que se usó para el cifrado: | ||
| − | + | <code> openssl enc -rc4 -d -a -pbkdf2 -in rc4.cif -out texto_desc.txt</code> | |
| − | + | ||
| − | + | Al realizar un ''cat'' del fichero de salida se podrá leer el texto original si se desea verificar que el descifrado se ha efectuado correctamente. | |
| + | |||
| + | ==== Chacha20 ==== | ||
| + | [[File:Salsa20 ChaCha variant.png|thumb]] | ||
| + | |||
| + | Es un sistema de cifrado en flujo, que soporta claves de 128 y 256 bits y de alta velocidad creado por Bernstein en 2008. Salsa20 es el cifrado original creado también por Bernstein en 2007, el cuál mantiene una estrecha relación con su sucesor, ya que ambos cifrados se basan en una función pseudoaleatoria basada en operaciones add-rotate-xor (ARX). Salsa20 y ChaCha poseen la inusual ventaja de que el usuario puede buscar de manera eficiente cualquier posición en el flujo de claves en tiempo constante. | ||
| + | |||
| + | La principal diferencia entre ellos, es que Chacha20 ofrece un aumento de la difusión por ronda y logra ligeramente un mejor rendimiento. Además, se considera que en implantaciones software es más eficiente y rápido que AES. | ||
| − | + | ;Paso 1: | |
| + | Se cifra el ''texto.txt'' con Chacha20 usando esta vez la funcion ''-pass pass:password'' (desaconsejada). | ||
| − | + | <code> openssl enc -chacha20 -a -pbkdf2 -pass pass:informatica95 -in texto.txt -out chacha20.cif </code> | |
;Paso 2: | ;Paso 2: | ||
| − | |||
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | ||
| − | <code> 2) cat | + | <code> 2) cat chacha20.cif </code> |
<pre> | <pre> | ||
| − | + | U2FsdGVkX19A+Yp7zsXDMD/VDIsgYsdM5nxu037Ku0a8zlyCocLhq9G6t+UPSDug | |
| + | N98wSwM0RPfBOUVyEKMk99hWwNFWKESgg0WCFLXi | ||
</pre> | </pre> | ||
;Paso 3: | ;Paso 3: | ||
| + | Para descifrar ejecutamos el siguiente comando incluyendo la contraseña como se hizo para cifrar: | ||
| − | + | <code> openssl enc -chacha20 -d -a -pbkdf2 -pass pass:informatica95 -in chacha20.cif -out texto_desc.txt</code> | |
| − | + | Al realizar un ''cat'' del fichero de salida se podrá leer el texto original si se desea verificar que el descifrado se ha efectuado correctamente. | |
| − | + | ===Algoritmos de cifrado en bloque en modo de operación de flujo=== | |
| − | |||
| − | |||
| − | + | Como ya hemos indicado, los modos de operación CFB, OFB y CTR transforman cifradores de bloque en cifradores de flujo, veamos un ejemplo con Triple DES y otro con AES | |
| − | |||
| − | + | ===== DES - EDE3 - OFB ===== | |
| − | + | Anteriormente se ha usado el comando ''-k'' para introducir la contraseña directamente pero cada vez se usa menos. Su equivalente y el que se recomienda usar a día de hoy es ''-pass pass:password'' cuya función es la misma que la anterior, aunque insistimos en que es mejor no poner esta opción y teclear la contraseña directamente. | |
| − | |||
| − | |||
| − | '' | + | ;Paso 1: |
| + | Se cifra el ''texto.txt'' usando el comando nombrado en la descripción de la siguiente manera: | ||
| − | + | <code> openssl enc -des-ede3-ofb -a -pass pass:prueba+1 -in texto.txt -out des-ede3.ofb.cif </code> | |
| − | + | Al introducir la contraseña ''prueba+1'' arriba, no se pedirá introducir contraseña alguna al ejecutar el comando. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
;Paso 2: | ;Paso 2: | ||
| − | |||
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | ||
| − | <code> | + | <code> cat des-ede3.ofb.cif </code> |
<pre> | <pre> | ||
| − | + | U2FsdGVkX1807oH+u4mohMA8SHgqVU+GjyJQppx51rPbRt/IINW3PftAC6Y9v1vx | |
| − | + | CR4T73xtuUP5boyWMqjWKQKQer3rWlDdzoeBpYEM | |
</pre> | </pre> | ||
;Paso 3: | ;Paso 3: | ||
| + | Para descifrar se puede hacer de dos formas. Una de ellas es introducir directamente la contraseña como se ha hecho para cifrar, o introducirla después de ejecutar el comando. | ||
| − | + | <code> openssl enc -des-ede3-ofb -d -a -pass pass:prueba+1 -in des-ede3.ofb.cif -out texto_desc.txt</code> | |
| − | <code> | + | <code> cat texto_desc.txt</code> |
<pre> | <pre> | ||
| − | + | En un lugar de la Mancha de cuyo nombre no quiero acordarme... | |
</pre> | </pre> | ||
| − | + | '''o''' | |
| − | |||
| − | <code> | + | <code> openssl enc -des-ede3-ofb -d -a -in des-ede3.ofb.cif -out texto_desc.txt</code> |
<pre> | <pre> | ||
| − | + | enter des-ede3-ofb decryption password: | |
</pre> | </pre> | ||
| − | + | <code> 4) cat texto_desc.txt</code> | |
| − | + | <pre> | |
| + | En un lugar de la Mancha de cuyo nombre no quiero acordarme... | ||
| + | </pre> | ||
| − | + | Se puede verificar que de las dos formas se puede descifrar correctamente el fichero cifrado. | |
| − | + | ===== AES - 192 - CFB ===== | |
| − | + | En este ejemplo usaremos AES de 192 bits para cifrar con modo CFB, lo que resultará en un cifrado de flujo. | |
| − | ;Paso | + | ;Paso 1: |
| + | Se va a cifrar el ''texto.txt'' usando ''-pass: file:filename''. El ''filename'' corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt". | ||
| − | + | <code> openssl enc -aes-192-cfb -p -pbkdf2 -md sha1 -pass file:passwd.txt -in texto.txt -out aes_192_cfb.cif </code> | |
| − | < | + | <pre> |
| − | + | salt=B80C38A686E22ABF | |
| − | + | key=2D638C6CA5092F3313EB4E8F3CF45790D1F3298F66068151 | |
| − | + | iv =B1E385CBD9DA80579F6FB37F5528C8BB | |
| − | |||
</pre> | </pre> | ||
| − | + | Se puede observar que el tamaño de la clave es mayor (48 caracteres hexadecimales), mientras que el vector de inicialización se mantiene constante en los 32 caracteres hexadecimales (128 bits) del tamaño de bloque, que es el mismo para los tres tamaños de clave de AES. | |
| − | |||
| − | |||
| − | + | ;Paso 2: | |
| − | + | Para descifrar se haría de la misma manera que en el paso 1, colocando la opción "-d" y permutando los valores de las opciones "-in" y "-out". | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | ===== AES - 256 - CTR ===== | |
| − | + | En este ejemplo usaremos AES de 256 bits para cifrar con modo CTR, lo que resultará en un cifrado de flujo. | |
;Paso 1: | ;Paso 1: | ||
| + | Cifraremos el fichero ''texto.txt'' usando ''-pass: file:filename''. El ''filename'' corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt". Además, se introducirá la opción "-pbkdf2" para emplear la derivación de clave más potente. | ||
| − | + | <code> openssl enc -aes-256-ctr -a -pbkdf2 -pass file:passwd.txt -in texto.txt -out aes_256_ctr.cif </code> | |
| − | |||
| − | <code> | ||
;Paso 2: | ;Paso 2: | ||
| − | |||
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal: | ||
| − | <code> | + | <code> cat aes_256_ctr.cif </code> |
<pre> | <pre> | ||
| − | + | U2FsdGVkX1+QVMdAUpGCvAwjUuRa5GuxggUJ4DFQB1RY9LcjP6RJnQJ+zvNcKidr | |
| − | + | jPcbam7ESyfQqa9JRg/uL/F3KZvx7OFHThJwLNt9 | |
</pre> | </pre> | ||
;Paso 3: | ;Paso 3: | ||
| + | Para descifrar, podemos ejecutar el siguiente comando (que no tiene la opción -pass file:passwd.txt) y posteriormente introducimos la contraseña contenida en dicho fichero: | ||
| + | |||
| + | <code> openssl enc -aes-256-ctr -d -a -pbkdf2 -in aes_256_ctr.cif -out texto_des.txt</code> | ||
| + | |||
| + | <pre> | ||
| + | enter aes-256-ctr decryption password: | ||
| + | </pre> | ||
| − | + | ;Paso 4: | |
| + | Al realizar un ''cat'' del fichero de salida se podrá leer el texto original. | ||
| − | <code> | + | <code> cat texto_des.txt </code> |
| − | + | <pre> | |
| + | En un lugar de la Mancha de cuyo nombre no quiero acordarme... | ||
| + | </pre> | ||
== Criptografía Asimétrica == | == Criptografía Asimétrica == | ||
| Línea 1565: | Línea 1510: | ||
==== RSA ==== | ==== RSA ==== | ||
| − | + | Como sabemos, el cifrado asimétrico sólo se puede aplicar a "cosas pequeñas" como claves simétricas o resúmenes. Cualquier intento de cifrar con RSA un fichero normal, de más de 200 caracteres, producirá un error de tipo "input too long". El envío confidencial de ficheros normales exige el empleo de sistemas mixtos, en los que el fichero se cifra con una clave simétrica (o contraseña) y esa contraseña es cifrada mediante RSA con la clave pública del receptor y así es enviada a dicho receptor, junto con el fichero cifrado. Si además se desea verificar la integridad del envío, se añade un resumen firmado (que a su vez es un cifrado con clave privada del emisor) del fichero original. | |
| − | + | Por tanto, desarrollamos un ejemplo en el que el emisor (Alice) envia a Bob el documento "texto.txt" cifrado en AES-256-CBC (texto.aes), el resumen SHA-256 del fichero original, cifrado con su propia clave RSA privada (firmaDoc.rsa) y la contraseña que usó para cifrar el documento, cifrada a su vez con la clave pública RSA de Bob (contraseña.cif). Antes de nada, emisor (Alice) y receptor (Bob) tendrán que haber intercambiado sus claves públicas (publicaAliceRSA.pem y publicaBobRSA.pem) y por supuesto, cada uno conserva su clave privada (privadaAliceRSA.pem y privadaBobRSA.pem). | |
| − | + | ;Tarea de Alice (emisor) | |
| − | + | ; Paso 1: Alice cifra con clave simétrica (AES-256-CBC) el fichero "texto.txt" con una contraseña "prueba+12" y produce "texto.aes" | |
| − | + | <code> openssl enc -aes-256-cbc -pbkdf2 -in texto.txt -out texto.aes </code> | |
| − | + | ; Paso 2: Alice escribe la contraseña en el fichero "contraseña.txt", veamos el contenido este fichero: | |
| − | + | <pre>prueba+12</pre> | |
| − | + | ; Paso 3: Alice cifra de forma asimétrica el fichero contraseña.txt con la clave pública RSA de Bob (fichero publicaBobRSA.pem) y produce "contraseña.cif" | |
| − | <code> openssl | + | <code> openssl pkeyutl -pubin -encrypt -in contraseña.txt -out contraseña.cif -inkey publicaBobRSA.pem </code> |
| − | ; Paso | + | ; Paso 4 : Alice firma con su clave privada RSA (privadaAliceRSA.pem) el resumen generado con SHA2-256 del fichero texto.txt y genera el fichero "firmaDoc.rsa". Lo más normal es que la clave privada de Alice esté cifrada y se le solicite la contraseña al ejecutar este comando. |
| − | + | <code> openssl dgst -sha256 -sign privadaAliceRSA.pem -out firmaDoc.rsa texto.aes </code> | |
| − | + | A continuación, Alice envía a Bob los tres ficheros: texto.aes, contraseña.cif y firmaDoc.rsa | |
| − | + | ; Tarea de Bob (receptor) | |
| + | ; Paso 1 | ||
| + | Bob recibe el mensaje con los tres ficheros de Alice y procede a descifrar la contraseña enviada por Alice (contraseña.cif) con su clave privada (privadaBob.pem) en el fichero contraseña.txt. Si la clave privada de Bob estuviese cifrada (que es lo más normal), se le solicitará la contraseña que la protege. | ||
| − | + | <code> openssl pkeyutl -decrypt -in contraseña.cif -out contraseña.txt -inkey privadoBobRSA.pem </code> | |
| − | + | Al hacer un cat al archivo de salida contraseña.txt, Bob ya conoce la contraseña que Alice usó para cifrar texto.aes: | |
| − | < | + | <pre> prueba+12 </pre> |
| − | ; contraseña. | + | ; Paso 2 |
| + | Una vez obtenida la contraseña de cifrado simétrica "prueba +12", Bob puede descifrar el "texto.aes" con dicha contraseña y obtener el documento original (texto.txt): | ||
| − | <code> openssl | + | <code> openssl enc -d -aes-256-cbc -pbkdf2 -in texto.aes -out texto.txt </code> |
| − | + | ; Paso 3 | |
| + | Bob verifica que el resumen SHA-256 del texto descifrado (texto.txt) coincide con el resumen firmado en firmaDoc.rsa. Como Alice firmó el resumen (es decir, lo cifró mediante RSA con su propia clave privada), Bob usa la clave pública de Alice (publicaAliceRSA.pem) para descifrarlo. Si la comprobación es correcta, la transmisión ha tenido CONFIDENCIALIDAD (el texto viajó cifrado con una clave simétrica que viajaba cifrada con RSA) y además INTEGRIDAD (el texto descifrado coincide con el que calculó Alice y envió firmado, es decir, cifrado con su clave privada RSA). | ||
| − | < | + | <code> openssl dgst -sha256 -verify publicaAliceRSA.pem -signature firmaDoc.rsa texto.txt </code> |
| − | + | <pre> Verified OK </pre> | |
| − | + | Nota: Sabemos que OpenSSL ofrece alternativas para casi todos los comandos. Bob podría realizar este último paso generando el resumen SHA256 del fichero texto.txt en un fichero texto.sha y utilizando el comando "openssl pkeyutl" de la misma forma que se indica en el paso 3 del ejemplo siguiente, con los cambios oportunos. | |
=== Firmado y Comprobación de Resúmenes === | === Firmado y Comprobación de Resúmenes === | ||
| − | En este apartado se realizará la firma y verificación del fichero "texto.txt" (utilizaremos "SHA512") que se llamará "resumen. | + | En este apartado se realizará la firma y verificación del resumen de un fichero "texto.txt" (utilizaremos "SHA512") que se llamará "resumen.sha". |
Antes de nada, utilizaremos el comando "pkeyutl" en el primer ejemplo, dicho comando se puede usar para realizar operaciones de clave pública utilizando cualquier algoritmo compatible. | Antes de nada, utilizaremos el comando "pkeyutl" en el primer ejemplo, dicho comando se puede usar para realizar operaciones de clave pública utilizando cualquier algoritmo compatible. | ||
| Línea 1620: | Línea 1569: | ||
; Paso 1 | ; Paso 1 | ||
| − | Realizamos el resumen del fichero "texto.txt" y lo guardamos en el fichero de salida "resumen. | + | Realizamos el resumen del fichero "texto.txt" y lo guardamos en formato binario en el fichero de salida "resumen.sha". |
| − | <code> openssl dgst -sha512 -binary -out resumen. | + | <code> openssl dgst -sha512 -binary -out resumen.sha texto.txt </code> |
; Paso 2 | ; Paso 2 | ||
| − | Firmamos el "resumen. | + | Firmamos el "resumen.sha" con el comando "pkeyutl"y usaremos la clave privada DSA generada anteriormente. En el caso de que se haya protegido la clave con una contraseña deberemos introducirla. |
| − | <code>openssl pkeyutl -sign -in resumen. | + | <code>openssl pkeyutl -sign -in resumen.sha -inkey private.pem -out firma.dsa -pkeyopt digest:sha512</code> |
; Paso 3 | ; Paso 3 | ||
| Línea 1634: | Línea 1583: | ||
Se procede a verificar que se ha firmado correctamente ejecutamos lo siguiente: | Se procede a verificar que se ha firmado correctamente ejecutamos lo siguiente: | ||
| − | <code> openssl pkeyutl -pubin -verify -in resumen. | + | <code> openssl pkeyutl -pubin -verify -in resumen.sha -sigfile firma.dsa -inkey public.pem </code> |
<pre> | <pre> | ||
| Línea 1721: | Línea 1670: | ||
==== X25519 ==== | ==== X25519 ==== | ||
| − | X25519 es un intercambio de claves Diffie-Hellman de curva elíptica utilizando Curve25519. | + | X25519 es un intercambio de claves Diffie-Hellman de curva elíptica utilizando la curva Curve25519. Como los restantes métodos Diffie-Hellman, permite que dos partes acuerden conjuntamente un secreto compartido mediante un canal inseguro o que intercambien sus claves públicas, de forma que la combinación pública-privada en cada extremo produce el mismo valor (secreto) que será utilizado para generar la clave de cifrado simétrico compartida. Esta curva en particular es utilizada por los conocidos sistemas de mensajería móvil Signal y Whatsapp. |
; Paso 1 | ; Paso 1 | ||
| − | Generamos un par de claves X25519 para Alice. Primero generamos la clave privada. | + | Generamos un par de claves X25519 para Alice. Primero generamos la clave privada, que contiene la clave pública. |
<code>openssl genpkey -algorithm X25519 -out priv1.pem</code> | <code>openssl genpkey -algorithm X25519 -out priv1.pem</code> | ||
| Línea 1764: | Línea 1713: | ||
<code>cmp secreto1 secreto2</code> | <code>cmp secreto1 secreto2</code> | ||
| + | |||
| + | ==== Secretos DH y EC como generadores de claves simétricas - Generadores de "carraca" (ratchet) y Forward Secrecy ==== | ||
| + | |||
| + | Obsérvese que el "secreto" que se ha negociado con las dos parejas de claves DH es un valor binario de 256 caracteres (2048 bits), mientras que el secreto derivado de las claves X25519 tiene tan sólo 32 caracteres binarios (256 bits), ya que las claves EC (de curva elíptica) son de menor tamaño que las originales DH y por tanto, los números que resultan de las operaciones de derivación son de tamaño similar a las claves utilizadas. | ||
| + | |||
| + | Habitualmente, este secreto será empleado como generador de clave (y vector de inicialización, en su caso) del algoritmo de cifrado simétrico escogido entre ambas partes. Es común, sobre todo empleando curvas elípticas, que se necesiten más bits para la clave de cifrado simétrico (y vector) que el tamaño del propio secreto obtenido, pero esto no es problema, ya que el secreto no se usa directamente como valor de la clave. Lo que se hace es calcular un resumen determinado (sha-256, sha-512, etc.) del secreto y generar a partir de este resumen, directamente o por iteración de la función (realimentando la salida en la entrada tantas veces como se necesite) los bits necesarios para rellenar la clave (y el vector). | ||
| + | |||
| + | Una variante de este proceso bastante común en la actualidad es el empleo del secreto como "generador de carraca" o "ratchet function". En este caso, lo que se introduce en la función de resumen es la concatenación del secreto y un contador, lo que permitirá cambiar la clave (y el vector) en cada transmisión (identificada por su número en el contador siempre creciente), tal y como se hace en los mensajes de la conocida aplicación Whatsapp. Este tipo de generación de claves en secuencia garantiza la propiedad conocida como "Forward Secrecy", ya que el descifrado de cada mensaje requerirá el mismo esfuerzo para el atacante, dado que si no conoce el valor del secreto negociado, no podrá deducir la secuencia de claves que se aplica en cada mensaje. | ||
== S/MIME == | == S/MIME == | ||
| Línea 2054: | Línea 2011: | ||
</pre> | </pre> | ||
| − | == Generación y verificación de certificados == | + | Obsérvese que no se ha incorporado en el comando de verificación el certificado del firmante (emisor del correo), ya que habitualmente los agentes de correo como Thunderbird incorporan como adjunto el certificado del firmante (emisor) en todos los mensajes firmados, como opción por defecto. De no ser así, el comando informaría de error en la verificación por falta de un certificado y sería necesario incorporar el certificado del firmante, con la opción "-certfile CertEmisor.pem" o similar. |
| + | |||
| + | == Generación y verificación de certificados X.509 == | ||
| − | Un certificado autofirmado contiene una clave pública, información acerca del propietario del certificado y la firma del propietario. Además, tiene una clave privada asociada, aunque no verifica el origen del certificado a través de una tercera entidad emisora de certificados, es decir, no existe una entidad que lo valide. | + | Un certificado X.509 autofirmado contiene una clave pública, información acerca del propietario del certificado y la firma del propietario. Además, tiene una clave privada asociada, aunque no verifica el origen del certificado a través de una tercera entidad emisora de certificados, es decir, no existe una entidad que lo valide. |
| − | En este apartado se explicará el procedimiento para generar una cadena de certificados, incluyendo un certificado raíz autofirmado al que llamaremos "certificadoRaiz. | + | En este apartado se explicará el procedimiento para generar una cadena de certificados, incluyendo un certificado raíz autofirmado al que llamaremos "certificadoRaiz.crt". Este último será el que firme un nuevo certificado al que llamaremos "certificadoIntermedio.crt" y además, verificaremos por separado cada uno de ellos. |
| − | Y para terminar crearemos otro certificado llamado "certificadoFinal. | + | Y para terminar crearemos otro certificado llamado "certificadoFinal.crt" firmado con el "certificadoIntermedio.crt". Se validará el certificado final concatenándolo con el certificado intermedio y de esta forma, constituirán el certificado "chain.crt" |
=== Certificado Raíz Autofirmado === | === Certificado Raíz Autofirmado === | ||
| Línea 2066: | Línea 2025: | ||
; Paso 1 | ; Paso 1 | ||
| − | Generamos el | + | Generamos el certificado raíz RSA que contendrá la clave privada cifrada en AES con la que firmaremos el "certificadoRaiz.crt". |
<code> openssl genpkey -algorithm RSA -aes256 -out certificadoRaiz.key -pkeyopt rsa_keygen_bits:2048</code> | <code> openssl genpkey -algorithm RSA -aes256 -out certificadoRaiz.key -pkeyopt rsa_keygen_bits:2048</code> | ||
| Línea 2179: | Línea 2138: | ||
Finalmente, pasaremos a generar el certificado autofirmado utilizando nuestra clave privada. El comando '''"openssl x509"''' se utiliza para firmar solicitudes y verificar certificados. La opción "-req" indica que se intenta crear un certificado a partir de una solicitud desde el archivo especificado por "-in". El certificado será guardado con el nombre que indica "-out" y será válido por "-days" días a partir de la fecha actual del servidor. Por último, el parámetro "-signkey" indica la clave con la que será firmado el certificado, la cual (en este ejemplo) es la propia clave privada del certificado emitido. | Finalmente, pasaremos a generar el certificado autofirmado utilizando nuestra clave privada. El comando '''"openssl x509"''' se utiliza para firmar solicitudes y verificar certificados. La opción "-req" indica que se intenta crear un certificado a partir de una solicitud desde el archivo especificado por "-in". El certificado será guardado con el nombre que indica "-out" y será válido por "-days" días a partir de la fecha actual del servidor. Por último, el parámetro "-signkey" indica la clave con la que será firmado el certificado, la cual (en este ejemplo) es la propia clave privada del certificado emitido. | ||
| − | <code>openssl x509 -req -days 7300 -in certificadoRaiz.csr -signkey certificadoRaiz.key -out certificadoRaiz. | + | <code>openssl x509 -req -days 7300 -in certificadoRaiz.csr -signkey certificadoRaiz.key -out certificadoRaiz.crt</code> |
<pre> | <pre> | ||
| Línea 2192: | Línea 2151: | ||
Verificamos que el certificado autofirmado se ha creado correctamente. Primero habrá que introducir el certificado de la autoridad certificadora, en nuestro caso es el certificado raíz. | Verificamos que el certificado autofirmado se ha creado correctamente. Primero habrá que introducir el certificado de la autoridad certificadora, en nuestro caso es el certificado raíz. | ||
| − | <code>openssl verify -CAfile certificadoRaiz. | + | <code>openssl verify -CAfile certificadoRaiz.crt certificadoRaiz.crt </code> |
<pre> | <pre> | ||
| − | certificadoRaiz. | + | certificadoRaiz.crt: OK |
</pre> | </pre> | ||
Otra manera de ver las características del firmante (issuer) y del firmado (subject) sería ejecutando el siguiente comando: | Otra manera de ver las características del firmante (issuer) y del firmado (subject) sería ejecutando el siguiente comando: | ||
| − | <code>openssl x509 -text -noout -in certificadoRaiz. | + | <code>openssl x509 -text -noout -in certificadoRaiz.crt</code> |
<pre> | <pre> | ||
| Línea 2375: | Línea 2334: | ||
Firmamos el certificado intermedio con la clave privada del certificado raíz. | Firmamos el certificado intermedio con la clave privada del certificado raíz. | ||
| − | <code>openssl x509 -req -days 360 -in certificadoIntermedio.csr -CA certificadoRaiz. | + | <code>openssl x509 -req -days 360 -in certificadoIntermedio.csr -CA certificadoRaiz.crt -CAkey certificadoRaiz.key -CAcreateserial -out certificadoIntermedio.crt</code> |
<pre> | <pre> | ||
| Línea 2384: | Línea 2343: | ||
</pre> | </pre> | ||
| − | Mostramos el certificado con más detalles como hicimos con el | + | Mostramos el certificado con más detalles como hicimos con el certificado anterior. |
<pre> | <pre> | ||
| Línea 2445: | Línea 2404: | ||
Para estar seguro de que lo hemos realizado correctamente vamos a comprobar el certificado intermedio. | Para estar seguro de que lo hemos realizado correctamente vamos a comprobar el certificado intermedio. | ||
| − | <code>openssl verify -CAfile certificadoRaiz. | + | <code>openssl verify -CAfile certificadoRaiz.crt certificadoIntermedio.crt </code> |
<pre> | <pre> | ||
| − | certificadoIntermedio. | + | certificadoIntermedio.crt: OK |
</pre> | </pre> | ||
| Línea 2565: | Línea 2524: | ||
Firmamos el certificado final con la clave privada del certificado intermedio. | Firmamos el certificado final con la clave privada del certificado intermedio. | ||
| − | <code>openssl x509 -req -days 360 -in certificadoFinal.csr -CA certificadoIntermedio. | + | <code>openssl x509 -req -days 360 -in certificadoFinal.csr -CA certificadoIntermedio.crt -CAkey certificadoIntermedio.key -CAcreateserial -out certificadoFinal.crt</code> |
<pre> | <pre> | ||
| Línea 2641: | Línea 2600: | ||
Este certificado simplemente será la unión del certificado raíz con el certificado intermedio. | Este certificado simplemente será la unión del certificado raíz con el certificado intermedio. | ||
| − | <code>cat certificadoIntermedio. | + | <code>cat certificadoIntermedio.crt certificadoRaiz.crt > chain.crt </code> |
;Paso 2 | ;Paso 2 | ||
| Línea 2647: | Línea 2606: | ||
Hacemos un "cat" para ver el certificado. | Hacemos un "cat" para ver el certificado. | ||
| − | <code>cat chain. | + | <code>cat chain.crt </code> |
<pre> | <pre> | ||
| Línea 2703: | Línea 2662: | ||
Procedemos a la verificación del certificado. | Procedemos a la verificación del certificado. | ||
| − | <code>openssl verify -CAfile certificadoRaiz. | + | <code>openssl verify -CAfile certificadoRaiz.crt chain.crt </code> |
<pre>chain.cert: OK </pre> | <pre>chain.cert: OK </pre> | ||
| Línea 2718: | Línea 2677: | ||
Juntamos los tres certificados en un solo fichero. | Juntamos los tres certificados en un solo fichero. | ||
| − | <code>cat certificadoRaiz. | + | <code>cat certificadoRaiz.crt certificadoIntermedio.crt certificadoFinal.crt > todos.crt </code> |
; Paso 2 | ; Paso 2 | ||
| Línea 2724: | Línea 2683: | ||
Vemos el contenido del fichero creado. | Vemos el contenido del fichero creado. | ||
| − | <code>cat todos. | + | <code>cat todos.crt </code> |
<pre>-----BEGIN CERTIFICATE----- | <pre>-----BEGIN CERTIFICATE----- | ||
MIID8zCCAtsCFDlAjnGUjKoNdFgXQEvpAVygTpgWMA0GCSqGSIb3DQEBCwUAMIG1 | MIID8zCCAtsCFDlAjnGUjKoNdFgXQEvpAVygTpgWMA0GCSqGSIb3DQEBCwUAMIG1 | ||
| Línea 2800: | Línea 2759: | ||
; Paso 3 | ; Paso 3 | ||
| − | <code>openssl verify -CAfile certificadoRaiz. | + | <code>openssl verify -CAfile certificadoRaiz.crt todos.crt </code> |
<pre>todos.cert: OK</pre> | <pre>todos.cert: OK</pre> | ||
| Línea 2811: | Línea 2770: | ||
Tener en cuenta que se nos pedirá la contraseña que usamos para proteger la clave y nos dará la posibilidad de cambiarla por una nueva. En ''"-inkey"'' se deberá introducir la clave privada y en ''"-in''" el certificado correspondiente a dicha clave (en caso contrario, clave y certificado no coincidirían y nos daría error). | Tener en cuenta que se nos pedirá la contraseña que usamos para proteger la clave y nos dará la posibilidad de cambiarla por una nueva. En ''"-inkey"'' se deberá introducir la clave privada y en ''"-in''" el certificado correspondiente a dicha clave (en caso contrario, clave y certificado no coincidirían y nos daría error). | ||
| − | <code>openssl pkcs12 -export -in certificadoIntermedio. | + | <code>openssl pkcs12 -export -in certificadoIntermedio.crt -inkey certificadoIntermedio.key -out inter.p12</code> |
<pre> | <pre> | ||
Revisión actual del 19:28 26 feb 2025
Esta página consiste en un manual de operaciones básicas en formato HowTo sobre Wiki de la herramienta OpenSSL en modo de comandos relativos con el cifrado de ficheros, la generación y manipulación de claves simétricas, certificados digitales, correo electrónico seguro, etc. Además, se combinarán diferentes ejemplos prácticos de los comandos más relevantes de OpenSSL haciendo un estudio y análisis de cada caso.
Para ello, se ofrecerá una guía para INSTALAR la última versión de OpenSSL que corresponde con la 1.1.1 y así, poder desarrollar ejemplos prácticos con la última versión mejorada de esta herramienta.
Sumario
- 1 Instalación OpenSSL
- 2 Resúmenes
- 3 Criptografía Simétrica
- 4 Criptografía Asimétrica
- 5 S/MIME
- 6 Generación y verificación de certificados X.509
- 7 Referencias
Instalación OpenSSL
WINDOWS
Para la instalación de OpenSSL en Windows, se debe de realizar correctamente los pasos que se describen a continuación. Además, al instalar OpenSSL puede que el sistema requiera usar Microsoft Visual C++ (Descarga).
- Paso 1
Se procede a descargar la última versión de OpenSSL, la cuál podemos encontrar en la página de slproweb. Según el caso, se elige el SO de 32 o 64 bits.
- Paso 2
Se ejecuta el archivo.exe descargado y se mantiene la configuración que aparece por defecto excepto, cuando pida copiar OpenSSL que se seleccionará la opción: The OpenSSL binaries (/bin) directory.
- Paso 3;
1) En el buscador de Windows se escribe los siguiente: sysdm.cpl para abrir las Propiedades del Sistema.
2) Opciones Avanzadas.
3) Variables de Entorno.
4) En variables del sistema, se selecciona Path y editar.
5) Nuevo.
6) Escribir C:\Program Files\OpenSSL-Win64.
7) Aceptar.
8) Seleccionar de nuevo Path y editar.
9) Nuevo.
10) Escribir C:\Program Files\OpenSSL-Win64\bin
11) Aceptar.
12) En variables de usuario, se selecciona nueva.
13) En el nombre de la variable se pone lo siguiente: OPENSSL_CONF.
14) En el valor de la variable se pone lo siguiente: C:\Program Files\OpenSSL-Win64\bin\cnf.
15) Aceptar.
- Paso 6
En la terminal se escribe openssl y tiene que salir lo siguiente:
OpenSSL>
Esto significa que está listo para su uso.
Nota: Puede que al instalar la herramienta OpenSSL para equipos de 32 bits, los directorios cambien.
Ubuntu y CentOS
En este apartado se explica como instalar manualmente la última versión de OpenSSL en una distribución Ubuntu o CentOS
Nota:Muchas distribuciones de CentOS y Ubuntu ya tienen instalada una versión de OpenSSL que suele ser anterior a la última. Además, la versión instalada es utilizada por varios componentes del sistema operativo. Por ello, mostramos como instalar la última versión sin afectar a la ya instalada en el sistema, que seguirá igual que antes de la instalación. Es decir, después de estas operaciones, el sistema seguirá utilizando las librerías OpenSSL de la versión antigua en todas sus aplicaciones (httpd, etc.) pero los usuarios dispondrán de los comandos "openssl" y "c_rehash" de la nueva versión.
- Antes de empezar
Tenemos que estar seguros de que el sistema está actualizado y que tiene instalado el compilador gcc y sus librerías, la utilidad "make", librerías de desarrollo,etc.
En Centos:
sudo yum update -y
sudo yum group install 'Development Tools'
sudo yum install perl-core zlib-devel -y
En Ubuntu:
sudo apt-get update && sudo apt-get upgrade
sudo apt install build-essential checkinstall zlib1g-dev -y
- Paso 1
Averiguar cuál es y descargar la última versión de OpenSSL:
Para averiguar cuál es la última versión de OpenSSL hay que acceder a https://www.openssl.org/source y apuntar el nombre del fichero en la primera línea de la tabla de descargas
A fecha de la última actualización de esta Wiki la versión disponible es la openssl-1.1.1e.tar.gz y esta es la que usaremos en este ejemplo.
cd /tmp
wget https://www.openssl.org/source/openssl-1.1.1e.tar.gz
tar xvf openssl-1.1.1e.tar.gz
- Paso 2
A continuación, ejecutamos los siguientes comandos para realizar la instalación de esta herramienta: Accedemos al directorio de los fuentes de OpenSSL:
cd openssl-1.1.1e
Configuramos el directorio de destino:
sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
Compilamos, probamos e instalamos:
sudo make
Empieza la compilación de todas las fuentes... tarda varios minutos
sudo make test
Se ejecutan los tests de binarios y librerias ... tarda varios minutos
Y si todo ha ido bien...
sudo make install
Se instalan los binarios y las librerías bajo el directorio /usr/local/ssl
- Paso 3
Activar las librerías de la nueva versión, para ello hay que crear el fichero /etc/ld.so.conf.d/openssl-1.1.1e.conf con "/usr/local/ssl/lib" como contenido:
sudo echo "/usr/local/ssl/lib" > /etc/ld.so.conf.d/openssl-1.1.1e.conf
El siguiente comando fuerza la recarga de las librerías y con ella se activa la nuestra:
sudo ldconfig -v
- Paso 4
Añadir /usr/local/ssl/bin al principio de la variable de entorno PATH, esto hará que el comando openssl se busque antes en el directorio de nuestra instalación que en el ya existente (típicamente /usr/bin). Esto se puede hacer para nuestro usuario o para todos los usuarios:
a) Para todos los usuarios del sistema: la manera más sencilla tanto en CentOS como en Ubuntu es:
sudo echo "PATH=/usr/local/ssl:\$PATH" >> /etc/profile
b) Sólo para nuestro usuario, en este caso será distinto si tenemos CentOS o Ubuntu ya que el primero típicamente usa ~/.bash_profile y el segundo ~/.profile
en Centos :
sudo echo "PATH=/usr/local/ssl/bin:\$PATH ; export PATH" >> ~/.bash_profile
en Ubuntu :
sudo echo "PATH=/usr/local/ssl/bin:\$PATH" >> ~/.profile
- Paso 5
Salir de la sesión, volver a entrar y probar que funciona con
openssl version
Y debe aparecer la versión instalada.
MAC OS
En este apartado se explica como instalar la última versión de OpenSSL usando un gestor de paquetes para facilitar la instalación en este tipo de SO. En este caso, se usará el gestor de paquetes brew.
- Paso 1
Instalamos la última versión de OpenSSL de la siguiente manera:
1) brew install openssl@1.1
- Paso 2
Si en el equipo donde se va realizar la operación no tiene instalada ninguna versión de esta herramienta, bastaría con ejecutar el paso anterior. Si no es así, se debe ejecutar los comandos que se recomiendan en el proceso de instalación y de esta forma, se dará prioridad a la nueva versión instalada.
If you need to have openssl@1.1 first in your PATH run: echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile For compilers to find openssl@1.1 you may need to set: export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
- Paso 3
Se reinicia el equipo.
Resúmenes
Funciones de resumen o funciones "hash"
A las funciones de resumen también se les llama funciones hash o funciones digest. Las funciones hash criptográficas [1] son aquellas que aceptan cualquier entrada y producen una salida consistente en una ristra de bits de tamaño fijo, que representa un "resumen" de toda la información del fichero de entrada. [2] Uno de los requisitos de estas funciones es que debe ser complejo encontrar colisiones, es decir, debe ser complejo encontrar dos mensajes distintos con el mismo resumen. [3]
Se llaman funciones hash criptográficas a aquellas funciones hash que se utilizan en el área de la criptografía. Este tipo de funciones se caracterizan por cumplir propiedades (mezcla fuerte, dificultad de encontrar colisiones, etc.) que las hacen idóneas para su uso en sistemas que confían en la criptografía para dotarse de seguridad, garantizando que no se ha modificado un archivo en una transmisión, hacer ilegible una contraseña, firmar digitalmente un documento, protección de claves, etc. Estas propiedades las hacen resistentes frente ataques maliciosos que intentan romper esa seguridad.[4]
dgst
A continuación se muestran las opciones más habituales de este comando, que debe ser consultado en la documentación de OpenSSL (https://www.openssl.org/docs/man1.1.1/man1/dgst.html)
- -digest
Especifica el nombre de la función de resumen utilizada.
- -binary
Salida en forma binaria.
- -out filename
Nombre del archivo de salida.
- -sign filename
Firma el resumen usando la clave privada en "filename"
- -keyform arg
Especifica el formato de la clave (pública o privada) en "arg", que será PEM (por defecto), DER, P12, ó ENGINE.
- -verify filename
Verifica la firma usando la clave pública en "filename". El resultado será: "Verification OK" o "Verification Failure".
- -signature filename
Se introduce la firma a verificar en "filename".
- -hmac key
Crea un hash MAC usando "key" como clave.
A continuación, se realizarán ejemplos con las funciones de resúmenes más importantes:
MD5
MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después de que Hans Dobbertin descubriese su debilidad. Se trata de un algoritmo de reducción criptográfico de 128 bits (32 caracteres hexadecimales) ampliamente usado. Uno de sus usos es el de comprobar que algún archivo no haya sido modificado. A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados desde que, en 1996, Hans Dobbertin anunciase una colisión de hash, plantea una serie de dudas acerca de su uso futuro. [5] Cabe destacar, que existe algoritmos anteriores pertenecientes a la familia MD5 como fueron MD1, MD2, MD3 y MD4. Aunque MD5 esté en desuso por sus vulnerabilidades (se considera "roto" actualmente), se debe conocer como funciona, ya que existe multitud de documentos que han usado este algoritmo a lo largo de los años.
Se crea un texto.txt con un texto cualquiera que usaremos tanto para este ejemplo como para el resto del documento.
En un lugar de la Mancha de cuyo nombre no quiero acordarme...
.
- Paso 1
Se calcula el resumen MD5 del fichero "texto.txt".
openssl dgst -md5 texto.txt
MD5(texto.txt)= 4fa02d78a06b3833c190b464261d8c08
Como ejemplo de cómo varía un resumen ante mínimos cambios en el fichero de entrada, usaremos ahora un fichero "texto2.txt" idéntico, salvo la primera letra en minúsculas:
en un lugar de la Mancha de cuyo nombre no quiero acordarme...
.
- Paso 2
Se calcula el resumen MD5 del fichero "texto2.txt".
openssl dgst -md5 texto2.txt
MD5(texto2.txt)= 5ed88c107e07da73dcfa03893bb8e822
Y se observa que es absolutamente diferente del resumen anterior.
- Paso 3
En este caso, demostraremos que cualquier función de resumen produce un "hash" de salida, aunque la entrada sea nula:
echo ""| openssl dgst -md5
(stdin)= 68b329da9893e34099c7d8ad5cb9c940
SHA-1
SHA-1 ( Secure Hash Algorithm 1 ) es una función criptográfica de resumen que admite cualquier entrada y produce un resultado de 160 bits (20 bytes), que generalmente se representa como un número hexadecimal , de 40 dígitos de longitud. Fue diseñado por la Agencia de Seguridad Nacional de los Estados Unidos y es un estándar de procesamiento de información federal de los Estados Unidos. [6]
En 2005, se identificaron fallos de seguridad en el SHA-1, permitiendo que existiera una debilidad matemática (ver la web http://shattered.io) evidenciando así la necesidad de sustituir el empleo de SHA-1 por funciones hash más robustas, como la familia SHA-2 que veremos en el apartado siguiente.
- Paso 1
Se realizará un resumen SHA-1 del mismo fichero "texto.txt", usado en los ejemplos anteriores.
openssl dgst -sha1 texto.txt
SHA1(texto.txt)= 50820e3061249bb5470aa558eeb3da769369a6e3
SHA-2
SHA-2 es una familia de funciones hash criptográficas, con diversos tamaños de salida en bits (SHA2-224, SHA2-256, SHA2-384 y SHA2-512) diseñadas por la Agencia de Seguridad Nacional (NSA) y publicada en 2001 por el Instituto Nacional de Estándares y Tecnología (NIST) como un Estándar Federal de Procesamiento de la Información (FIPS). [7]
SHA224
Produce resúmenes de 224 bits (28 bytes) que generalmente se representan como un número hexadecimal de 56 dígitos de longitud. En las versiones actuales de OpenSSL se acostumbra a nombrar las funciones de la familia SHA-2 indicando directamente el tamaño después de la palabra SHA, es decir, SHA2-224 se nombra como "sha-224".
- Paso 1
Se realizará un resumen SHA2-224 del mismo fichero "texto.txt" usado en los ejemplos anteriores.
openssl dgst -sha224 texto.txt
SHA224(texto.txt)= 6e911e52c586fb578608f582321eed909b9147569b824bc4eb79d785
SHA256
Produce resúmenes de 256 bits (32 bytes) que generalmente se representan como un número hexadecimal de 64 dígitos de longitud.
- Paso 1
Se realizará un resumen SHA2-256 del mismo fichero "texto.txt" usado en los ejemplos anteriores.
openssl dgst -sha256 texto.txt
SHA256(texto.txt)= 18bd46db70c25f5af60aeaf927754b9d212cadfaa650895631775de3bbb44114
SHA384
Produce resúmenes de 384 bits (48 bytes) que generalmente se representan como un número hexadecimal de 96 dígitos de longitud.
- Paso 1
Se realizará un resumen SHA2-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores.
openssl dgst -sha384 texto.txt
SHA384(texto.txt)= 5d52867897694aacb4cc9055ea004819d598db736ae86e08980950de1f09a05d4428ec87289191276235c551f6597b22
SHA-512
Produce resúmenes de 512 bits (64 bytes) que generalmente se representan como un número hexadecimal de 128 dígitos de longitud.
- Paso 1
Se realizará un resumen SHA2-512 del mismo fichero "texto.txt" usado en los ejemplos anteriores.
openssl dgst -sha512 texto.txt
SHA512(texto.txt)= d05dda99543ca29ec4b9ad2f4b7049c09934ecff527a28a42f88d2bf968a80bdd18c88983ff67bb87a79b3494395702371d8cee0e31127b73252227f39898bf8
SHA-3
La familia de funciones SHA-3 es el último miembro de la familia de estándares de Secure Hash Algorithm, publicado por NIST el 5 de agosto de 2015. SHA-3 es un posible sustituto de los algoritmos SHA-2 si se descubre alguna vulnerabilidad en estos. [8]
SHA-3 genera las mismas longitudes de resumen que SHA-2 (SHA3-224, SHA3-256, SHA3-384 y SHA3-512). En este caso usaremos como ejemplos solamente SHA3-384 y SHA3-512.
SHA3-384
- Paso 1
Se realizará un resumen SHA3-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores.
openssl dgst -sha3-384 texto.txt
SHA3-384(texto.txt)= 3e0c626b47f8b9a41b975913801b6076bd8f737483b6b4b14c72f80e701b77f653cebf46a5ade8f9dbe876c7043d829e
SHA3-512
- Paso 1
Se realizará un resumen SHA3-384 del mismo fichero "texto.txt" usado en los ejemplos anteriores.
openssl dgst -sha3-512 texto.txt
SHA3-512(texto.txt)= 47689e88171715227d8c5dbb48eed6e45ca969dc25895da01eb0b63933dd0363d2671f3e486236c5af2e711f9a003d1f4e6c1beddf6644f0bcaed9b8b80df967
MAC (Message authentication code)
En criptografía , un código de autenticación de mensaje (MAC), es una información breve que se utiliza para autenticar un mensaje; en otras palabras, para confirmar que el mensaje proviene del remitente indicado (su autenticidad) y que el mensaje no haya sido alterado. Los valores MAC se calculan mediante la aplicación de una función hash criptográfica con clave secreta K, que sólo conocen el remitente y destinatario, pero no los atacantes. El valor MAC protege tanto la integridad de los datos de un mensaje como su autenticidad , al permitir que los verificadores (que también poseen la clave secreta) detecten cualquier cambio en el contenido del mensaje. Los algoritmos MAC pueden construirse a partir de otras primitivas criptográficas, como las funciones criptográficas hash (como en el caso de HMAC ). [9]
Tipos de MAC
HMAC (hash-based message authentication code)
HMAC (a veces entendido como código de autenticación de mensaje hash con clave o código de autenticación de mensaje basado en hash ) es un tipo específico de código de autenticación de mensaje (MAC) que incluye una función de hash criptográfica y una clave criptográfica secreta . Puede usarse para verificar simultáneamente la integridad de los datos y la autenticación de un mensaje , como con cualquier MAC. Cualquier función hash criptográfica, como SHA256 o SHA-3, puede ser utilizado en el cálculo de un HMAC; el algoritmo MAC resultante se denomina HMAC-X, donde X es la función hash utilizada (por ejemplo, HMAC-SHA256 o HMAC-SHA3). La fuerza criptográfica de la HMAC depende de la fuerza criptográfica de la función hash subyacente, el tamaño de su salida de hash y el tamaño y la calidad de la clave. [10]
- Paso 1
Se procede a obtener el HMAC del "texto.txt" usando una contraseña específica ("control1995"). Para ello, se utilizará la función hash "sha-512" como se muestra a continuación:
openssl dgst -hmac-sha512 "control1995" texto.txt
HMAC-SHA512(texto.txt)= 62ad3592dbdfc00ce70f16228e66884e82468b94ac18ab44ae6fcaa5b3c39a4c0f94e57d87b2fc7cfba18616081d245858f474944252e1eb6beec2362bf67862
- Paso 2
Para verificar que si se cambia la contraseña se produce un HMAC diferente, se repetirá el mismo paso acortando la contraseña anterior.
openssl dgst -sha512 -hmac "control" texto.txt
HMAC-SHA512(texto.txt)= 0c89913b70372eb77dd0631133275becce14459d57de0e1144d92b3fdba350cb9e9ba5af4eff62469419eb726e722e8e96547fcf3235c63fb55dcfdb8df6fc83
Criptografía Simétrica
La criptografía de clave simétrica, también llamada criptografía de clave privada o de clave secreta, es un método criptográfico en el cual se usa una misma clave para cifrar y descifrar mensajes en el emisor y el receptor. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez que ambas partes tienen acceso a esta clave, el remitente cifra un mensaje usando la clave, lo envía al destinatario, y éste lo descifra con la misma clave. [11]
Aunque existan algoritmos que vayan siendo desechados por las vulnerabilidades que se van descubriendo, no se pueden dejar de lado, ya que existen documentos anteriores cifrados con estos algoritmos y se necesita conocer su contenido. Con el paso del tiempo, estos documentos irán desapareciendo, siendo reemplazados por algoritmos más seguros y fiables.
Para proceder a cifrar o descifrar mensajes se hará uso del comando -enc. Se utiliza tanto para cifrados de bloque como de flujo, haciendo uso de claves basadas en contraseñas o claves proporcionadas explícitamente (clave y vector de inicialización, en su caso).
MUY IMPORTANTE: Cuando se cifra con contraseña, OpenSSL pasa esta contraseña, junto con 64 bits aleatorios de sal criptográfica, por un algoritmo de derivación de claves como el PBKDF1 (obsoleto) o el PBKDF2 (explicado en las "opciones de enc"). Estos algoritmos utilizan funciones de resumen de forma recursiva para obtener suficientes bits para la clave de cifrado y para el vector de inicialización si es necesario. Esto permite que para una misma contraseña, se generen diferentes claves, al variar en cada caso la sal obtenida aleatoriamente.
A continuación, se muestra algunas de las opciones más importantes que nos permite realizar el comando -enc y de las cuáles se harán uso durante el desarrollo de los ejemplos. Hay que tener en cuenta, que en algunos ejemplos hemos expuesto comandos donde la contraseña aparece explícita y eso es muy peligroso. Por ello, se desaconseja el uso de dichos comandos aunque en esta wiki se use para fines didácticos. En situaciones de uso real, siempre hemos de intentar que la contraseña sea solicitada por el comando e introducida de forma no visible en pantalla.
Comando enc
- -in filename
- Se introduce el fichero que se quiere cifrar.
- -out filename
- Se escribe el nombre del fichero de salida que contendrá el texto cifrado.
- -e
- Para cifrar el fichero de entrada.
- -d
- Para descifrar el fichero de entrada.
- -a
- Para cifrar el fichero de entrada en Base64.
- -k password
- Para especificar una contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass pass: password (aunque desaconsejamos esto)
- -kfile filename
- Fichero que contiene la contraseña (en desuso). Su equivalente y el que se recomienda usar a día de hoy es -pass file.
- -pass pass: password
- Igual que "-k password".
- -pass file
- Igual que "-kfile filename".
- -p
- Cifra y muestra en pantalla la clave, el vector de inicialización y el valor de sal.
- -P
- No cifra, simplemente muestra en pantalla la clave, el vector de inicialización y el valor de sal.
- -K key
- Se proporciona la clave real directamente. Siempre que se introduce la clave, obligatoriamente se introducirá también el vector de inicialización (-iv IV) salvo que el algoritmo no lo use.
- -iter count
- Utilice un número dado de iteraciones en la contraseña para derivar la clave de cifrado. Los valores altos aumentan el tiempo requerido para forzar el archivo resultante. Esta opción permite el uso del algoritmo PBKDF2 para derivar la clave (recordemos que PKBDF1 está obsoleto).
- -pbkdf1
- Leer -pbkdf2. Tiene la misma funcionalidad que su sucesor pero con la diferencia de que este último tiene capacidad para generar claves de más de 160 bits (128, 256, 512 bits). Hay que tener en cuenta que si se usa una de las dos versiones a la hora del cifrado, se tiene que usar la misma función para el descifrado, ya que no son compatibles. Por ello, cuando se manipulen ficheros cifrados, hay que saber cuál de las dos versiones se ha usado. Aunque -pbkdf1 está en desuso, hay que conocerla debido a que existen ficheros antiguos cifrados con este sistema de derivación de claves.
- -pbkdf2
- Usar algoritmo PBKDF2 con el número de iteraciones predeterminado al no ser que diga lo contrario. PBKDF2 aplica una función pseudoaleatoria (HMAC con cualquier función hash aprobada: HMAC-SHA1) a la contraseña de entrada o frase de contraseña junto con un valor de sal y repite el proceso muchas veces (mínimo se recomienda 1000 iteraciones) para producir una clave derivada, que luego se puede usar como una clave criptográfica en operaciones posteriores. El trabajo computacional agregado hace que el "craqueo" de contraseñas por fuerza bruta sea mucho más difícil. La norma recomienda una longitud de sal de al menos 64 bits, que es la que utiliza OpenSSL.[12]
- -md messagedigest
- especifica el resumen del mensaje que se utiliza para la derivación de clave. Puede tomar uno de los valores md2 , md5 , sha o sha2 . El algoritmo predeterminado es sha2-256. [13]
Antes de empezar con algunos ejemplos de los algoritmos más relevantes de cifrado simétrico, hay que entender que existen diferentes métodos de cifrado que usan a su vez, diferentes modos de operación.
Cifrado en bloque
En criptografía, una unidad de cifrado por bloques (en inglés, block cipher) es una unidad de cifrado de clave simétrica que opera en grupos de bits de longitud fija, llamados bloques, aplicándoles una transformación invariante. Cuando se realiza el cifrado, una unidad de cifrado por bloques toma un bloque de texto plano o claro como entrada y produce un bloque de igual tamaño de texto cifrado. La transformación exacta es controlada utilizando una segunda entrada — la clave secreta. El descifrado es similar: se ingresan bloques de texto cifrado y se producen bloques de texto plano. [14]
Un concepto importante en el cifrado por bloques es el Padding. Se trata de un esquema de relleno necesario que usan algunos modos de operación de cifrado en bloque para completar los mensajes que no tengan una longitud múltiplo del tamaño de bloque. El "padding" estándar en OpenSSL se describe en la especificación PKCS5.
Otra idea que cabe destacar, es el vector de inicialización o IV. El IV es un bloque de bits que es requerido para permitir un cifrado en flujo o un cifrado por bloques, en uno de los modos de cifrado, con un resultado independiente de otros cifrados producidos por la misma clave. El tamaño del IV dependen del algoritmo de cifrado y del protocolo criptográfico y usualmente es tan largo como el tamaño de bloque (cifradores en bloque) o como el tamaño de la clave (cifradores en flujo). Habitualmente el IV se genera de forma aleatoria o pseudoaleatoria al mismo tiempo que la clave de cifrado (por empleo de funciones del tipo PBKDF2). [15]
Modos de Operación de algoritmos de cifrado en bloque para cifrado en bloque
Los modos de operación más comunes son:
- ECB (Electronic CodeBook): Este modo de cifrado es el más simple de todos, pues se limita a partir el mensaje en bloques y cifrarlos por separado. [16].
La desventaja de este método es que bloques idénticos de mensaje sin cifrar producirán idénticos textos cifrados, mientras que al resto de modos de operación no les ocurre esta situación porque combinan bloques anteriores de texto claro o cifrado de tal modo que idénticos bloques de texto claro producirán bloques diferentes de texto cifrado. Esto explica la necesidad del vector de inicialización (IV) para enmascarar el primer bloque. Este problema se puede observar gráficamente si se cifra una imagen en colores sólidos:
- CBC (Cipher Block Chaining): El modo de cifrado CBC divide el mensaje en bloques y usa XOR para combinar el cifrado del bloque anterior con el texto plano del bloque actual. Como no se dispone de un texto cifrado con el que combinar el primer bloque, se genera un vector de inicialización que cambia aleatoriamente cada vez que se empieza un cifrado desde 0. [17] Tanto en los modos de operación ECB y CBC, el último bloque de texto debe ser rellenado (paddding) antes del proceso de cifrado, ya que las dimensiones de los mensajes son variables y el cifrador en bloque opera con bloques de tamaño fijo.
Modos de Operación de algoritmos de cifrado en bloque para cifrado en flujo
Aunque los modos de operación CFB, OFB y CTR se aplican a cifradores en bloque, realmente producen un cifrado en flujo, ya que el cifrador de bloque se emplea para generar un "keystream" que será combinado con el texto claro bit a bit para producir el texto cifrado. Por ello, los englobamos en este apartado.
- CFB (Cipher FeedBack): el modo de retroalimentación de cifrado (CFB), un pariente cercano de CBC, convierte un cifrado de bloque en un cifrado de flujo. La operación es muy similar; en particular, el descifrado CFB es casi idéntico al cifrado CBC realizado a la inversa y que además, evita el rellenado de bloques. [18] Por tanto, hace que el cifrado en bloque opere como una unidad de flujo de cifrado: se generan bloques de flujo de claves, que son operados con XOR y el texto en claro para obtener el texto cifrado. [19]
- OFB (Output FeedBack): emplea una clave para crear un bloque pseudoaleatorio que es operado a través de XOR con el texto claro para generar el texto cifrado. Requiere de un vector de inicialización que debe ser único para cada ejecución realizada. [20].
- CTR (Counter): genera el siguiente bloque pseudoaleatorio cifrando valores sucesivos de un "contador". El contador puede ser cualquier función que produzca una secuencia que se garantiza que no se repetirá durante mucho tiempo, aunque un contador real de incremento por uno es el más simple y el más popular. Si el IV / nonce es aleatorio, entonces pueden combinarse con el contador utilizando cualquier operación sin pérdida (concatenación, adición o XOR) para producir el bloque de contador único real para el cifrado. [21]
Algoritmos de cifrado en bloque con modo de operación de bloque
DES (Data Encryption Standard)
DES es el algoritmo prototipo del cifrado por bloques — un algoritmo que toma un texto en claro de una longitud fija de bits y lo transforma mediante una serie de operaciones básicas en otro texto cifrado de la misma longitud. En el caso de DES el tamaño del bloque es de 64 bits. DES utiliza también una clave criptográfica para modificar la transformación, de modo que el descifrado sólo puede ser realizado por aquellos que conozcan la clave concreta utilizada en el cifrado. La clave mide 64 bits, aunque en realidad, sólo 56 de ellos son empleados por el algoritmo. Los ocho bits restantes se utilizan únicamente para comprobar la paridad, y después son descartados. Por tanto, la longitud de clave efectiva en DES es de 56 bits, y así es como se suele especificar. [22]
Este algoritmo es considerado no seguro, ya que su tamaño de clave de 56 bits es corto y con ello, han habido casos en que las claves de DES se han roto en un día. Más adelante, se verá una variante de este algoritmo considerado más segura, como es el Triple DES.
DES - ECB
- Paso 1
En este ejemplo cifraremos el fichero de ejemplo texto.txt con DES en modo ECB (recordemos lo peligroso que es este modo de operación ECB y NO LO USEMOS NUNCA EN LA VIDA REAL)
openssl enc -des-ecb -a -in texto.txt -out des_ecb.cif
Se tendrá que introducir una contraseña, la cuál se usará tanto para cifrar como descifrar. Además, el resultado estará en base 64 ya que utilizamos la opción "-a".
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
cat des_ecb.cif
U2FsdGVkX19kW3Tq3F0Sh9ELdcdlloEOs1pJsOG24MuvuOBPfvaHE/nK0iBtb9F1HlxZw5Whn+eAXXABg/d9DjXnl0pRKjpheO4pP9rPug0=
- Paso 3
Se descifra el fichero que se ha cifrado antes de la siguiente manera (Se usa "-d" para indicar que se va a descifrar el fichero de entrada y si se desea se ejecuta un cat del fichero de salida para verificar el resultado):
openssl enc -des-ecb -d -a -in des_ecb.cif -out texto_desc.txt
DES - CBC
Si se pone solo "-des" sin modo de operación, por defecto usará el modo de operación CBC, mucho más seguro que el ECB del ejemplo anterior.
- Paso 1
En este caso cifraremos el texto.txt proporcionando la contraseña "luna77" en la misma línea de comando (opción no recomendada):
1) openssl enc -des-cbc -a -k luna77 -in texto.txt -out des_cbc.cif
En este caso no se tendrá que introducir ninguna contraseña, ya que se ha proporcionado al ejecutar el comando anterior.
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
cat des_cbc.cif
U2FsdGVkX18ASWAnYV+LYwjtb8A0jTXXaFYXI9BEtMSyUXPCXmhNrHtC6LFg3+WGQFcXPAWb/ptzZV2lNBkFNrgnlabYRunACGZ3mJSS/xU=
- Paso 3
Se descifra el fichero que se ha cifrado antes de la siguiente manera (si se desea se ejecuta un cat del fichero de salida para verificar el resultado):
openssl enc -des-cbc -d -a -k luna77 -in des_cbc.cif -out texto_desc.txt
TRIPLE DES
En criptografía, Triple DES se le llama al algoritmo que hace triple cifrado del DES. También es conocido como TDES o 3DES, fue desarrollado por IBM en 1998. El Triple DES está desapareciendo lentamente, siendo reemplazado por el algoritmo AES. Sin embargo, la mayoría de las tarjetas de crédito y otros medios de pago electrónicos tienen como estándar el algoritmo Triple DES (anteriormente usaban el DES). Por su diseño, el DES y por lo tanto el TDES son algoritmos lentos. AES puede llegar a ser hasta 6 veces más rápido y a la fecha no se ha encontrado ninguna vulnerabilidad [23].
TDES usa una longitud de 168 bits (3x56) aunque realmente su eficiencia es de 112 bits, es decir, dobla la longitud de clave de DES. Por ello, TDES no se considera vulnerable a los ataques por fuerza bruta, al contrario que su antecesor que poseía una longitud de clave corta. Además, se continúa cifrando bloques de 64 bits.
Existen diferentes tipos de TDES, aunque el más utilizado es el EDE3 (Encrypt-Decrypt-Encrypt) con dos claves DES. Es decir, el cifrado se aplica al contenido mediante la clave 1, luego este texto cifrado se descifra con la clave 2 y finalmente, el texto descifrado se vuelve a cifrar con la clave 2.
DES - EDE3 - CBC
Aprovecharemos un ejemplo de utilización del algoritmo des-ede-cbc para ilustrar el empleo de contraseñas y cómo se introduce automáticamente la sal en el fichero cifrado cuando se emplean contraseñas para el cifrado con cualquier tipo de algoritmo de cifrado y/o modo de operación.
La sal 'salt' es una cadena aleatoria de 8 bytes que se almacena con el archivo cifrado para que cada vez que cifre un archivo con una contraseña específica el archivo resultante será diferente. La sal está activada siempre por defecto. La sal se identifica por el encabezado de 8 bytes ( Salted__ ), seguido por la sal de 8 bytes. Hay que tener en cuenta que si ciframos el contenido de un fichero con una contraseña, la sal se identifica en el texto cifrado por un encabezado de 8 bytes ( Salted__ ), seguido por la sal de 8 bytes.
En este ejemplo, cifraremos con una contraseña y luego usaremos la clave y el IV para el descifrado, eliminando los primeros 16 bytes del fichero cifrado antes de descifrarlo.
- Paso 1
En este caso cifraremos el texto.txt de manera que se solicite la contraseña y se muestre en pantalla la sal, la clave y el vector de inicialización (opción -p):
openssl enc -des-ede3-cbc -p -in texto.txt -out des_ede3_cbc.cif
salt=D30F902E2A9DCF99 key=6581AB49BC17A188D8E2BE8C547734F568F78DDAA6442CCD iv =DFDBFE410F5BD79A
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal, el fichero cifrado es binario (no se usó la opción -a) pero los primero ocho caracteres serán textuales, ya que es la cadena "Salted__" que indica que los ocho bits siguientes contienen la sal:
cat des_ede3_cbc.cif
Salted__??.*?ϙg?W:?ç?PX3? u
&?Qxo9?*u?
?h???9???3y
R\Z??H?"?t?5"?x
- Paso 3
Para poder descifrar el fichero con la clave y el IV, primero hemos de "extraer" el texto "Salted__" y los ocho bits de sal (16 bytes en total) como se indica a continuación:
cat des_ede3_cbc.cif | dd ibs=16 obs=16 skip=1 > des_ede3_cbc_sinsal.cif
- Paso 4
Para verificar que se ha extraido correctamente la sal, se muestra el contenido del fichero de salida por la terminal:
cat des_ede3_cbc_sinsal.cif
g?W:?ç?PX3? u
&?Qxo9?*u?
?h???9???3y
R\Z??H?"?t?5"?x
Al comparar este fichero con el fichero des_ede3_cbc.cif, se observa que se han eliminado parte de los bytes correspondientes a la sal (16 primeros bytes).
- Paso 5
Para descifrar, se hará uso de la clave y el IV obtenidos por pantalla en el primer paso:
5) openssl enc -des-ede3-cbc -d -in des_ede3_cbc_sinsal.cif -out texto_desc.txt -K 6581AB49BC17A188D8E2BE8C547734F568F78DDAA6442CCD -iv DFDBFE410F5BD79A
Al realizar un cat del fichero de salida se podrá leer el texto original.
Nota: si no se especifica el modo de operación, por defecto se usará "cbc".
AES (Advanced Encryption Standard)
AES, también conocido como Rijndael (pronunciado "Rain Doll" en inglés), es un esquema de cifrado por bloques adoptado como un estándar de cifrado por el gobierno de los Estados Unidos. El AES fue anunciado por el Instituto Nacional de Estándares y Tecnología (NIST) como FIPS PUB 197 de los Estados Unidos (FIPS 197) el 26 de noviembre de 2001 después de un proceso de estandarización que duró 5 años. Se transformó en un estándar efectivo el 26 de mayo de 2002. Desde 2006, el AES es uno de los algoritmos más populares usados en criptografía simétrica. El cifrado fue desarrollado por dos criptólogos belgas, Joan Daemen y Vincent Rijmen, ambos estudiantes de la Katholieke Universiteit Leuven, y fue enviado al proceso de selección AES bajo el nombre "Rijndael".[24]
Basado en la estructura de bloques de AES, el cambio de un solo bit, ya sea en la clave, o en el bloque de texto sin cifrado, da como resultado un bloque de texto cifrado completamente diferente [25]. Este algoritmo tiene una longitud de bloque de 128 bits y longitudes de clave de 128, 192 y 256.
Se trata de un algoritmo del que todavía no se ha registrado ningún ataque factible hacia él, convirtiéndose en un estándar de cifrado para las principales organizaciones como bancos, gobiernos y sistemas de alta seguridad en todo el mundo. Además, es un estándar mucho más rápido que los vistos anteriormente.
AES - 128 - CBC
- Paso 1
En este caso se cifrará el texto.txt de manera que se muestre la sal, la clave y el vector de inicialización para poder observar como varía la key según el tamaño de clave utilizada(128, 192 o 256 bits).
De la misma manera con la que hemos descifrado en DES - EDE3 - CFB , se podría hacer con AES. En este caso, solo mostraremos la sal, la clave y el vector de inicialización con fines didácticos.
openssl enc -aes-128-cbc -p -in texto.txt -out aes_128_cbc.cif
salt=D4CB02846DF52631 key=E0F912BD4D46C5E051C0E8AB296C087A iv =F63249B4C246608579EEC44996AEAD7E
En este caso se tendrá que introducir una contraseña con la que se cifrará y descifrará los ficheros.
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
cat aes_128_cbc.cif
Salted__???m?&1???o?~#??[A????6??S(?r+?O?l M<0????{????H???h??(m?!?
- Paso 3
Para descifrar el fichero lo hacemos directamente sin necesidad de extraer la sal:
openssl enc -d -aes-128-cbc -in aes_128_cbc.cif -out aes_128_desc.txt
enter aes-128-cbc decryption password:
- Paso 4
Verificamos que el descifrado se ha hecho correctamente.
cat aes_128_desc.txt
En un lugar de la Mancha de cuyo nombre no quiero acordarme...
Nota: si no se especifica el modo de operación, por defecto se usará "cbc".
Cifrado en Flujo
Para algunas aplicaciones, tales como el cifrado de conversaciones telefónicas, el cifrado en bloques es inapropiada porque los flujos de datos se producen en tiempo real en pequeños fragmentos. Las muestras de datos pueden ser tan pequeñas como 8 bits o incluso de 1 bit, y sería un desperdicio rellenar el resto de los 64 bits antes de cifrar y transmitirlos. Los cifradores de flujo son algoritmos de cifrado que pueden realizar el cifrado incrementalmente, convirtiendo el texto en claro, en texto cifrado bit a bit, es decir, cada dígito de texto sin formato se cifra uno a la vez con el dígito correspondiente de la secuencia pseudoaleatoria, para dar un dígito del flujo de texto cifrado. Una secuencia pseudoaleatoria es una secuencia de bits de tamaño arbitrario que puede emplearse para oscurecer los contenidos de un flujo de datos combinando esta secuencia con el flujo de datos mediante la función XOR. Si la secuencia pseudoaleatoria es segura, el flujo de datos cifrados también lo será. Los bloques se cifran empleando una clave compartida por el emisor y el receptor. [26]
Uno de los algoritmos de flujo más utilizados es el RC4 (ya obsoleto), reemplazado en la actualidad por algoritmos más eficientes como el Chacha20 y los modos de operación en flujo (OFB o CFB) de los cifradores de bloque como TDES, AES, etc.
Algoritmos de cifrado en flujo (nativos)
RC4
Dentro de la criptografía RC4 o ARC4 es el sistema de cifrado de flujo Stream cipher más utilizado y se utilizó en algunos de los protocolos más populares como Secure Sockets Layer (SSL) (para proteger el tráfico de Internet) y Wired Equivalent Privacy (WEP) para añadir seguridad en las redes inalámbricas. En los últimos años, RC4 se ha excluido de los estándares de alta seguridad por sus debilidades. No está recomendado su uso en los nuevos sistemas y el estándar TLS de cifrado web y los protocolos WPA de cifrado en Wifi lo excluyen.
- Paso 1
Ahora se procederá a cifrar el fichero texto.txt pero usando un cifrado de flujo RC4. Se tendrá que introducir una contraseña.
openssl enc -rc4 -a -pbkdf2 -in texto.txt -out rc4.cif
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
cat rc4.cif
U2FsdGVkX1+NGFlYsDGIrvaeo21Gg7pkI+OD0ZjU7QzS97w7q5HP2xNnz7BxBew2 6tiHQXgAAfp7P0zZq+6PIBFRVEy61wU2wNg+tpVy
- Paso 3
Para descifrar, ejecutamos el siguiente comando y posteriormente introducimos la misma contraseña que se usó para el cifrado:
openssl enc -rc4 -d -a -pbkdf2 -in rc4.cif -out texto_desc.txt
Al realizar un cat del fichero de salida se podrá leer el texto original si se desea verificar que el descifrado se ha efectuado correctamente.
Chacha20
Es un sistema de cifrado en flujo, que soporta claves de 128 y 256 bits y de alta velocidad creado por Bernstein en 2008. Salsa20 es el cifrado original creado también por Bernstein en 2007, el cuál mantiene una estrecha relación con su sucesor, ya que ambos cifrados se basan en una función pseudoaleatoria basada en operaciones add-rotate-xor (ARX). Salsa20 y ChaCha poseen la inusual ventaja de que el usuario puede buscar de manera eficiente cualquier posición en el flujo de claves en tiempo constante.
La principal diferencia entre ellos, es que Chacha20 ofrece un aumento de la difusión por ronda y logra ligeramente un mejor rendimiento. Además, se considera que en implantaciones software es más eficiente y rápido que AES.
- Paso 1
Se cifra el texto.txt con Chacha20 usando esta vez la funcion -pass pass:password (desaconsejada).
openssl enc -chacha20 -a -pbkdf2 -pass pass:informatica95 -in texto.txt -out chacha20.cif
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
2) cat chacha20.cif
U2FsdGVkX19A+Yp7zsXDMD/VDIsgYsdM5nxu037Ku0a8zlyCocLhq9G6t+UPSDug N98wSwM0RPfBOUVyEKMk99hWwNFWKESgg0WCFLXi
- Paso 3
Para descifrar ejecutamos el siguiente comando incluyendo la contraseña como se hizo para cifrar:
openssl enc -chacha20 -d -a -pbkdf2 -pass pass:informatica95 -in chacha20.cif -out texto_desc.txt
Al realizar un cat del fichero de salida se podrá leer el texto original si se desea verificar que el descifrado se ha efectuado correctamente.
Algoritmos de cifrado en bloque en modo de operación de flujo
Como ya hemos indicado, los modos de operación CFB, OFB y CTR transforman cifradores de bloque en cifradores de flujo, veamos un ejemplo con Triple DES y otro con AES
DES - EDE3 - OFB
Anteriormente se ha usado el comando -k para introducir la contraseña directamente pero cada vez se usa menos. Su equivalente y el que se recomienda usar a día de hoy es -pass pass:password cuya función es la misma que la anterior, aunque insistimos en que es mejor no poner esta opción y teclear la contraseña directamente.
- Paso 1
Se cifra el texto.txt usando el comando nombrado en la descripción de la siguiente manera:
openssl enc -des-ede3-ofb -a -pass pass:prueba+1 -in texto.txt -out des-ede3.ofb.cif
Al introducir la contraseña prueba+1 arriba, no se pedirá introducir contraseña alguna al ejecutar el comando.
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
cat des-ede3.ofb.cif
U2FsdGVkX1807oH+u4mohMA8SHgqVU+GjyJQppx51rPbRt/IINW3PftAC6Y9v1vx CR4T73xtuUP5boyWMqjWKQKQer3rWlDdzoeBpYEM
- Paso 3
Para descifrar se puede hacer de dos formas. Una de ellas es introducir directamente la contraseña como se ha hecho para cifrar, o introducirla después de ejecutar el comando.
openssl enc -des-ede3-ofb -d -a -pass pass:prueba+1 -in des-ede3.ofb.cif -out texto_desc.txt
cat texto_desc.txt
En un lugar de la Mancha de cuyo nombre no quiero acordarme...
o
openssl enc -des-ede3-ofb -d -a -in des-ede3.ofb.cif -out texto_desc.txt
enter des-ede3-ofb decryption password:
4) cat texto_desc.txt
En un lugar de la Mancha de cuyo nombre no quiero acordarme...
Se puede verificar que de las dos formas se puede descifrar correctamente el fichero cifrado.
AES - 192 - CFB
En este ejemplo usaremos AES de 192 bits para cifrar con modo CFB, lo que resultará en un cifrado de flujo.
- Paso 1
Se va a cifrar el texto.txt usando -pass: file:filename. El filename corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt".
openssl enc -aes-192-cfb -p -pbkdf2 -md sha1 -pass file:passwd.txt -in texto.txt -out aes_192_cfb.cif
salt=B80C38A686E22ABF key=2D638C6CA5092F3313EB4E8F3CF45790D1F3298F66068151 iv =B1E385CBD9DA80579F6FB37F5528C8BB
Se puede observar que el tamaño de la clave es mayor (48 caracteres hexadecimales), mientras que el vector de inicialización se mantiene constante en los 32 caracteres hexadecimales (128 bits) del tamaño de bloque, que es el mismo para los tres tamaños de clave de AES.
- Paso 2
Para descifrar se haría de la misma manera que en el paso 1, colocando la opción "-d" y permutando los valores de las opciones "-in" y "-out".
AES - 256 - CTR
En este ejemplo usaremos AES de 256 bits para cifrar con modo CTR, lo que resultará en un cifrado de flujo.
- Paso 1
Cifraremos el fichero texto.txt usando -pass: file:filename. El filename corresponde con el archivo que contiene la contraseña, en este ejemplo el fichero se llamará "passwd.txt". Además, se introducirá la opción "-pbkdf2" para emplear la derivación de clave más potente.
openssl enc -aes-256-ctr -a -pbkdf2 -pass file:passwd.txt -in texto.txt -out aes_256_ctr.cif
- Paso 2
Para verificar que se ha cifrado el fichero correctamente se muestra el contenido del fichero de salida por la terminal:
cat aes_256_ctr.cif
U2FsdGVkX1+QVMdAUpGCvAwjUuRa5GuxggUJ4DFQB1RY9LcjP6RJnQJ+zvNcKidr jPcbam7ESyfQqa9JRg/uL/F3KZvx7OFHThJwLNt9
- Paso 3
Para descifrar, podemos ejecutar el siguiente comando (que no tiene la opción -pass file:passwd.txt) y posteriormente introducimos la contraseña contenida en dicho fichero:
openssl enc -aes-256-ctr -d -a -pbkdf2 -in aes_256_ctr.cif -out texto_des.txt
enter aes-256-ctr decryption password:
- Paso 4
Al realizar un cat del fichero de salida se podrá leer el texto original.
cat texto_des.txt
En un lugar de la Mancha de cuyo nombre no quiero acordarme...
Criptografía Asimétrica
Introducción
En este apartado hablaremos de los distintos algoritmos de criptografía asimétrica más importantes, explicando sus conceptos básicos y posteriormente, en los siguientes apartados se realizarán las operaciones correspondientes con cada uno de ellos.
Primero hablaremos del algoritmo RSA(Rivest, Shamir y Adleman), que es un sistema criptográfico de clave pública desarrollado en 1979. Es el primer y más utilizado algoritmo de este tipo y es válido tanto para cifrar como para firmar digitalmente. RSA se basa en la dificultad para factorizar grandes números. Las claves pública y privada se calculan a partir de un número que se obtiene como producto de dos primos grandes. [27][28] Las claves RSA son normalmente de entre 1024-8192 bits de longitud, siendo el tamaño más usado actualmente de 2048 ó 4096 bits de longitud.
Otro algoritmo que pertenece a la criptografía asimétrica es el DSA (Digital Signature Algorithm), un estándar del Gobierno Federal de los Estados Unidos de América o FIPS para firmas digitales. DSA se hizo público el 30 de agosto de 1991, este algoritmo como su nombre lo indica, sirve para firmar y no para cifrar información. Una desventaja de este algoritmo es que requiere mucho más tiempo de cómputo que RSA. [29] Además, los mensajes están firmados por la clave privada del firmante y las firmas son verificadas por la clave pública correspondiente del firmante . La firma digital proporciona autenticación de mensajes , integridad y no repudio . [30]
También tenemos el algoritmo DH (Diffie-Hellman), un protocolo de establecimiento de claves entre partes que no han tenido contacto previo, utilizando un canal inseguro. El sistema se basa en la idea de que dos interlocutores pueden generar conjuntamente una clave compartida sin que un intruso, que esté escuchando las comunicaciones, pueda llegar a obtenerla. Para ello se eligen dos números públicos y, cada interlocutor, un número secreto. Usando una fórmula matemática, que incluye la exponenciación, cada interlocutor hace una serie de operaciones con los dos números públicos y su número secreto. A continuación los interlocutores se intercambian los resultados de forma pública. En teoría revertir esta función es tan difícil como calcular un logaritmo discreto. [31]
La criptografía de curva elíptica (ECC) es una aproximación a la criptografía de clave pública basada en la estructura algebraica de las curvas elípticas sobre campos finitos. El principal beneficio prometido por la criptografía de curva elíptica es un tamaño de clave más pequeño, donde un grupo de curva elíptica podría proporcionar el mismo nivel de seguridad que ofrece un sistema basado en RSA con un módulo grande y una clave correspondientemente mayor como por ejemplo, una clave pública de curva elíptica de 256 bits debería proporcionar una seguridad comparable a una clave pública RSA de 3072 bits. [32]
Por un lado existe una modificación del algoritmo DSA, llamada ECDSA (Elliptic Curve Digital Signature Algorithm), que emplea operaciones sobre puntos de curvas elípticas en lugar de las exponenciaciones que usa DSA. La principal ventaja de este esquema es que requiere números de tamaños menores para brindar la misma seguridad que DSA o RSA.[33]
Por otro lado, también existe una modificación del algoritmo DH, ECDH (Elliptic-curve Diffie–Hellman), un protocolo de acuerdo de clave anónimo que permite a dos partes, cada una con un par de clave pública-privada de curva elíptica, establecer un secreto compartido sobre un canal inseguro. Dicho secreto, es un dato conocido solo por las partes involucradas, que puede ser una contraseña. [34] [35]
Como en todo sistema de clave pública, cada usuario posee dos claves de cifrado: una pública y otra privada. Cuando se quiere enviar un mensaje, el emisor busca la clave pública del receptor, cifra su mensaje con esa clave, y una vez que el mensaje cifrado llega al receptor, este se ocupa de descifrarlo usando su clave privada.
Generación de Claves Asimétricas
Antes de nada, hay que tener claro que comandos son los más importantes y actualizados para realizar las operaciones correspondientes a cada algoritmos.
genpkey
El comando genpkey genera una clave privada.
- -genparam
Genera un conjunto de parámetros en lugar de una clave privada. Si se utiliza, esta opción debe preceder a cualquier opción de algoritmo (-algorithm alg).
- -paramfile filename
Algunos algoritmos de clave pública generan una clave privada basada en un conjunto de parámetros como por ejemplo . Se pueden suministrar utilizando esta opción.
- -pkeyopt opt value
Con este comando se puede especificar el número de bits de clave pública que se va generar usando un determinado algoritmo.
- -algorithm alg
Algoritmo de clave pública para usar como RSA, DSA o DH. Si se usa esta opción debe preceder a cualquier opción -pkeyopt.
- -outform DER | PEM
Especifica el formato de salida DER o PEM. El formato predeterminado es PEM.
- -out filename
Archivo de salida generado.
pkey
Se utiliza para la manipulación tanto de claves públicas como privadas. Por ejemplo, para extraer la clave pública de la clave privada.
- -inform DER|PEM
Esto especifica el formato de entrada DER o PEM. El formato predeterminado es PEM.
- -outform DER|PEM
Esto especifica el formato de salida.
- -in filename
Esto especifica el nombre del archivo de entrada.
- -out filename
Esto especifica el nombre del archivo de salida para escribir una clave
- -pubin
Por defecto, se lee una clave privada del archivo de entrada: con esta opción, se lee una clave pública en su lugar.
- -pubout
De forma predeterminada, se genera una clave privada: con esta opción, se generará una clave pública en su lugar.
pkeyutl
Se usa para realizar operaciones de clave pública utilizando cualquier algoritmo compatible.
- -in filename
Especifica el nombre del archivo de entrada
- -out filename
Especifica el nombre del archivo de salida
- -inkey file
Archivo que por defecto debería ser una clave privada.
- -pubin
El archivo de entrada es una clave pública.
- -sigfile file
Archivo de firma, requerido solo para verificar operaciones.
- -sign
Firma el fichero de entrada. Se requiere de una clave privada.
- -encrypt
Cifra los datos de entrada.
- -decrypt
Descifra los datos de entrada
- -derive
Deriva un secreto compartido usando un par de claves.
- -peerkey file
El archivo donde se encuentra la clave pública del otro usuario, utilizado por las operaciones de derivación de claves.
- -verify
Verifica los datos de entrada (que deben ser un hash) comparándolos con el archivo de firma e indica si la verificación se realizó correctamente o no.
- -pkeyopt opt value
Opciones de clave pública especificadas.
genrsa
Comando para generar una clave privada RSA. Este comando queda obsoleto y se utiliza "genpkey".
rsa
Se utiliza para la manipulación de claves RSA. Este comando queda obsoleto y se utiliza "pkey".
dsaparam
Se utiliza para manipular o generar archivos de parámetros DSA. Este comando queda obsoleto y se utiliza "genpkey -genparam".
A partir de estos comandos, podremos comenzar a realizar ejemplos con los diferentes algoritmos nombrados anteriormente.
RSA
En este ejemplo, se generará un par de claves asimétricas RSA de 2048 bits.
- Paso 1
Se crea el par de claves (pública y privada) en un fichero que se llamará "privadoRSA.pem" cifrado con AES256. Además, estará en formato PEM (formato de archivo empleado para almacenar certificados digitales).
openssl genpkey -algorithm RSA -aes256 -out privadoRSA.pem -pkeyopt rsa_keygen_bits:2048
.............................................................................................................+++++ .......................................................................+++++ Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
Nota: Otra manera de generar un par de claves RSA sería la siguiente (obsoleto):
openssl genrsa -aes256 -out privadoRSA.pem 2048
- Paso 2
Para ver el contenido del fichero creado que contiene la clave privada se realiza un "cat".
cat privadoRSA.pem
-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIzgqJ6uIcHCUCAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAqkESJ+5bfHBdYvwTZFGW3BIIE 0LskJiiJAihpTJCsEOPKMqTh6r+XyNQTAoVtkKQ31d63dbe2vpIP7RfCNYNCcDRQ Vyqpt/YN83ltkQ46tuh68NzyT2oUa/LS5I34xj9ABI7CLD2XqQWZ6kTPakgRYaKb WwEV0WhXCFLkiX+kAHWX+LcfR9s/DyCRpNzxwBjJAvysolhWx0gBjc0R5aEOtQqt E5ErEcsYX+iPJUMIEVtrKy3PIB9doqGlSG45ZFC8NSu8tDizrBvVicbnT/2jsJb5 IThcfIEQZp9X31tRN/OmnxARhNtRn2YW+9/dTBOlLXPJ/Ikdm0kx6JHMbfw/hH8S +3HP7p5W5wGe6xwhAb1soD3ZPXDpu76zTLmv4IoXu2kuamNNNGUqpDDG3OT54QsR dtBn8jUhR+niWB2uBGSZ902+Ru+VY0M42SjVYAb83EoAB86HyG6XAKmJRBmzXZfh Qmk8svfC1n6+7vv5MUaqTTRsqeTwGu4jenOTEVjHUyKQamMak4F83oV/4wFsuK5V y7VfVv3DkCy9/CJVdmS3ZHc4V5D741VLc8keNKhH17rShbNHE+lFlrLzA7YwRdw4 lpEbaoLxzjz/yB2LKjoWRbngpxcB7/qz1NkObm3S2ROWcRDi5hNHEc0ctlT0kuXi KSG6Sqlald9bast1zmMpIpvvfKVG3moq2umVR1B2JhwYRmdKEsJ7NjioI7pmuZc4 fr485I1SDBGjhSmsQAdUq5b7aljCbgrSLjHYFVxWLOutfhE1P3E7sgiUWlQmvZWP qLygQUFBKE9Q/WjRR3cN4WOFDIE3wVpE8uejkDy++pbGV2xb7mQG+77S3lWvtdDp 5Zu4qDl0daZjAP6W/636aBqiQbGvFM1Ch0+UNyYie9vh7zjX5K3viGiUHW1yb9+o QQfpgIIODz7X3bk6kQBS5j+xDAx+oKAw0sxlTGqp5hX6nPP9/LI7XeCeWQdAV/ls G5q8UjVDKyKjBQUWftnRDpoUnCOSTschFifktDInHrSaVetaWn5yFs/cx+DAE2xa wRJn6k8gXhk72ytTqd64BLw3evZMPnaldEhMGle44ZYf7cebL8RhKDEgoT99DLKU 1TIiOzsMz+nzkI0t8U6nsF+pEpWuOjPP4lPSOqhAbwGMIdTgvtWSmLBJzdQ0uP85 Vo6Gez8mgjcFh39VGuq2WmkY6hkmiodpv2IjFBUAkC4vrGh1E/NQGIBWj/5HwDiy iA+gw/mQts2eDQw00UbpCAXDuxIsmLwc5HI/gmiXxx82H1ZtGxljrut3vMotukKf 4gr+T4umvvEl/3/uGGEMT/WQySoso/47JS9tPiogA6D+GFJ2AZA1XsPuvuZ/WPWI RbUlgOrVbq4a+7LBC/tzC28hSDF+VRdAT3FoiS2HXXFJYrCMCjmTFz3YTnKc6U/k k1rfuoMLnFMimy+tR14zMuH6Dxu+SDFj862cZeMrQOAaplnGpxDiO37u8CKXaQJ7 JpiK5n2mrkSZ6RHM4m5VZeSJNSTtxJbs/3kaJZQLJ1e2wufD3Rzy05VKdQSyFjU9 J+D3spLNvz72gAvZJGLdP5BT/uIfAI40vvNx5csei9kqTQ2QLoL5bpvmV+d4uz6D 1RNVIYJ4cAkg5AjRpP6kGWHGCx1GTc0MD34mCwNNW/ll -----END ENCRYPTED PRIVATE KEY-----
- Paso 3
Se extrae la clave pública del fichero "privadoRSA.pem", esta clave es la que se distribuye a las personas o entidades. Cuando la otra parte quiera enviar un mensaje, lo cifrará con esta clave para que posteriormente el destinatario lo descifre con su clave privada. La clave pública la contendrá el fichero "publicaRSA.pem" y para su extracción se usará "-pubout".
openssl pkey -in privadoRSA.pem -pubout -out publicaRSA.pem
Enter pass phrase for privadoRSA.pem:
La contraseña es la misma con la que se protegió la clave privada.
Nota: Otra manera de generar extraer la clave pública sería la siguiente (obsoleto):
openssl rsa -in privadoRSA.pem -pubout -out publicaRSA.pem
- Paso 4
Para ver el contenido del fichero creado que contiene la clave pública se realiza un "cat".
cat publicaRSA.pem
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXck+2msWq8LEhX/AwJB 7hIZvW+QwpODVU5RkfFEk+8L2IPK+BWM6gMZO6HfQqn8yjkjAHTEY/RlBSGaCX1V AA5V3RQs4SBbcQAFo0tBpqhTUw36Se9sozaxnN4kObTZxvFmzX3BqtKzbZP33/og RgKELBpe43GTDkhQtfWpCzGQRiGodFBLBPQ7HibdKB+RK/3wTftUOgriabb5HSdI 9ySyrkvykEheRHgFe6XUo6gU3BWA1h276wXqdw2TiJ+VR/GX8tzXGV1RSthxqNpW 2/EpGOV12vRz9MnTEdt2Rfmx9x3VzMrxjiXSK97xpWXlqmoRCj+cdb1xvD05vVcG MwIDAQAB -----END PUBLIC KEY-----
DSA
En este ejemplo, se generará un par de claves asimétricas DSA de 2048 bits.
- Paso 1
Se genera el fichero que contendrá los parámetros DSA en dsa.params.pem usando"-genparam". Además se añade "-pkeyopt"para especificar el tamaño en bits (2048).
openssl genpkey -genparam -algorithm DSA -out dsa.params.pem \
> -pkeyopt dsa_paramgen_bits:2048
.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++* ...............+...........+......+............+.........+.......... ...........+..+...............+...............................+..... ....+....+.......+.+............................+.............+..+.. +............+.......................+.....+..............+......+.. ..+.+..........+......+...................+..+.+....+...+........... .................................................+............+..... +..+..................................+.......+.+..+..............+. .+.......+.............+...........+......+...........+..+....+..... ......+.....+.........+.................+...+......+............... ............+....+............+.........+.+.+........+.......+....+. .......+.................................+.+......+..+...+....+...... ...+.+.+..+........+......+.............+...........+.+..+.+......... .........+.....+...+......+..........+..+...............+.......+.+. ...+......+..........................................+............+. .............+...............+.............+.......+................. ...+....+......+.+...+.....+.+.........+....................+........ .............+.........+.......+...+.................++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++*
Nota: Otra manera de generar los parámetros DSA sería la siguiente (obsoleto):
openssl dsaparam -outform PEM -out dsa.params.pem 2048
- Paso 2
Para ver el contenido del fichero creado se ejecuta un "cat".
cat dsa.params.pem
-----BEGIN DSA PARAMETERS----- MIICIAKCAQEAhRIR6kI6+G+0+ruDK8v0BfYLAtBmm5nIePn4hJzUTTgTzXPjJKg0 Q/oJciPw3/guyXIEHZD/JDBoiBM1VByGwyes9L9JeHWnP3u0lhoyeIGlYchSKu/X mW5c0vvVa6TMWTH+Y9oVzS8f0iRLiSzZCytsAz54TP87uGt231Pwvh2XyotYOh6U lQB7m0DiocDtFjVmi5v0ZdclxN9/1bwEz3q/CtwqfNP5uBCzuR2h2Om0Vo1ctAr4 1U0E8oXRmW7jVTdSej4MQ1VqPNv9xs7gZRpCIV/3XWJP0g4PPAHSFv5+xiVOrpFB UW7bjoP+BEH880G7JxnV3Q+U1SYuFEmGqwIVAMpBJ7V1B/jHAIAS2OpO+DiUHy+5 AoIBAGtACSNtaf2mzdVHLU0+D/LeM7cjisGtHwR7ZBmsd9WJ7xMOS6s0B8rgCWXq 5bIgtJZBYkZUG+sxyoLAe7t2lwCNsl0jfJ13ZVU+WWPzHGo5JXayTLYFCHDWGdKG 8ioKSBjsJv3qgxoUNw1Cp/4u3oA/0YpUUOTIgWCzLLsKWE5sPMZJA5uC60pZHdU9 U42+8sLkIxxlFO/FgOWIotMrULfFQhpxCbUvAllP9wKsW6sJuN+QMUrBtLITBJGc f+x8/oQ57mNcUpO8j/LMwjxM17BkqAPsFgbxO+DP5mVzLKk2/rzLOe9afiyW+H5E XCRUWsKwuCbNW283UHMLgcBdsZg= -----END DSA PARAMETERS-----
- Paso 3
Generamos la clave privada a partir del fichero "dsa.params.pem" cifrado con AES256. Se deberá introducir una contraseña con la que protegeremos la clave.
openssl genpkey -aes256 -paramfile dsa.params.pem -out private.pem
Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
Nota: Otra manera de generar la clave privada a partir del fichero de parámetros DSA sería la siguiente (obsoleto):
openssl gendsa -aes256 -out private.pem dsa.params.pem
- Paso 4
Para ver el contenido del fichero creado que contiene la clave privada se realiza un "cat".
cat private.pem
-----BEGIN ENCRYPTED PRIVATE KEY----- MIICvTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQISAJFHx6O9lwCAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBC6Kp0K/WzT6fuRnEPpFTSSBIIC YDE9CRb36TVvxQ1LD8yV7u8Y+5jUQ+cpTn8m7TXogA3umuQ0/Q8qmp0LLOhMEhgT ngcapbOqzYzzeAYhaRD0XNJh4D0B8WydbX2LI62b8mhM8SAtemkrFfqmf6+atuHD nbojPMuvJu3/iaNw2OUDm508Zu4ZeRz+iwJMrlMnJx1yFfwBWWsNAIM/j4E7ansl YLYtS/Kz8YjLALX+mLLcMrl7YjdojoDxpY6pP+47nsiyErdt1CRa44qEx69OUT4E yhZXhHG711VemJi2ktskMP3K3bzkUXGNco/RK9Tx/sENuqE65FBumKBKp4pNWYv4 YCMh7eIGvcwL/xsrrkEY/dRept4BHnCZ2ZrqQsuvK6aZIxJ864PwTKNIpSQ2RDDc GJu5S4z94YrZGLtY3UU1l+D7ExpERuO8cBuzaotPQjQbmxNvN0/3/NqAC7BNlMh0 LyQE3Ph2W4IkfdX5dg3CNitcHFFCT/wIS4xqUNJk5MZ5GBB8dVzzOHrpzXq3LZ6t 1PlzCyECyK6g6Yk6fbjvO7rya2wkYsGfoeqmkwAx9pWxfiRQGPwWmqTm2nk4TTWg SNKlxCdBMUUt/c5CXgL3+3TNK2H4yY5/UQlMF19RN47lLHsS4rWkKaHg+NSO+CB0 5EeH26xu4zFmlLkuKsTjvoV0T1LGqVb/3jxcy+gzO1BTi/FP6WnRuY9OrECHvWs6 MeJY3kI6/Tth/Ze274LiwJAxMlAhNWtA/1WtnZHhKol9WnbQOLV5oNCXK4fMwhbu fBqcEZcWR6fBT956IY3TKpnDccGcBv3k2bFY5A3NoKdm -----END ENCRYPTED PRIVATE KEY-----
- Paso 5
Extraemos la clave pública a partir del fichero "private.pem"
openssl pkey -in private.pem -pubout -out public.pem
Enter pass phrase for private.pem:
La contraseña que hay que introducir es la misma con la que se protegió la clave privada.
Nota: otra forma de extraer la clave pública a partir de la privada es la siguiente (obsoleto):
openssl dsa -in private.pem -outform PEM -out public.pem -pubout
- Paso 6
Para ver el contenido de la clave pública hacemos un "cat".
cat public.pem
-----BEGIN PUBLIC KEY----- MIIDOjCCAi0GByqGSM44BAEwggIgAoIBAQCFEhHqQjr4b7T6u4Mry/QF9gsC0Gab mch4+fiEnNRNOBPNc+MkqDRD+glyI/Df+C7JcgQdkP8kMGiIEzVUHIbDJ6z0v0l4 dac/e7SWGjJ4gaVhyFIq79eZblzS+9VrpMxZMf5j2hXNLx/SJEuJLNkLK2wDPnhM /zu4a3bfU/C+HZfKi1g6HpSVAHubQOKhwO0WNWaLm/Rl1yXE33/VvATPer8K3Cp8 0/m4ELO5HaHY6bRWjVy0CvjVTQTyhdGZbuNVN1J6PgxDVWo82/3GzuBlGkIhX/dd Yk/SDg88AdIW/n7GJU6ukUFRbtuOg/4EQfzzQbsnGdXdD5TVJi4USYarAhUAykEn tXUH+McAgBLY6k74OJQfL7kCggEAa0AJI21p/abN1UctTT4P8t4ztyOKwa0fBHtk Gax31YnvEw5LqzQHyuAJZerlsiC0lkFiRlQb6zHKgsB7u3aXAI2yXSN8nXdlVT5Z Y/McajkldrJMtgUIcNYZ0obyKgpIGOwm/eqDGhQ3DUKn/i7egD/RilRQ5MiBYLMs uwpYTmw8xkkDm4LrSlkd1T1Tjb7ywuQjHGUU78WA5Yii0ytQt8VCGnEJtS8CWU/3 Aqxbqwm435AxSsG0shMEkZx/7Hz+hDnuY1xSk7yP8szCPEzXsGSoA+wWBvE74M/m ZXMsqTb+vMs571p+LJb4fkRcJFRawrC4Js1bbzdQcwuBwF2xmAOCAQUAAoIBACzq kTPSyHX1OXML7HLdSTBkQtIvjl0OoMLYdD21dCgPSVygzPmqyEWAoUGdp5AY5isY eTtwocGLWFLk20qqJ8PfQ6WAp2YswxLS8dZhWPbGM4g3z2mquDX4/nOHOXL8y5f/ ME2JiUCeleuh3uZXLIP9tGXV0MpmyKWow9mAHmfdsIft5eQqMD+0fPtY3kZXRw9S cwhvXnMpeoa2hZt7s5rm1n8Q0eGozEACjdmil+NSNbXHDsbsgYQUwfRy2+9j6DnP Vh3Az6x9jR/zzKekuXPhGQCNNshLgRdmuSJTiHoEK2H5Z7XczL4M0xFylrcS5A72 /p+j4tQ/DoR/P6INFIk= -----END PUBLIC KEY-----
DH (Diffie-Hellman)
En este ejemplo, se generará un par de claves asimétricas DH.
- Paso 1
Generamos un conjunto de parámetros DH:
openssl genpkey -genparam -algorithm DH -out dh.params.pem
..............+...............+..............................+............. ..................................................+................+....... ....................................................+...................... ......................................+..................+......+.......... .....................................................+..................... ....+.....................+.........................+......+............... ..........+........+..................++*++*++*++*++*
- Paso 2
Para ver el contenido del fichero creado se ejecuta un "cat".
cat dh.params.pem
-----BEGIN DH PARAMETERS----- MIGHAoGBAPAPLs7hB1hTlQEbANW7EG4+jGJ5MtjcOA3Q5heR6m7T5r9QXaetH7cK 9reMSDJAFBFPqlc36ogzIaxOHYhGy3wmsBPYKbKO1Ljld/5XmAJLwp+OaT5gmmmI OJ0UPl2cUv4rzaZGXxQcMEwy/2aQgpTSpBjpoBuNmJPEiPLoPi57AgEC -----END DH PARAMETERS-----
- Paso 3
Generamos la clave privada a partir del fichero "dh.params.pem" cifrado con AES256. Se deberá introducir una contraseña con la que protegeremos la clave.
openssl genpkey -aes256 -paramfile dh.params.pem -out privateDH.pem
Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
- Paso 4
Para ver el contenido del fichero creado que contiene la clave privada se realiza un "cat".
cat privateDH.pem
-----BEGIN ENCRYPTED PRIVATE KEY----- MIIBjTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIWxTxGZ6e1EACAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAGMSzeSmksb4V8alSUWSN6BIIB MM655NUrf1fLjSlSi69/yGcFISKA73OaGXO8JrFfvDi95Ig/Yf18BO+otT0iKMvX dQav/XEfyBofeJERZiILq9A7uzJ9sWAPZcrLiyqTQQP6hPhGEr8s7l05ExWg0rtX TGXZfqVWTyzBOEuJ56GVdEcg2NYZv0sBpnrnP+LoJugl7oKhMP97MEChusSu6UQ+ 7vGaFkPOI9hQ4OxY5PfmylhYYfGwVF2oBI4hnzKJq4B81KrG+axo2MDOhWBpHD/z zVIzTfYLCNiG+5hKXt4e7wT/CBxUUGXfxpjcP/OJN+wwUe7uRtrRMsWagJYEh1KC 2APuyIrGagPWx02lrunSaAad6feGvx1g/q3LzqCEiDGoc5pnuTf0SI2gGHEnlV0T tF30hVobMvlzaqx5gdDnX14= -----END ENCRYPTED PRIVATE KEY-----
- Paso 5
Extraemos la clave pública a partir del fichero "privateDH.pem"
openssl pkey -in privateDH.pem -pubout -out publicDH.pem
Enter pass phrase for privateDH.pem:
La contraseña que hay que introducir es la misma con la que se protegió la clave privada.
- Paso 6
Para ver el contenido de la clave pública hacemos un "cat".
cat public.pem
-----BEGIN PUBLIC KEY----- MIIBHzCBlQYJKoZIhvcNAQMBMIGHAoGBAPAPLs7hB1hTlQEbANW7EG4+jGJ5Mtjc OA3Q5heR6m7T5r9QXaetH7cK9reMSDJAFBFPqlc36ogzIaxOHYhGy3wmsBPYKbKO 1Ljld/5XmAJLwp+OaT5gmmmIOJ0UPl2cUv4rzaZGXxQcMEwy/2aQgpTSpBjpoBuN mJPEiPLoPi57AgECA4GEAAKBgDsIgvkf1EAotwaUC7MtPhcExAy4w8xtXNfr1gIm I4HJ5zUe3RIUEO5jZDIZcs1HjAB1LF8YHEcZ7rnCCHIABTW5faohD9juR4XYhOhn 1VfVeyPSjd4Wet5WgfWUX30S2IHS0her/pakV63GsQ5qGbrUUziFFLS2vubzeaWM 3pIZ -----END PUBLIC KEY-----
EC (Elliptic curve) [36]
OpenSSL proporciona dos potentes herramientas de línea de comando para trabajar con claves adecuadas para algoritmos de curva elíptica (EC):
openssl ecparam openssl ec
Los únicos algoritmos de curva elíptica que actualmente soporta OpenSSL son Elliptic Curve Diffie Hellman (ECDH) para el acuerdo de clave y el algoritmo de firma digital de curva elíptica (ECDSA) para la firma / verificación.
Formatos de archivo de clave privada EC
Por defecto, OpenSSL funcionará con archivos PEM para almacenar claves privadas de EC. Estos son archivos de texto que contienen datos codificados en base 64. Un archivo con la extensión ".pem" tendrá un aspecto similar a:
-----BEGIN EC PRIVATE KEY----- MIIBIAIBAQQYd8yhaE899FaH3sw8aD4F/vtpMVBLfVqmoIHKMIHHAgEBMCQGByqG SM49AQECGQD////////////////////+//////////8wSwQY//////////////// /////v/////////8BBgiEj3COVoFyqdCPa7MyUdgp9RiJWvVaRYDFQDEaWhENd6z eMS2XKlZHipXYwWaLgQxBH0pd4EAxlodoXg3FliNziuLSu6OIo8YljipDyJjczcz S0nctmptyPmXisp2SKlDsAIZAP///////////////3pi0DHIP0KU9kDsEwIBAaE0 AzIABBsl8ZSGJqcUpVoP8zekF92DGqDBMERcHhCXmgPXchP+ljybXbzYKINgxbp5 0g9/pw== -----END EC PRIVATE KEY-----
O si el arvhivo está cifrado tendrá un aspecto similar a:
-----BEGIN EC PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,258248872DB25390 JIzhns0nRb+pj6RONAijJli8Rhu2bIrw8D+ruHEWL1IEH6Q5tvzqAI2PDYXbSzCn 24JPWx9khmTu6ijerANNYYk0p2Pjxr12MAYpqgtXbRrXLF4AIomzYWq16BH7Y63o zvqWMBJO6tQ5RHPLM2FmweyPB/XSL7KvLTe+g6pz/W9wf52CyQ/VeK+yBXqEi7QF 0f9EKRlePRLAUcQPD4nkckcywX6Nz+TW/SOKt38YytM9MyQsAfcxu7u0nl/dLylk n57qUm3nk0z0moYJbfLx59eP0/go8VjeP2fRKkgz1DOM7VkmtPrC7vnyRpKsnP2S 6n6uacerkNXTmUcz7mTCGGfrsBeACJeX1gwinDZVwkzDxNKhLXOlFFAMWE+SeiFp kDny2v3D8sU= -----END EC PRIVATE KEY-----
También puede encontrar claves privadas de formato PKCS8 (procesa las claves privadas en formato PKCS#8) en archivos PEM. Los archivos de clave privada PKCS8, como los anteriores, pueden contener muchos tipos diferentes de clave privada, no solo claves EC.
Se puede pasar de un formato a otro si lo desea. Todos los comandos de conversión pueden leer las formas cifradas o no cifradas de los archivos, sin embargo, se debe especificar si desea que la salida esté cifrada o no. Para convertir un archivo PKCS8 a un formato EC cifrado tradicional use:
openssl ec -aes-128-cbc -in p8file.pem -out tradfile.pem
El primer argumento se puede reemplazar por "aes-128-cbc" con cualquier otro nombre de cifrado válido openssl. Para convertir un archivo PKCS8 a un formato EC sin cifrar tradicional, simplemente omitimos el primer argumento:
openssl ec -in p8file.pem -out tradfile.pem
O para convertir de un formato EC tradicional a un formato PKCS8 cifrado hacemos lo siguiente:
openssl pkcs8 -topk8 -in tradfile.pem -out p8file.pem
O para un formato PKCS8 no cifrado hacemos lo siguiente:
openssl pkcs8 -topk8 -nocrypt -in tradfile.pem -out p8file.pem
Tener en cuenta que, de manera predeterminada (extensión ".pem"), los archivos de clave privada de EC no están cifrados (debe declarar explícitamente que el archivo debe estar cifrado y qué cifrado usar), mientras que para los archivos PKCS8 ocurre lo contrario. El valor predeterminado es cifrar: se debe indicar explícitamente que no desea que se aplique el cifrado, utilizando la opción "-nocrypt".
Además del formato PEM, todos los tipos de archivos de claves anteriores también se pueden almacenar en formato DER. Este es un formato binario y, por lo tanto, no es directamente legible para humanos, a diferencia de un archivo PEM. Un archivo PEM contiene datos DER codificados utilizando reglas de codificación base 64 con un encabezado y un pie de página agregados. A menudo es más conveniente trabajar con archivos PEM por este motivo.
Los comandos de openssl suelen tener las opciones "-inform DER" o "-outform DER" para especificar que el archivo de entrada o salida es DER respectivamente. Entonces, por ejemplo, el comando para convertir un archivo PKCS8 a un formato EC cifrado tradicional en DER se hace lo mismo que antes, pero añadiendo "-outform DER":
openssl ec -in p8file.pem -outform DER -out tradfile.der
Tenga en cuenta que no puede cifrar un formato tradicional de clave privada de EC en formato DER (y, de hecho, si intenta hacerlo, el argumento se ignorará silenciosamente). De igual forma esto no ocurre para los archivos PKCS8, pueden estar cifrados incluso en formato DER. Así, en el siguiente ejemplo se convertirá un archivo de clave de formato tradicional en un formato PKCS8 cifrado y a su vez, en formato DER.
openssl pkcs8 -topk8 -in tradfile.pem -outform DER -out p8file.der
Formatos de archivo de clave pública EC
Las claves públicas de EC también se almacenan en archivos PEM. Una clave pública típica de la EC tiene el siguiente aspecto:
-----BEGIN PUBLIC KEY----- MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQMDMgAE+Y+qPqI3geo2hQH8eK7Rn+YWG09T ejZ5QFoj9fmxFrUyYhFap6XmTdJtEi8myBmW -----END PUBLIC KEY-----
Este formato se utiliza para almacenar todos los tipos de claves públicas en OpenSSL, no solo las claves EC.
Es posible crear un archivo de clave pública a partir de un archivo de clave privada, aunque no al revés:
openssl ec -in ecprivkey.pem -pubout -out ecpubkey.pem
Como se dijo en el apartado anterior, una versión codificada en DER puede crearse usando "-outform DER":
openssl ec -in ecprivkey.pem -pubout -outform DER -out ecpubkey.der
Generando claves y parámetros de EC
Un archivo de parámetros de EC contiene toda la información necesaria para definir una curva elíptica que luego se puede usar para operaciones criptográficas (es decir, para ECDH y ECDSA). OpenSSL contiene un gran conjunto de curvas predefinidas que se pueden usar. La lista completa de curvas incorporadas se puede obtener a través del siguiente comando:
openssl ecparam -list_curves
Un archivo de parámetros EC se puede generar para cualquiera de las curvas con nombre incorporadas de la siguiente manera:
openssl ecparam -name secp256k1 -out secp256k1.pem
Se puede reemplazar secp256k1 por cualquier curva de la lista.
Las claves se pueden generar desde el comando ecparam, ya sea a través de un archivo de parámetros preexistentes o directamente seleccionando el nombre de la curva. Para generar un par de claves privadas / públicas a partir de un archivo de parámetros preexistente use lo siguiente:
openssl ecparam -in secp256k1.pem -genkey -noout -out secp256k1-key.pem
O para hacer la operación equivalente sin un archivo de parámetros, use lo siguiente:
openssl ecparam -name secp256k1 -genkey -noout -out secp256k1-key.pem
La información sobre los parámetros que se han utilizado para generar la clave se incrusta en el propio archivo de clave.
De forma predeterminada, al crear un archivo de parámetros o al generar una clave, openssl solo almacenará el nombre de la curva en los parámetros generados o el archivo de clave:
openssl ecparam -in secp256k1.pem -text -noout
Esto simplemente confirmará el nombre de la curva en el archivo de parámetros imprimiendo lo siguiente:
ASN1 OID: secp256k1
Si desea examinar los detalles específicos de los parámetros asociados a una curva con un nombre particular, se puede lograr de la siguiente manera:
openssl ecparam -in secp256k1.pem -text -param_enc explicit -noout
El comando anterior muestra los detalles de una curva desde un archivo, pero esto también se puede hacer directamente usando el argumento "-name" en lugar de "-in". La salida se verá similar a la siguiente:
Field Type: prime-field
Prime:
00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:fe:ff:
ff:fc:2f
A: 0
B: 7 (0x7)
Generator (uncompressed):
04:79:be:66:7e:f9:dc:bb:ac:55:a0:62:95:ce:87:
0b:07:02:9b:fc:db:2d:ce:28:d9:59:f2:81:5b:16:
f8:17:98:48:3a:da:77:26:a3:c4:65:5d:a4:fb:fc:
0e:11:08:a8:fd:17:b4:48:a6:85:54:19:9c:47:d0:
8f:fb:10:d4:b8
Order:
00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
ff:fe:ba:ae:dc:e6:af:48:a0:3b:bf:d2:5e:8c:d0:
36:41:41
Cofactor: 1 (0x1)
Se pueden generar parámetros y archivos de claves para incluir los parámetros explícitos completos en lugar de solo el nombre de la curva, si se desea. Esto podría ser importante si, por ejemplo, no todos los sistemas de destino conocen los detalles de la curva mencionada. En la versión 1.0.2 de OpenSSL, se han agregado nuevas curvas con nombre, como brainpool512t1. Intentar usar un archivo de parámetros o clave en versiones de OpenSSL menores a 1.0.2 con esta curva resultará en un error:
bash$ openssl ecparam -in brainpoolP512t1.pem -text -noout unable to load elliptic curve parameters 140138321110720:error:1009E077:elliptic curve routines:EC_ASN1_PKPARAMETERS2GROUP:ec group new by name failure:ec_asn1.c:1035: 140138321110720:error:1009107F:elliptic curve routines:d2i_ECPKParameters:pkparameters2group failure:ec_asn1.c:1080: 140138321110720:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:
Este problema puede evitarse si se usan parámetros explícitos en su lugar. Así que bajo OpenSSL 1.0.2 podría crear un archivo de parámetros como este:
openssl ecparam -name brainpoolP512t1 -out brainpoolP512t1.pem -param_enc explicit
Mirando el archivo de parámetros notará que ahora es mucho más largo:
-----BEGIN EC PARAMETERS----- MIIBogIBATBMBgcqhkjOPQEBAkEAqt2duNvpxIs/1OauM8n8B8swjbOzydIO1mOc ynAzCHF9TZsAm8ZoQq7NoSrmo4DmKIH/Ly2CxoUoqmBWWDpI8zCBhARAqt2duNvp xIs/1OauM8n8B8swjbOzydIO1mOcynAzCHF9TZsAm8ZoQq7NoSrmo4DmKIH/Ly2C xoUoqmBWWDpI8ARAfLu8+UQc+rduGJDkaITq4yH3DAvLSYFSeJdQS+w+NqYrzfoj BJdlQPZFAIXy2uFFwiVTtGV2NokYDqJXGGdCPgSBgQRkDs5cEniHF7nBugbLwqb+ uoWEJFjFbd6dsXWNOcAxPYK6UXNc2z6kmap3p9aUOmT3o/Jf4m8GtRuqJpb6kDXa W1NL1ZX1rw+iyJI3bISs4btOMBm3FjTAETEVnK4DzunZkyGEvu8ha9cd8trfhqYn MG7P+W27i6zhmLYeAPizMgJBAKrdnbjb6cSLP9TmrjPJ/AfLMI2zs8nSDtZjnMpw MwhwVT5cQUypJhlBhmEZf6wQRx2x04EIXdrdtYeWgpypAGkCAQE= -----END EC PARAMETERS-----
Los parámetros completos se incluyen, en lugar de solo el nombre. Esto ahora puede ser procesado por versiones de OpenSSL anteriores a 1.0.2. Así que bajo 1.0.1:
openssl ecparam -in brainpoolP512t1.pem -text -noout
Esto mostrará correctamente los parámetros, aunque esta versión de OpenSSL no conoce esta curva.
Lo mismo ocurre con los archivos de clave. Entonces para generar una clave con parámetros explícitos:
openssl ecparam -name brainpoolP512t1 -genkey -noout -out brainpoolP512t1-key.pem -param_enc explicit
Este archivo de claves ahora puede ser procesado por versiones de openssl que no conocen la curva de Brainpool.
Sin embargo, se debe tener en cuenta que una vez que los parámetros se han convertido del formato de nombre de curva a parámetros explícitos, no es posible volver a cambiarlos, es decir, no hay una utilidad para tomar un conjunto de parámetros explícitos y determinar a que curva está asociada.
Cifrado Asimétrico
RSA
Como sabemos, el cifrado asimétrico sólo se puede aplicar a "cosas pequeñas" como claves simétricas o resúmenes. Cualquier intento de cifrar con RSA un fichero normal, de más de 200 caracteres, producirá un error de tipo "input too long". El envío confidencial de ficheros normales exige el empleo de sistemas mixtos, en los que el fichero se cifra con una clave simétrica (o contraseña) y esa contraseña es cifrada mediante RSA con la clave pública del receptor y así es enviada a dicho receptor, junto con el fichero cifrado. Si además se desea verificar la integridad del envío, se añade un resumen firmado (que a su vez es un cifrado con clave privada del emisor) del fichero original.
Por tanto, desarrollamos un ejemplo en el que el emisor (Alice) envia a Bob el documento "texto.txt" cifrado en AES-256-CBC (texto.aes), el resumen SHA-256 del fichero original, cifrado con su propia clave RSA privada (firmaDoc.rsa) y la contraseña que usó para cifrar el documento, cifrada a su vez con la clave pública RSA de Bob (contraseña.cif). Antes de nada, emisor (Alice) y receptor (Bob) tendrán que haber intercambiado sus claves públicas (publicaAliceRSA.pem y publicaBobRSA.pem) y por supuesto, cada uno conserva su clave privada (privadaAliceRSA.pem y privadaBobRSA.pem).
- Tarea de Alice (emisor)
- Paso 1
- Alice cifra con clave simétrica (AES-256-CBC) el fichero "texto.txt" con una contraseña "prueba+12" y produce "texto.aes"
openssl enc -aes-256-cbc -pbkdf2 -in texto.txt -out texto.aes
- Paso 2
- Alice escribe la contraseña en el fichero "contraseña.txt", veamos el contenido este fichero:
prueba+12
- Paso 3
- Alice cifra de forma asimétrica el fichero contraseña.txt con la clave pública RSA de Bob (fichero publicaBobRSA.pem) y produce "contraseña.cif"
openssl pkeyutl -pubin -encrypt -in contraseña.txt -out contraseña.cif -inkey publicaBobRSA.pem
- Paso 4
- Alice firma con su clave privada RSA (privadaAliceRSA.pem) el resumen generado con SHA2-256 del fichero texto.txt y genera el fichero "firmaDoc.rsa". Lo más normal es que la clave privada de Alice esté cifrada y se le solicite la contraseña al ejecutar este comando.
openssl dgst -sha256 -sign privadaAliceRSA.pem -out firmaDoc.rsa texto.aes
A continuación, Alice envía a Bob los tres ficheros: texto.aes, contraseña.cif y firmaDoc.rsa
- Tarea de Bob (receptor)
- Paso 1
Bob recibe el mensaje con los tres ficheros de Alice y procede a descifrar la contraseña enviada por Alice (contraseña.cif) con su clave privada (privadaBob.pem) en el fichero contraseña.txt. Si la clave privada de Bob estuviese cifrada (que es lo más normal), se le solicitará la contraseña que la protege.
openssl pkeyutl -decrypt -in contraseña.cif -out contraseña.txt -inkey privadoBobRSA.pem
Al hacer un cat al archivo de salida contraseña.txt, Bob ya conoce la contraseña que Alice usó para cifrar texto.aes:
prueba+12
- Paso 2
Una vez obtenida la contraseña de cifrado simétrica "prueba +12", Bob puede descifrar el "texto.aes" con dicha contraseña y obtener el documento original (texto.txt):
openssl enc -d -aes-256-cbc -pbkdf2 -in texto.aes -out texto.txt
- Paso 3
Bob verifica que el resumen SHA-256 del texto descifrado (texto.txt) coincide con el resumen firmado en firmaDoc.rsa. Como Alice firmó el resumen (es decir, lo cifró mediante RSA con su propia clave privada), Bob usa la clave pública de Alice (publicaAliceRSA.pem) para descifrarlo. Si la comprobación es correcta, la transmisión ha tenido CONFIDENCIALIDAD (el texto viajó cifrado con una clave simétrica que viajaba cifrada con RSA) y además INTEGRIDAD (el texto descifrado coincide con el que calculó Alice y envió firmado, es decir, cifrado con su clave privada RSA).
openssl dgst -sha256 -verify publicaAliceRSA.pem -signature firmaDoc.rsa texto.txt
Verified OK
Nota: Sabemos que OpenSSL ofrece alternativas para casi todos los comandos. Bob podría realizar este último paso generando el resumen SHA256 del fichero texto.txt en un fichero texto.sha y utilizando el comando "openssl pkeyutl" de la misma forma que se indica en el paso 3 del ejemplo siguiente, con los cambios oportunos.
Firmado y Comprobación de Resúmenes
En este apartado se realizará la firma y verificación del resumen de un fichero "texto.txt" (utilizaremos "SHA512") que se llamará "resumen.sha".
Antes de nada, utilizaremos el comando "pkeyutl" en el primer ejemplo, dicho comando se puede usar para realizar operaciones de clave pública utilizando cualquier algoritmo compatible.
DSA
- Paso 1
Realizamos el resumen del fichero "texto.txt" y lo guardamos en formato binario en el fichero de salida "resumen.sha".
openssl dgst -sha512 -binary -out resumen.sha texto.txt
- Paso 2
Firmamos el "resumen.sha" con el comando "pkeyutl"y usaremos la clave privada DSA generada anteriormente. En el caso de que se haya protegido la clave con una contraseña deberemos introducirla.
openssl pkeyutl -sign -in resumen.sha -inkey private.pem -out firma.dsa -pkeyopt digest:sha512
- Paso 3
Se procede a verificar que se ha firmado correctamente ejecutamos lo siguiente:
openssl pkeyutl -pubin -verify -in resumen.sha -sigfile firma.dsa -inkey public.pem
Signature Verified Successfully
Se observa que la firma ha sido exitosa.
RSA
- Paso 1
Creamos el resumen y lo firmamos en la misma línea introduciendo la contraseña que protege la clave RSA. En este caso usaremos el comando "dgst".
openssl dgst -sha256 -sign privadoRSA.pem -out firma.rsa texto.txt
- Paso 3
Se procede a verificar que se ha firmado correctamente usando nuestra clave pública:
openssl dgst -sha256 -verify publicaRSA.pem -signature firma.rsa texto.txt
Verified OK
Se observa que la firma ha sido exitosa.
ECDSA
- Paso 1
Realizamos el resumen del fichero "texto.txt" y lo guardamos en el fichero de salida "resumen.bin".
openssl dgst -sha512 -binary -out resumen.bin texto.txt
- Paso 2
Firmamos el "resumen.bin" con el comando "pkeyutl"y usaremos la clave privada ECDSA generada anteriormente. En el caso de que se haya protegido la clave con una contraseña deberemos introducirla.
openssl pkeyutl -sign -in resumen.bin -inkey secp256k1-key.pem -out firma.ecdsa -pkeyopt digest:sha512
- Paso 3
Se procede a verificar que se ha firmado correctamente ejecutamos lo siguiente:
openssl pkeyutl -pubin -verify -in resumen.bin -sigfile firma.ecdsa -inkey publicsecp256k1.pem
Signature Verified Successfully
Se observa que la firma ha sido exitosa.
Derivación de claves DH
DH
A partir de los parámetros DH generados anteriormente, generaremos otro par de claves (privateDH2.pem y publicDH2.pem). De esta manera, podremos comprobar la derivación entre dos pares de claves.
Supongamos que el par de claves "privateDH.pem" y "publicDH.pem" pertenecen a Alice y "privateDH2.pem" y "publicDH2.pem" a Bob.
- Paso 1
Derivamos un valor secreto con la clave privada de Alice y con la clave pública de Bob.
openssl pkeyutl -derive -inkey privateDH.pem -peerkey publicDH2.pem -out secreto1
Enter pass phrase for privateDH.pem:
- Paso 2
Derivamos un valor secreto con la clave privada de Bob y con la clave pública de Alice.
openssl pkeyutl -derive -inkey privateDH2.pem -peerkey publicDH.pem -out secreto2
Enter pass phrase for privateDH2.pem:
- Paso 3
Al comparar ambos valores deberían ser idénticos. Si al ejecutar el comando no sale ningún mensaje por la terminal, el resultado es el correcto.
cmp secreto1 secreto2
X25519
X25519 es un intercambio de claves Diffie-Hellman de curva elíptica utilizando la curva Curve25519. Como los restantes métodos Diffie-Hellman, permite que dos partes acuerden conjuntamente un secreto compartido mediante un canal inseguro o que intercambien sus claves públicas, de forma que la combinación pública-privada en cada extremo produce el mismo valor (secreto) que será utilizado para generar la clave de cifrado simétrico compartida. Esta curva en particular es utilizada por los conocidos sistemas de mensajería móvil Signal y Whatsapp.
- Paso 1
Generamos un par de claves X25519 para Alice. Primero generamos la clave privada, que contiene la clave pública.
openssl genpkey -algorithm X25519 -out priv1.pem
- Paso 2
Extraemos la clave pública de Alice a partir de la clave privada generada en el paso anterior.
openssl pkey -in priv1.pem -pubout -out pub1.pem
- Paso 3
Generamos un par de claves X25519 para Bob. Primero generamos la clave privada.
openssl genpkey -algorithm X25519 -out priv2.pem
- Paso 4
Extraemos la clave pública de Bob a partir de la clave privada generada en el paso anterior.
openssl pkey -in priv2.pem -pubout -out pub2.pem
- Paso 5
Derivamos un valor secreto con la clave privada de Alice y con la clave pública de Bob.
openssl pkeyutl -derive -inkey priv1.pem -peerkey pub2.pem -out secreto1
- Paso 6
Derivamos un valor secreto con la clave privada de Bob y con la clave pública de Alice.
openssl pkeyutl -derive -inkey priv2.pem -peerkey pub1.pem -out secreto2
- Paso 7
Al comparar ambos valores deberían ser idénticos. Si al ejecutar el comando no sale ningún mensaje por la terminal, el resultado es el correcto.
cmp secreto1 secreto2
Secretos DH y EC como generadores de claves simétricas - Generadores de "carraca" (ratchet) y Forward Secrecy
Obsérvese que el "secreto" que se ha negociado con las dos parejas de claves DH es un valor binario de 256 caracteres (2048 bits), mientras que el secreto derivado de las claves X25519 tiene tan sólo 32 caracteres binarios (256 bits), ya que las claves EC (de curva elíptica) son de menor tamaño que las originales DH y por tanto, los números que resultan de las operaciones de derivación son de tamaño similar a las claves utilizadas.
Habitualmente, este secreto será empleado como generador de clave (y vector de inicialización, en su caso) del algoritmo de cifrado simétrico escogido entre ambas partes. Es común, sobre todo empleando curvas elípticas, que se necesiten más bits para la clave de cifrado simétrico (y vector) que el tamaño del propio secreto obtenido, pero esto no es problema, ya que el secreto no se usa directamente como valor de la clave. Lo que se hace es calcular un resumen determinado (sha-256, sha-512, etc.) del secreto y generar a partir de este resumen, directamente o por iteración de la función (realimentando la salida en la entrada tantas veces como se necesite) los bits necesarios para rellenar la clave (y el vector).
Una variante de este proceso bastante común en la actualidad es el empleo del secreto como "generador de carraca" o "ratchet function". En este caso, lo que se introduce en la función de resumen es la concatenación del secreto y un contador, lo que permitirá cambiar la clave (y el vector) en cada transmisión (identificada por su número en el contador siempre creciente), tal y como se hace en los mensajes de la conocida aplicación Whatsapp. Este tipo de generación de claves en secuencia garantiza la propiedad conocida como "Forward Secrecy", ya que el descifrado de cada mensaje requerirá el mismo esfuerzo para el atacante, dado que si no conoce el valor del secreto negociado, no podrá deducir la secuencia de claves que se aplica en cada mensaje.
S/MIME
En este apartado se realizará una introducción sobre el estándar S/MIME y ejemplos para dominar el manejo y estructura de correos electrónicos seguros. Dichos ejemplos se llevarán a cabo para el análisis y generación de este tipo de mensajes de correo electrónico seguro desde línea de comandos.
smime
- -encrypt
Cifrar el correo para los certificados de destinatario dados. El archivo de entrada es el mensaje que se va a cifrar. El archivo de salida es el correo cifrado en formato MIME.
- -decrypt
Descifre el correo utilizando el certificado suministrado y la clave privada. Espera un mensaje de correo cifrado en formato MIME para el archivo de entrada. El correo descifrado se escribe en el archivo de salida.
- -sign
Firme el correo utilizando el certificado suministrado y la clave privada. Archivo de entrada es el mensaje a firmar. El mensaje firmado en formato MIME se escribe en el archivo de salida.
- -verify
Verificar el correo firmado.
- -in filename
El mensaje de entrada que se va a cifrar o firmar o el mensaje MIME que se va a descifrar o verificar.
- -out filename
El texto del mensaje que se ha descifrado o verificado o el mensaje de formato MIME de salida que se ha firmado o verificado.
- -text
Esta opción agrega encabezados MIME de texto sin formato (texto / sin formato) al mensaje suministrado si se encripta o firma.
- -signer file
Un certificado de firma al firmar un mensaje, esta opción se puede utilizar varias veces si se requiere más de un firmante.
- -to
Correo del receptor.
- -from
Correo del emisor.
- -subject
Asunto del mensaje.
Introducción
S/MIME (Secure / Multipurpose Internet Mail Extensions) es un estándar orientado a la criptografía de clave pública y firmado de correo electrónico encapsulado en MIME (una serie de convenciones o especificaciones dirigidas al intercambio a través de Internet de todo tipo de archivos de forma transparente para el usuario). [37]
Además, S/MIME provee los siguientes servicios de seguridad criptográfica para aplicaciones de mensajería electrónica:
- Autenticación, integridad y no repudio (mediante el uso de firma digital).
- Privacidad y seguridad de los datos (mediante el uso de cifrado).
Operaciones con S/MIME
Antes de nada, tenemos que instalar el certificado raíz y el certificado de usuario desde una autoridad certificadora responsable de emitir y revocar los certificados (por ejemplo, CAcert). Una vez instalado dichos certificados, se deberá configurar el certificado de usuario en aplicaciones de correos electrónicos como Mozilla Thunderbird, Microsoft Outlook Express o Apple Mail.
El certificado raíz es un certificado de clave pública sin firma o autofirmado que identifica la autoridad de certificación raíz (AC). Esto servirá para asegurar que un certificado de usuario sea de confianza.
Envío de mensajes firmados
- Paso 1
Primero tenemos que extraer nuestro certificado de usuario en formato PKCS # 12 (se utiliza para almacenar claves privadas y certificados en un solo archivo cifrado [38]) y se nos pedirá una contraseña para proteger dicho certificado. Nuestro certificado se llamará "Certificados.p12". Obsérvese que es diferente exportar un certificado (que generará un fichero ".cer" o ".crt" solo con la parte pública) que extraer o "hacer copia" en cuyo caso se solicitará contraseña para cifrar la clave privada y se generará como fichero PKCS#12 y extensión ".p12".
- Paso 2
Un formato alternativo más simple a PKCS # 12 (.p12) es PEM, que solo enumera los certificados y las claves privadas como cadenas Base 64 en un archivo de texto. Primero tendremos que introducir la contraseña que protege "Certificados.p12" y luego introducir una nueva para el certificado en formato PEM como se muestra a continuación:
openssl pkcs12 -in Certificados.p12 -out Certificado.pem
Enter Import Password: Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
- Paso 3
Para enviar un mensaje (texto.txt) usaremos el comando "-sign" (firma el correo utilizando el certificado suministrado y la clave privada. El archivo de entrada es el mensaje a firmar. El mensaje firmado en formato MIME se escribe en el archivo de salida.), "-text" (agrega encabezados MIME de texto sin formato al mensaje suministrado si se cifra o firma), "-signer" (certificado de firma), "-from" (correo del emisor), "-to" (correo del destinatario), "-subject" (asunto).
Se deberá introducir la contraseña que protege la clave privada.
openssl smime -sign -in texto.txt -text -signer Certificado.pem -from emisor@hotmail.com -to receptor@hotmail.com -subject "Mi mensaje firmado" -out smimeFirmado.eml
Enter pass phrase for Certificado.pem:
- Paso 4
Monstraremos el mensaje haciendo un "cat". Se podrá observar que el texto se lee y que la firma se encuentra en el anejo "smime.p7s".
cat smimeFirmado.eml
To: receptor@hotmail.com.com From: emisor@hotmail.com Subject: Mi mensaje firmado MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----79B426144F5D0703AB81685861B9D87C" This is an S/MIME signed message ------79B426144F5D0703AB81685861B9D87C Content-Type: text/plain En un lugar de la Mancha de cuyo nombre no quiero acordarme... ------79B426144F5D0703AB81685861B9D87C Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIIIVgYJKoZIhvcNAQcCoIIIRzCCCEMCAQExDzANBglghkgBZQMEAgEFADALBgkq hkiG9w0BBwGgggWHMIIFgzCCA2ugAwIBAgIDE+XbMA0GCSqGSIb3DQEBCwUAMHkx EDAOBgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9y ZzEiMCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3 DQEJARYSc3VwcG9ydEBjYWNlcnQub3JnMB4XDTE4MTEyMTE5NDIxNloXDTE5MDUy MDE5NDIxNlowQzEYMBYGA1UEAxMPQ0FjZXJ0IFdvVCBVc2VyMScwJQYJKoZIhvcN AQkBFhhzdWZpdmFsdmVyZGUxM0BnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCz8al3/lHzwxAcQgFbBiNENRTaBX76glnOyqHGeanE4SZc CKHUDG9VTxQwX+hQVjlfROtV1ednjihCnTUCuEuAw5xLX3PE5JoQSqILkZhrNr1v .....ETC ------79B426144F5D0703AB81685861B9D87C--
Envío de mensajes cifrados
- Paso 1
Para enviar un mensaje cifrado se necesita tener el certificado del destinatario. Una vez obtenido, se procede al envío y cifrado de dicho mensaje de la siguiente forma:
openssl smime -encrypt -in texto.txt -from emisor@hotmail.com -to receptor@hotmail.com -subject "Mi mensaje cifrado" receptor.pem > smimeCifrado.eml
- Paso 2
En este paso mostraremos el mensaje ejecutando un "cat". Como se puede observar, a diferencia del apartado anterior, el texto no aparece (ya que está cifrado) y aparece el anejo ".p7m".
To: receptor@hotmail.com From: emisor@hotmail.com Subject: Mi mensaje cifrado MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m" Content-Transfer-Encoding: base64 MIICHAYJKoZIhvcNAQcDoIICDTCCAgkCAQAxggGdMIIBmQIBADCBgDB5MRAwDgYD VQQKEwdSb290IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAg BgNVBAMTGUNBIENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEW EnN1cHBvcnRAY2FjZXJ0Lm9yZwIDE+eRMA0GCSqGSIb3DQEBAQUABIIBAID52yLZ iR/MroIlAyee/o7n6/Az2Hp8TUNIsrNyCpD+vlSWIglaelGGA16neYIFQ3TW15dc gPXPZUbgJHN37XPzxhp8PKwneimeRrzNUDgw4jUtH374WpaiO5QIoNp9ZS1osEVl L9v4B1ATFZVLtLWwVU5D/EoCP/bHANc7SnyYcbjRseSCiD9nVipDvuLsgT0X0lIb HmMvadI7c2KLu9S3i9mFE+74Ic274dafierHZ6P5yn8fZLU0HY3Sf7p0Ec7mt0Cc LWbBzLrrMqfF5BnVOYSTp3l4+gzVILPcJfja2L9KlVppnz3WP+FeyZct0MwW02WE wL64UTRKLgZo/nwwYwYJKoZIhvcNAQcBMBQGCCqGSIb3DQMHBAgCqH16tl9nuIBA lXZK1HLy7rwMhouInIr7Ppk2Q5LoBCrTS34AxC/Zx4F312cb9IoK5y9BVcbBAB1W mEoXfDjHZWV5zI/il6exrQ==
Envío de mensajes firmados y cifrados
- Paso 1
Para enviar un mensaje firmado y cifrado, tenemos que tener el certificado de usuario de la persona a la que se quiere enviar el mensaje.
Una vez obtenido el certificado del destinatario, tenemos que realizar los mismos pasos que en el apartado anterior pero a la hora de enviar el mensaje habrá que añadir lo siguiente:
openssl smime -sign -in texto.txt -text -signer emisor.pem -from emisor@hotmail.co -to receptor@hotmail.co -subject "Mi mensaje firmado y cifrado" | openssl smime -encrypt -from emisor5@hotmail.com -to receptor@hotmail.com -subject "Mi mensaje firmado y cifrado" receptor.pem > EnviarMsn.eml
Enter pass phrase for emisor.pem:
Introducimos la contraseña que protege nuestra clave privada.
Descifrar mensaje firmado y cifrado
- Paso 1
El destinatario cuando reciba el mensaje anterior podrá hacer un cat en la que aparecerá la información que introdujo el emisor a la hora de enviar el mensaje (si exporta el mensaje desde la aplicación de correo al sistema de ficheros como ".eml").
cat EnviarMsn.eml
To: receptor@hotmail.com From: emisor@hotmail.com Subject: Mi mensaje firmado y cifrado MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m" Content-Transfer-Encoding: base64 MIIQAAYJKoZIhvcNAQcDoIIP8TCCD+0CAQAxggGdMIIBmQIBADCBgDB5MRAwDgYD VQQKEwdSb290IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAg BgNVBAMTGUNBIENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEW EnN1cHBvcnRAY2FjZXJ0Lm9yZwIDE+eRMA0GCSqGSIb3DQEBAQUABIIBAG0d2EmV 9bnpN31tY869teLO2obFtE9RlZ4j6Kk7WadalowbQBE2wq1vDuXkVYc3rWw3r7hO VJ0fjCRC3oXWgLHpOIQ9gREjfK7+HHFhwYlZz1MBMGQTFEA4N7G7o2xMqRqCPu/9 Uv7y60qlpXm1QyATdQjLj1jm/C2UgC0NBCoaHEJDPIq26euKrc/gP9n5EHz7RR2r bZWIlwJZQIBPqFWFY0UL/hCzW2sT5rtfhth+RZgdQTcLaV1HPO2noqbJr7cG7PZF xDdnFl3+2jV7HLYpILVe7bXvIIvDHAjE9C8yskXlARWDW9Qf4bu9gWukTvtWryQQ FR7Dk4/Ie8zt2w0wgg5FBgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECP6OoUisdeZ4 gIIOICsC80w15IrRmhWW3Bqw7a9h1Rl3V9SAnVCTF2nivtMUOoFdNXm531+XcFIi uXexV4szSy/jUuvrvMIQH9jnc2mEdGhZ5MZ8t0ZinTnsMVJdE55aVJCm7X5HVAzT ......ETC
Observar que solo aparece un anejo de extensión ".p7m" (cifrado) que contendrá tanto el texto como la firma (en anejo ".p7s").
- Paso 2
Para descifrar el mensaje el destinatario tendrá que introducir su certificado personal ejecutando el siguiente comando:
openssl smime -decrypt -in EnviarMsn.eml -recip receptor.pem -out RecipMsn.txt
Enter pass phrase for receptor.pem:
El destinatario tendrá que introducir la contraseña que protege su clave privada.
- Paso 3
Finalmente, se podrá leer el mensaje haciendo un "cat".
cat RecipMsn.txt
To: receptor@hotmail.com From: emisor@hotmail.com Subject: Mi mensaje firmado y cifrado MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----BBD077D8F787A08996B7D67BCDEF93B9" This is an S/MIME signed message ------BBD077D8F787A08996B7D67BCDEF93B9 Content-Type: text/plain En un lugar de la Mancha de cuyo nombre no quiero acordarme... ------BBD077D8F787A08996B7D67BCDEF93B9 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIIIVgYJKoZIhvcNAQcCoIIIRzCCCEMCAQExDzANBglghkgBZQMEAgEFADALBgkq hkiG9w0BBwGgggWHMIIFgzCCA2ugAwIBAgIDE+XbMA0GCSqGSIb3DQEBCwUAMHkx EDAOBgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9y ZzEiMCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3 DQEJARYSc3VwcG9ydEBjYWNlcnQub3JnMB4XDTE4MTEyMTE5NDIxNloXDTE5MDUy MDE5NDIxNlowQzEYMBYGA1UEAxMPQ0FjZXJ0IFdvVCBVc2VyMScwJQYJKoZIhvcN AQkBFhhzdWZpdmFsdmVyZGUxM0BnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCz8al3/lHzwxAcQgFbBiNENRTaBX76glnOyqHGeanE4SZc CKHUDG9VTxQwX+hQVjlfROtV1ednjihCnTUCuEuAw5xLX3PE5JoQSqILkZhrNr1v 1Sv86Y3iyovDsZWBZJHFjhdB6To2+z0gbaGBDy+NmOlQV6iAOaLAjJ8ZXCfbWN8a 7oOIahZQJqojLgTpkKrQgZPnVuMA/maM9V9WHr4Amze88wwPtiBe470zHltY6KTi 8d/26g0im1vm/STAjJpyZzXxlVZq3RGc3a+QTYUQHtETRSQu5AU8QxI9NHg/3we6 eMiEw5XpcneC40ogECvG4fula87Y8iMskcBxoVZJAgMBAAGjggFIMIIBRDAMBgNV ......ETC ------BBD077D8F787A08996B7D67BCDEF93B9--
Verificación de mensajes
- Paso 1
Para poder verificar que el mensaje y la persona que lo envía son de confianza ejecutamos el siguiente comando. En "-CAfile" se introduce el certificado raíz de la autoridad certificadora.
openssl smime -verify -in RecipMsn.txt -CAfile CACertSigningAuthority.crt
ontent-Type: text/plain Verification successful En un lugar de la Mancha de cuyo nombre no quiero acordarme...
Obsérvese que no se ha incorporado en el comando de verificación el certificado del firmante (emisor del correo), ya que habitualmente los agentes de correo como Thunderbird incorporan como adjunto el certificado del firmante (emisor) en todos los mensajes firmados, como opción por defecto. De no ser así, el comando informaría de error en la verificación por falta de un certificado y sería necesario incorporar el certificado del firmante, con la opción "-certfile CertEmisor.pem" o similar.
Generación y verificación de certificados X.509
Un certificado X.509 autofirmado contiene una clave pública, información acerca del propietario del certificado y la firma del propietario. Además, tiene una clave privada asociada, aunque no verifica el origen del certificado a través de una tercera entidad emisora de certificados, es decir, no existe una entidad que lo valide.
En este apartado se explicará el procedimiento para generar una cadena de certificados, incluyendo un certificado raíz autofirmado al que llamaremos "certificadoRaiz.crt". Este último será el que firme un nuevo certificado al que llamaremos "certificadoIntermedio.crt" y además, verificaremos por separado cada uno de ellos.
Y para terminar crearemos otro certificado llamado "certificadoFinal.crt" firmado con el "certificadoIntermedio.crt". Se validará el certificado final concatenándolo con el certificado intermedio y de esta forma, constituirán el certificado "chain.crt"
Certificado Raíz Autofirmado
- Paso 1
Generamos el certificado raíz RSA que contendrá la clave privada cifrada en AES con la que firmaremos el "certificadoRaiz.crt".
openssl genpkey -algorithm RSA -aes256 -out certificadoRaiz.key -pkeyopt rsa_keygen_bits:2048
..+++++ .........................................+++++ Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
- Paso 2
Hacemos un "cat" para ver nuestra clave privada generada en el paso anterior.
cat certificadoRaiz.key
-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIWm127tzFQOUCAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAqVF1oeyS8Z48zXgmt4EQ0BIIE 0LWoJvHdQnRLkmvl9NjeKqOpxVDk00WIXhsI8tffpV7YHVxipRTHVhILkyuY4w+Z HdikO3bciTZiS7OqGLnoJ5tY6HJaSQrLohiWgZqQz7I/Rbaax/t0YpkrzAYhewy3 AktV29pFs/VQNio4UUBZ4kHpZLxXztnI7wom9dOs4sqin2LnwV2PZ6thabWQJlsn sR89i57cuVulYq45wAkaCZsbjNNdWonhlV7Bm7v90iu5jDGz9zVkcmt0X8H6Ys2U zTWtYx5PCcKiqM4l2FRE97DsoZny1Sy/N9ZtHsyGcHIyMTyeNcZr4vjWGOrA6UYs yTqYVw+NhF6GwehdWmIpIgxk3VBMr1kbJDzYExJCt4x8J9PVA3o8eUQlJW2Y/0NY q0lzWeeiZSAIt89AVH1witszaeJjPDwNXDdtduIZXgA1lCIoBIVmE/7C5z9cBe0K Nz6F4g+GQ5/Isj9sd9OT4WshfcWjZqsVSnk8VzJTYorMjNTSdgqJmX9y/ieBtDFw +FV4jKlBRYoGmDNEuJm3HdbaRz63DDxTpq+xhVK4+lgkGZsFQpRxLuJxv5C55UoH vS3OD1ICMtLmn2oYxaGkwEctGE/G1I0FKThKw5x7ygvxmSuXqS7cjiUrV2stsF2I lcI6poj5s0YoZaUqRzd4nyBHRG2IgR4rb2vsSQnVNAV0pVdW+7eQYDx74ojZ1pTE V+pBsE+xB2tzdpcREmsYPB5huy6h5aQASU2OWFgTHP198wSUrquEF9PbmAhc/qI2 X2Qn00jkBzE/cRDKa9Mw7p3dQjowFtKKW0XAl2pyWoPQc2S9BItK9aFqCpd/NbQ8 7FpK3Gr3aK31tJnPJuX7mD0ziZq8i8B9JymoHr+i+Zm/rrbNd+HgYgTsymz5+qi+ vkz/F8LZFVSI+Tg4T+T7Mf5HXV9GuI0BuzD23YdCXGIK1MHRD60swnlBDtA6jgQH oSqT4QIjUPq84UXZiPKheQVnYHvGTJUWikMU/a6/LkbbXKiy6f0oxlEM/9sgVOKn qXz7jdBDJP8SS9WmLvcDtLGNwTWwKfsOF9TsbnqqxhjQ+OmlH6Usgeiw5DW4ppO4 2cKfWHhMHBeQY5osL1FeyVdqwTqkAv8T6mV3mgCFXc664BYq2XAori40cJWPiX/W 3SX4PoRYPkwkWObL6QXcF6uaM/GbMk6SMGn7LryOSI1dFRAymgAdVaWkiKtiDfAO ilViCE4V3ABea+OvMUxQ6DQ0Ei5RzaGlteuhm6AlKJzOBbBbhc9DABJUGw0Bqlbb JWBCoM3CIyTbN6hmxCKhh/wwTil2dNTYrikHrdlrqRhLqtq2s5OlJpM0l/0H4AUu mJYBmXHPQTVmqaYePgQiFY3dnk7P8nOZKav1HAgxWSMj1GjlpkRYlRFsWLx345Dt YyRVjT96SLpVSV1HMMxq/Ev1hm9mb2tJo89kxYgVbGiAIdeeCOQi+SFcLn6xGVUb UJIaMmbQraiAS7EG0oRDyQB96Zfx/Ku7r9ABqnRVj/c0wxwcMIYNOSjwqztQvly1 njsojGoAPdnzzL8zRf7p1iygg5OWxehdUJBBX8CLYUL9oBs3SCm6SLcmLZ/ARtJY owD3LyGlTkJKexg3TysL3hPBX7sI/Jc8NZcj6IwUZ9vX -----END ENCRYPTED PRIVATE KEY-----
- Paso 3
A continuación generamos una solicitud de firma de certificado (CSR, Certificate Signing Request) que contiene la información del certificado junto con la clave pública, y es lo que envía a las autoridades certificadoras para ser firmada (generar el certificado de confianza). En este caso seremos nosotros quien la firmaremos y no por una autoridad certificadora. En dicha solicitud habrá que rellenar una serie de datos como se muestra a continuación:
openssl req -new -key certificadoRaiz.key -out certificadoRaiz.csr
Dato: -key nos pide la clave privada del certificado.
Enter pass phrase for certificadoRaiz.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:ES State or Province Name (full name) [Some-State]:Las Palmas Locality Name (eg, city) []:Las Palmas de Gran Canaria Organization Name (eg, company) [Internet Widgits Pty Ltd]:estudianteSL Organizational Unit Name (eg, section) []:estudianteSL Common Name (e.g. server FQDN or YOUR name) []:www.estudianteSL.com Email Address []:correo1@ulpgc.es Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
- Paso 4
Hacemos un "cat" para ver el certificado pendiente de firma.
cat certificadoRaiz.csr
-----BEGIN CERTIFICATE REQUEST----- MIIC+zCCAeMCAQAwgbUxCzAJBgNVBAYTAkVTMRMwEQYDVQQIDApMYXMgUGFsbWFz MSMwIQYDVQQHDBpMYXMgUGFsbWFzIGRlIEdyYW4gQ2FuYXJpYTEVMBMGA1UECgwM ZXN0dWRpYW50ZVNMMRUwEwYDVQQLDAxlc3R1ZGlhbnRlU0wxHTAbBgNVBAMMFHd3 dy5lc3R1ZGlhbnRlU0wuY29tMR8wHQYJKoZIhvcNAQkBFhBjb3JyZW8xQHVscGdj LmVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9ELs4JySnm3tWGKp k2XRlHjNelLNdZL1b/S2wKcaAbMh0tIUU3/7DK1q9HQItb29CAA5J3oHs/3gaR1/ 1pZi8oh7qMFUbpDaqj8V9/Ir/a4YLp35etzAeAMzI32L8eTLqO5eoJeVS4k8K6S6 wF5YdoEwTA1LXd0XLLLzTXvRc1YmzfKRG+KFX/EocIxQU4kSQpaGFgfMwIf7jDBW Yh7UZ/+gVDKAFPmhDzVxAupEZCIljLm4XLwbD+2+a3FXWr08NFDdn8NBJyWxLQ4K 1wAX9ErmRDeNQce9rMAI6HL+xBW3OaytApDKkI5aYgbCoIBJzah2HOllXSEKzdET /uC5NwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAMss/OQ0MkUvcgR3yXU+gkWG NAsTwgN/DTkKZluelHnZofbMHv96fwp1mdUfxWJYoUJpdzd2lxdoTNsZypBA5w+x ajVAH8XpAWvKV5WvApvRlKCBfBJYj0dYvmhMdGxEmn84LKL7Y5etH3J2hHHCp9yP 8264mbPcSgd2eJ650A4nR3rBrNB2F+eOMK4fnI+6q7COcvorsh7tmT6QYkcgtWWf CzS7LTWVZ6WUGNRiemGcA29pRzqgPzHypeXU3+nfo9bFXSZp+dudczxDU42bsAwk h5nkqBKFn89J5FNchHdwpcMJiVL7Q2sXeUH5hdEZzuZcYIZv3Zb1ACqrIXORsYw= -----END CERTIFICATE REQUEST-----
- Paso 5
Finalmente, pasaremos a generar el certificado autofirmado utilizando nuestra clave privada. El comando "openssl x509" se utiliza para firmar solicitudes y verificar certificados. La opción "-req" indica que se intenta crear un certificado a partir de una solicitud desde el archivo especificado por "-in". El certificado será guardado con el nombre que indica "-out" y será válido por "-days" días a partir de la fecha actual del servidor. Por último, el parámetro "-signkey" indica la clave con la que será firmado el certificado, la cual (en este ejemplo) es la propia clave privada del certificado emitido.
openssl x509 -req -days 7300 -in certificadoRaiz.csr -signkey certificadoRaiz.key -out certificadoRaiz.crt
Signature ok subject=C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es Getting Private key Enter pass phrase for certificadoRaiz.key:
- Paso 6
Verificamos que el certificado autofirmado se ha creado correctamente. Primero habrá que introducir el certificado de la autoridad certificadora, en nuestro caso es el certificado raíz.
openssl verify -CAfile certificadoRaiz.crt certificadoRaiz.crt
certificadoRaiz.crt: OK
Otra manera de ver las características del firmante (issuer) y del firmado (subject) sería ejecutando el siguiente comando:
openssl x509 -text -noout -in certificadoRaiz.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
39:40:8e:71:94:8c:aa:0d:74:58:17:40:4b:e9:01:5c:a0:4e:98:16
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es
Validity
Not Before: Dec 18 16:04:45 2018 GMT
Not After : Dec 13 16:04:45 2038 GMT
Subject: C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:f4:42:ec:e0:9c:92:9e:6d:ed:58:62:a9:93:65:
d1:94:78:cd:7a:52:cd:75:92:f5:6f:f4:b6:c0:a7:
1a:01:b3:21:d2:d2:14:53:7f:fb:0c:ad:6a:f4:74:
08:b5:bd:bd:08:00:39:27:7a:07:b3:fd:e0:69:1d:
7f:d6:96:62:f2:88:7b:a8:c1:54:6e:90:da:aa:3f:
15:f7:f2:2b:fd:ae:18:2e:9d:f9:7a:dc:c0:78:03:
33:23:7d:8b:f1:e4:cb:a8:ee:5e:a0:97:95:4b:89:
3c:2b:a4:ba:c0:5e:58:76:81:30:4c:0d:4b:5d:dd:
17:2c:b2:f3:4d:7b:d1:73:56:26:cd:f2:91:1b:e2:
85:5f:f1:28:70:8c:50:53:89:12:42:96:86:16:07:
cc:c0:87:fb:8c:30:56:62:1e:d4:67:ff:a0:54:32:
80:14:f9:a1:0f:35:71:02:ea:44:64:22:25:8c:b9:
b8:5c:bc:1b:0f:ed:be:6b:71:57:5a:bd:3c:34:50:
dd:9f:c3:41:27:25:b1:2d:0e:0a:d7:00:17:f4:4a:
e6:44:37:8d:41:c7:bd:ac:c0:08:e8:72:fe:c4:15:
b7:39:ac:ad:02:90:ca:90:8e:5a:62:06:c2:a0:80:
49:cd:a8:76:1c:e9:65:5d:21:0a:cd:d1:13:fe:e0:
b9:37
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
0a:44:eb:08:3c:29:9d:1e:70:08:3e:ae:f3:be:86:f0:45:df:
6b:4e:33:62:da:6b:40:66:65:10:5e:ef:db:e7:f6:5f:57:92:
55:5a:e4:cb:39:9b:b2:25:ca:c1:b3:72:4d:c2:58:1d:91:ad:
2c:a7:2d:a9:b9:5a:0f:f9:e0:d4:70:86:04:23:fe:22:1d:d3:
d5:97:6b:7c:a8:f4:32:37:a8:47:bc:fc:c1:f2:5c:67:89:05:
c5:fc:a2:44:a2:e9:59:77:71:59:04:2e:fa:df:6d:56:9c:45:
64:ac:be:5e:d4:33:30:6f:63:1b:3d:21:6f:65:da:df:9a:1c:
5c:27:54:c0:8e:0b:57:48:50:87:a3:9f:ed:65:9d:1f:77:92:
0b:7a:e3:ed:68:df:9a:c1:fb:80:05:54:f6:1d:dc:3d:a7:73:
c5:fc:41:03:a8:36:f2:40:96:56:73:57:e4:55:1a:c5:b6:94:
5a:1f:19:7a:af:0e:eb:c0:32:2b:30:01:69:2d:c9:dc:ac:2a:
bd:ca:c4:86:86:81:a5:99:f5:1d:4f:d8:a6:5f:4d:72:97:36:
15:6a:f5:28:a1:18:d9:a7:7b:c9:89:d1:ee:c9:f6:a9:5f:29:
52:bc:b9:2c:b4:f8:4d:48:1d:62:3e:4f:87:b1:a5:f5:90:92:
8f:fd:a3:e7
Podemos observar tanto los datos del issuer como los del subject (en este caso son los mismos). Además, se observa la clave pública en hexadecimal (2048 bits) y la firma del issuer en hexadecimal, que contiene todo los datos del certificado incluyendo la clave pública (se le aplica una función de resumen y posteriormente, un algoritmo de cifrado).
Dato: destacar que si posee un "Certificado.key" de alguna autoridad de confianza, se podría usar a la hora de firmar el nuevo Certificado creado por nosotros y así, obtener un certificado autofirmado con la clave privada de dicha autoridad.
Certificado Intermedio
- Paso 1
Generamos el certificado intermedio RSA que contendrá la clave privada cifrada en AES y la usaremos para firmar el certificado final en el siguiente apartado.
openssl genpkey -algorithm RSA -aes256 -out certificadoIntermedio.key -pkeyopt rsa_keygen_bits:2048
...............................................................................................+++++ ..........+++++ Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
- Paso 2
Hacemos un "cat" para ver nuestra clave privada generada en el paso anterior.
cat certificadoIntermedio.key
-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIS4RhdKnGb28CAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDgcEiWqDyYE6Hiln0++0q+BIIE 0CBcD8ObCTPSdNhT7Ef/35zatD9uStTNj9ZytjmoSY5E1Z+HaG2B50c15m3/YOdV ooYu/M0MLwkoOrTW19gmwhsIjfv4tIK5XIDbyUlo+1c2QsPbiNJAoT7p9FA5axD9 Op62GiTju2VszXWdGCAVlDpJ8vG9aBYmi2JTTq8Gdb/ofX7l1nerdMkUHeke9ajW foT1PriuFZxiinjeYr1JmW9zUYwwC5DylKzwHXNG5tD07Ds23dWGYmPa53SCMVAl 9ORu8mPo8DGbV5487sUL+RQDtzwXjLj+O0TPid37wuW/fnn8hYY4DqW4Hdn4rn8v k4JywWqg3Se1BZ7FCx1IYOWpPZP8Qmcn2sTQKBlNHiZ73W6Izo9UOus34D6Ik6gH 1x2Fsv/KqiAJts+I7NVxDuMxy2J04M+1M8nfeZdvejUxo9Tq3YYvrxvWi3ncC3aQ QJqYpsOJGPHycSS/1XgCmQjbxqdJya+ZbA9SSxhVJbfCC1+WaPuGWuElVKA8SWh1 paIMLhJyjNJCOiHmEyHohwbs2HMWB6XuCpwzetxK+E4nw+NzqnREvZ7CwKZnsWxl E6LhxOJS74CbbkmTOF+z2K8PPK+hyy5vzyOD2HqykmOiZ76m1Bre22Zw10IJJHot 85YtJax5L24mWXDpLgU2pWxe/ZaXYIMwLmP42lhO2mb9uGNaMFMgJ3CjTlw7DLRJ xYf5LOX6R9uAfMU744y8l0datosBIiFpuC0UT6qJj1G6fpsG4ynC3zHJ4aqHXTZe bEjrNKRpAYGqlIeB1fzMmqTuXLGvMzuuaFDliN/8y79uD+zCTKSjukChB3vWsYvn PT+l6tmWPbUhMlZatYRmODeoZL12Xu4KiYIFR64TWf8iWxznA19MzQ5sxYVozqAu LUJW3f9idO2JtbkDmXXrFiWMoa1ZJpQ4H37tN9lBf/lYoBBvf6nEp74M0itPTiMc p/E44idOEDukhemijM6DzMWf2pdntvby1QMySq7+kU2NLJCFCSS1f+U/W1VlrdFg 73JbMMcxWbyME9WTU78+OAT84TGtTdpG3s9iPoEPRDKjeAr11EdRD/ooaRZ3NM8L vdT1TRtScvb61DIcThvviTupm1MDpyp+WylxH2zU0rBSnhO+wWIHSq+NfJVh6qAI J+X7pRndxHuHFB9mJXoFtXgF81E6DpS06jhY/UP2FaSnD6gq3DPva/DX6adpinou r/zQvSFIrvRxu6RPIvBuiQnKZR7QCToGfB1TffUg7QyKx/2Qwe7w6hGAhCL5gICq +DmeVo5UABgT0IPGI8iloRgSfgxP07rIhWn74tSD32IMncFhNjr1UWvLMhWIx1VM G6WwrPb8dwh9Bow323xf+dY3plFuBf5aPmK5iMRg4BXM67WOu+sG7fDBh9jWsQXx wjUyaWRoLJoobontZsGKCECSdgar4P4E6XrX0uz7xwDaYaJLTWQ4z+gD63u24gw4 fVFLCJBESEhkYNcIFCZhLKti1Zx1AVT/kK4h2DRkNAeFwbCx24AK8NEz9TBLWew8 N6v/s/0hDX4xYszTdCZFVf0CcZ2YgGyUIHJnuSYJk8DlOUUc84CW8vmmVrRI0BQF 2z1nduWHQh6GkeFHInyWGQSwSjP/2kf8/2l7l7GfVH3P -----END ENCRYPTED PRIVATE KEY-----
- Paso 3
A continuación generamos una solicitud de firma de certificado.
openssl req -new -key certificadoIntermedio.key -out certificadoIntermedio.csr
Enter pass phrase for certificadoIntermedio.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:ES State or Province Name (full name) [Some-State]:Sevilla Locality Name (eg, city) []:Sevilla Organization Name (eg, company) [Internet Widgits Pty Ltd]:estudiantesevilla Organizational Unit Name (eg, section) []:estudiantesevilla Common Name (e.g. server FQDN or YOUR name) []:www.estudiantesevilla.com Email Address []:correo2@sevilla.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
- Paso 4
Hacemos un "cat" para ver el certificado pendiente de firma.
cat certificadoIntermedio.csr
-----BEGIN CERTIFICATE REQUEST----- MIIC9zCCAd8CAQAwgbExCzAJBgNVBAYTAkVTMRAwDgYDVQQIDAdTZXZpbGxhMRAw DgYDVQQHDAdTZXZpbGxhMRowGAYDVQQKDBFlc3R1ZGlhbnRlc2V2aWxsYTEaMBgG A1UECwwRZXN0dWRpYW50ZXNldmlsbGExIjAgBgNVBAMMGXd3dy5lc3R1ZGlhbnRl c2V2aWxsYS5jb20xIjAgBgkqhkiG9w0BCQEWE2NvcnJlbzJAc2V2aWxsYS5jb20w ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0S/s2FfY19DDt+u3OOx1I DlBiDtMhAC1WdyIReaKNvNZuiSBb5/oIn7zkl3BjLfsD1efLNr75lNXnWsNiHtV+ 9ifyJtlS+UQzjiVoAKrNnBklSo0sMKX/VmKRG+qjQh51yBCQbzQN5lR2ABcbCksp FGMu3t3ipPkMnk6kjpZzXPblVFnjMD4dYLvm6qAp+apWliZGl3g0Pxe/77S2tGn0 tscDqVv+Kxo4aAwfPZtwFmnZ+3X/Mk5Q7h05gbZ/20hGPCTkvFkIOseXCRWX7gSa ZCMYJAVZL+Bxv//Ir+qkQbtMbkdbibOYj6J0BlaTylVAft/aE0BDIqJ+kA6s9Hdp AgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAjyAY+eTNUHu8jh8pwe+t2icOPy3X LV+nugeTcepWDybI+r2Wx80iNodA/bfhIzeEfvZgykMHOG8Kk0PaFwMrK+SeaGbQ V470X+NE30f3a6GRRTmn56Eo6OxXSwOk+A7UdJrq2hDSo4e17osG1hgZeMuvu9+/ bh2r2krd0q5tydHKuE+mKspNz+v1KG4gXIrLgIPN/NoPiWhwUnXS+RXUV06L1yxT QbbTn9Cyf5MEHNY4mz/D2i6PscbjEqGp9Tu6094UHdUvk5gRo3TtxiLOlNyzvHjM SOM3ZCWjCxz1G7meqfe8lfHyvRAx4Q8ZQOnImNaxkaQ5YcMJkOJTQ6OrxQ== -----END CERTIFICATE REQUEST-----
- Paso 5
Firmamos el certificado intermedio con la clave privada del certificado raíz.
openssl x509 -req -days 360 -in certificadoIntermedio.csr -CA certificadoRaiz.crt -CAkey certificadoRaiz.key -CAcreateserial -out certificadoIntermedio.crt
Signature ok subject=C = ES, ST = Sevilla, L = Sevilla, O = estudiantesevilla, OU = estudiantesevilla, CN = www.estudiantesevilla.com, emailAddress = correo2@sevilla.com Getting CA Private Key Enter pass phrase for certificadoRaiz.key:
Mostramos el certificado con más detalles como hicimos con el certificado anterior.
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
45:45:ad:07:94:35:09:9f:43:69:67:e6:79:01:b7:65:23:bd:d5:19
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = ES, ST = Las Palmas, L = Las Palmas de Gran Canaria, O = estudianteSL, OU = estudianteSL, CN = www.estudianteSL.com, emailAddress = correo1@ulpgc.es
Validity
Not Before: Dec 18 16:29:35 2018 GMT
Not After : Dec 13 16:29:35 2019 GMT
Subject: C = ES, ST = Sevilla, L = Sevilla, O = estudiantesevilla, OU = estudiantesevilla, CN = www.estudiantesevilla.com, emailAddress = correo2@sevilla.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b4:4b:fb:36:15:f6:35:f4:30:ed:fa:ed:ce:3b:
1d:48:0e:50:62:0e:d3:21:00:2d:56:77:22:11:79:
a2:8d:bc:d6:6e:89:20:5b:e7:fa:08:9f:bc:e4:97:
70:63:2d:fb:03:d5:e7:cb:36:be:f9:94:d5:e7:5a:
c3:62:1e:d5:7e:f6:27:f2:26:d9:52:f9:44:33:8e:
25:68:00:aa:cd:9c:19:25:4a:8d:2c:30:a5:ff:56:
62:91:1b:ea:a3:42:1e:75:c8:10:90:6f:34:0d:e6:
54:76:00:17:1b:0a:4b:29:14:63:2e:de:dd:e2:a4:
f9:0c:9e:4e:a4:8e:96:73:5c:f6:e5:54:59:e3:30:
3e:1d:60:bb:e6:ea:a0:29:f9:aa:56:96:26:46:97:
78:34:3f:17:bf:ef:b4:b6:b4:69:f4:b6:c7:03:a9:
5b:fe:2b:1a:38:68:0c:1f:3d:9b:70:16:69:d9:fb:
75:ff:32:4e:50:ee:1d:39:81:b6:7f:db:48:46:3c:
24:e4:bc:59:08:3a:c7:97:09:15:97:ee:04:9a:64:
23:18:24:05:59:2f:e0:71:bf:ff:c8:af:ea:a4:41:
bb:4c:6e:47:5b:89:b3:98:8f:a2:74:06:56:93:ca:
55:40:7e:df:da:13:40:43:22:a2:7e:90:0e:ac:f4:
77:69
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
7a:23:17:f5:02:a0:34:6c:a0:c6:c3:24:80:68:91:42:4a:57:
7b:5a:f2:d0:be:cc:56:ed:d1:3c:47:d9:90:a4:2a:4e:bc:ff:
ca:cb:fa:a7:bc:96:02:ab:c6:07:74:42:5e:ff:2f:ea:89:67:
fe:8b:29:e6:58:f5:4e:ea:b1:18:81:43:d7:2b:55:27:ab:22:
3b:30:30:e1:e6:d3:cb:df:40:aa:96:9f:12:73:a2:2a:88:3a:
cd:a8:48:ff:66:81:09:77:63:90:ac:ee:54:84:84:a0:ce:92:
05:47:7c:83:ea:f2:24:a8:e2:6d:58:1f:ed:ba:28:6e:9f:74:
4f:08:ad:db:da:8b:dc:60:df:37:8d:04:9f:df:f8:bd:75:c8:
f2:e8:c4:1c:67:03:cf:51:2c:ba:c4:ee:ee:d8:70:75:af:86:
bd:90:ce:df:f2:ff:47:86:56:a1:7c:ad:2a:3a:d0:27:3b:da:
d5:b5:63:dd:71:e0:2a:23:70:c9:ae:91:a7:bb:33:91:00:e2:
e3:0c:dd:29:f5:31:81:0a:37:63:6d:38:3c:33:43:c6:5d:5b:
31:ac:ae:df:cc:15:ab:e5:cb:59:32:d6:3e:c2:c6:7c:f0:93:
38:4f:71:fd:4c:62:b9:46:67:b7:8b:28:4b:0f:d9:9a:90:fb:
96:5e:12:a5
A diferencia del certificado raíz, vemos que el issuer (certificado raíz) y el subject (certificado intermedio) son diferentes.
- Paso 6
Para estar seguro de que lo hemos realizado correctamente vamos a comprobar el certificado intermedio.
openssl verify -CAfile certificadoRaiz.crt certificadoIntermedio.crt
certificadoIntermedio.crt: OK
Certificado final
- Paso 1
Generamos el certificado final RSA que contendrá la clave privada cifrada en AES.
openssl genpkey -algorithm RSA -aes256 -out certificadoFinal.key -pkeyopt rsa_keygen_bits:2048
..........................................+++++ ...................+++++ Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
- Paso 2
Hacemos un "cat" para ver nuestra clave privada generada en el paso anterior.
cat certificadoFinal.key
-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQI3n1R+/GOo3ECAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBA50vRF+Pt+1D4ywzkUNjgTBIIE 0AoPGQ+xq4bYGxrEERVqVCqU6CPMpYU/+isUKyMNsEKoWiGTXJNTlqnTK4wN82rV JhPr3tdFmPrwkI29qfiLcgDf2opnQm2pkXhEjpA67UWdFKmDEasS8wW5ro3LagMj VDXkSfgIGeAxFz1yCcvVrsfpcFleXAWQ4ZAwfxrEzO2sJe5fPa+uKDNhNKXHaScH WlxqrhxhCAgDs8tptDKi1LfjnXDEvGzkR7DRrrc56aM/WpUCv/a/26zQ6IHUheB6 cupO3zR4yEkq7Fx3aKSvu1RS0y9yIcX+VwIzAdElp989gXNsH2Z9qJHxTf0SlA6X gppuHMJMEXmuf69ronna3DMwPCwtmOtRPvKp4G8hdoUgXcznIbJfu8Iq76YMTR56 LQ4yw5+USXy291jY2+L7Z657tywL8quvaV1OzXzjfajgDDoYMI70TvsP0HoqBKHF CPSBK/pwwyziQjppj2rczriWLMWOKP5AnWmelW9RQle6C448UERAYR443VSW3Nzp KkwFGjNDo8LLYS6M30pn81pTh+YUhRZdi4gh4hwHkJVBUozrxwkjiK4LtYrwWBD3 BGHPqP6FJ4jylSdOGhrsN63WwiiQFMyft/1SREU3iv6MClp4P9Ib019KTFbdtgmC YTzeGRm80yBl7oEaXqIMdeYv4RrUwzD1TSQd+pXU/Dv2ojmLbDkWS4uYMvZ4EcCD 0x5CcL6JX45BH7e2iRPR4sA31ClB8TWIMjtc/x2g0I6ui3uVayw7MggjQTIgAnB7 IWKtuvLUiSXpLlNXc7dhYqkWNq5jmBvzwWN2otGVAP5etRt10LlF24aghJtpv9IZ bc5oLloUOTxaIV681t9nKKdFLV9vnp9HwbEPhcL55eYmUJfdVkdZStnM1KYoY+S4 8QBHDBE4NvU04Di7R64ROpGGviGlYRsU6g7AQHL30ErEC78kC/7lknpZYZfXDIbz M6HLHRJuzIrX+bgvsRpTRa6fCsq9ch1YkkTjPy5lqecPxLQ1tcfLPwXlJCjQsnV1 RY4L4BJbnMpKw9vfDT1q/o2N17D0N2StxzyMHIw+aWF0+pgmF66d9pGfavhaykBu W+YOlEltX3we07jfIf4AisPoAi5k+iNSextqaQtk+Co2aVkBrh4dRyBmpE/uYRi1 0OWnJJsb1pCUafNreIdS8g6FUxoCzW0hkiSnG9lrHXmNxz3bj2fD1UQtn8z/wJaD qXpUFGc2zcXtynI9n5FmP5sAfbxPxoSHKf0/tbov6l0ndZJoZ9AY01wmuLwqk889 E+Z0cSmm4xOdDCavqMlkG2OS+rGu04U+TrBN8bFY+lSNnNYmOj09m0AlCVCc0lgM Zi/LeV9rxIYBrZ/WjT4LVOdDzr6IM0Mm5iFLFKrBwjqLl3XebckGgolIt0zDDZRh R5Yan1YZnGtXxZrFyy+X0p743MEBAwNU9U6uGP+OTsBupUoUggAmXLExK3oIM1IX JwEi94m+TmRc0z6ovydqclCb9B2/fiNyhdfoghRDFQTU4a4KHSRDHaJOYxR/4mPv v/JKrA+MJIJJ+YiPHIsDs1rYo+SkqpqqnsW6cZ6sHCScy4JwmGFYJU8gLTPWJkoE P0iH+2VAay9UU2K7KnmANYP9o3uEouB268MlrjwDWLi7 -----END ENCRYPTED PRIVATE KEY-----
- Paso 3
A continuación generamos una solicitud de firma de certificado.
openssl req -new -key certificadoFinal.key -out certificadoFinal.csr
Enter pass phrase for certificadoFinal.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:ES State or Province Name (full name) [Some-State]:Tenerife Locality Name (eg, city) []:Tenerife Organization Name (eg, company) [Internet Widgits Pty Ltd]:estudiantetf Organizational Unit Name (eg, section) []:estudiantetf Common Name (e.g. server FQDN or YOUR name) []:www.estudiantetf.com Email Address []:correo3@tf.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
- Paso 4
Hacemos un "cat" para ver el certificado pendiente de firma.
cat certificadoFinal.csr
-----BEGIN CERTIFICATE REQUEST----- MIIC5TCCAc0CAQAwgZ8xCzAJBgNVBAYTAkVTMREwDwYDVQQIDAhUZW5lcmlmZTER MA8GA1UEBwwIVGVuZXJpZmUxFTATBgNVBAoMDGVzdHVkaWFudGV0ZjEVMBMGA1UE CwwMZXN0dWRpYW50ZXRmMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZXRmLmNvbTEd MBsGCSqGSIb3DQEJARYOY29ycmVvM0B0Zi5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCkOIgHcmhQjCeWCwJrs5b2qKuu2DJu4xXBwJpIKHh2icH9 VaPsuUjGE1yMXyhO5plydvtbvCyjVCDSH6zUnEl7SCH6fNk9gB+nmTQ1u0hjseNW zRNfw3MsVLHVgsBSdn960RSLO/uzYvJUpmvRqU3Az9oipB2wrRF07YlR5QvaOokd jwdOlskqo9qG/dZcpVf1cVhBtOlfs7+8D9ccN4WyD0cE+rKlwPF0ArcmckLz7uwD xO4v6n9Gh62PX5whgCkUxXun4T8O9k1h9Rb/kkPQZZfgnFJi3ng1Maa3Sxmnk1I3 p4udmcEb48+JQhRpwRkWzFVMi3wuDn/q7tzad7B1AgMBAAGgADANBgkqhkiG9w0B AQsFAAOCAQEACGE5iJWotxCBY8/MP6xJVpZb4/1HNGeCa2XSNPXw3BwKFYT6Pm6Q mvA0HLLG5mysPOKl77PAtmvK2BmJJHMC+t3qlGMzmIIYOjWl0RaskxSloGa8dJB8 WuwlK2F37ss8BRTkZT2lVfiaGou073x7XSKRJSGDbuuTlSwHiL0NSCIUzWr8qjmb Jb4mdKksesKblX8l1hmaU3Y4xIjv9ts8bLgi2aSQtvzvg8O0uio/6nv7pLwIUpmO LZHMXY7ELhCGp+NbNTg8IUTJQhlHKTtq7CfEfGsKJYxLXTxqVtvpT1m9zQxsIa4h unJ2xh9mnhoCeH5BKZCqWTyM2cG2G/oifw== -----END CERTIFICATE REQUEST-----
- Paso 5
Firmamos el certificado final con la clave privada del certificado intermedio.
openssl x509 -req -days 360 -in certificadoFinal.csr -CA certificadoIntermedio.crt -CAkey certificadoIntermedio.key -CAcreateserial -out certificadoFinal.crt
Signature ok subject=C = ES, ST = Tenerife, L = Tenerife, O = estudiantetf, OU = estudiantetf, CN = www.estudiantetf.com, emailAddress = correo3@tf.com Getting CA Private Key Enter pass phrase for certificadoIntermedio.key:
Para verificar este certificado tenemos que ir al apartado siguiente. Aunque podemos ver con detalle los datos del certificado final como hemos hecho con los dos anteriores.
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
21:1c:7c:90:69:98:8e:09:0c:e3:b7:55:77:fb:5d:8b:b0:04:f3:6f
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = ES, ST = Sevilla, L = Sevilla, O = estudiantesevilla, OU = estudiantesevilla, CN = www.estudiantesevilla.com, emailAddress = correo2@sevilla.com
Validity
Not Before: Dec 18 18:13:59 2018 GMT
Not After : Dec 13 18:13:59 2019 GMT
Subject: C = ES, ST = Tenerife, L = Tenerife, O = estudiantetf, OU = estudiantetf, CN = www.estudiantetf.com, emailAddress = correo3@tf.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:a4:38:88:07:72:68:50:8c:27:96:0b:02:6b:b3:
96:f6:a8:ab:ae:d8:32:6e:e3:15:c1:c0:9a:48:28:
78:76:89:c1:fd:55:a3:ec:b9:48:c6:13:5c:8c:5f:
28:4e:e6:99:72:76:fb:5b:bc:2c:a3:54:20:d2:1f:
ac:d4:9c:49:7b:48:21:fa:7c:d9:3d:80:1f:a7:99:
34:35:bb:48:63:b1:e3:56:cd:13:5f:c3:73:2c:54:
b1:d5:82:c0:52:76:7f:7a:d1:14:8b:3b:fb:b3:62:
f2:54:a6:6b:d1:a9:4d:c0:cf:da:22:a4:1d:b0:ad:
11:74:ed:89:51:e5:0b:da:3a:89:1d:8f:07:4e:96:
c9:2a:a3:da:86:fd:d6:5c:a5:57:f5:71:58:41:b4:
e9:5f:b3:bf:bc:0f:d7:1c:37:85:b2:0f:47:04:fa:
b2:a5:c0:f1:74:02:b7:26:72:42:f3:ee:ec:03:c4:
ee:2f:ea:7f:46:87:ad:8f:5f:9c:21:80:29:14:c5:
7b:a7:e1:3f:0e:f6:4d:61:f5:16:ff:92:43:d0:65:
97:e0:9c:52:62:de:78:35:31:a6:b7:4b:19:a7:93:
52:37:a7:8b:9d:99:c1:1b:e3:cf:89:42:14:69:c1:
19:16:cc:55:4c:8b:7c:2e:0e:7f:ea:ee:dc:da:77:
b0:75
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
48:d8:73:d7:f0:9d:74:fa:34:f6:c5:9a:9c:ff:b4:ad:fe:86:
29:68:4e:ca:33:df:d8:8a:e3:68:c2:87:b1:8b:de:b9:1c:44:
b7:69:b2:25:7f:a5:d1:9a:8b:57:d5:29:23:3f:63:1d:a2:16:
23:1e:16:5b:b1:23:1f:96:7b:90:83:d6:01:27:2c:db:30:dc:
57:06:0b:4f:1d:3e:95:95:75:fb:9b:b3:c9:57:05:ad:9e:90:
3e:dc:48:e7:83:93:d3:12:65:38:fa:90:45:a9:46:05:af:4e:
e7:84:0b:52:fb:e2:ce:57:ac:a0:1b:7d:9d:ef:2d:4a:07:f2:
8e:3f:5d:6e:1e:a6:47:c3:77:7f:16:69:0a:43:89:4c:a8:e3:
40:59:82:da:1c:78:f4:09:84:e0:22:ff:00:16:ae:aa:15:4e:
42:fb:51:23:d1:19:d2:2b:e8:ce:24:b6:38:0a:b7:43:00:f2:
53:8c:9e:15:28:1c:d5:82:b3:d8:b9:0c:01:48:7f:94:a4:30:
84:d8:cf:05:b8:a2:da:bc:f6:61:c2:09:4a:7e:9d:ce:90:2f:
fc:01:76:e6:4c:c0:b0:44:ee:22:1e:43:a3:ed:56:64:28:c9:
e0:7a:2b:19:71:26:2e:9d:78:4a:f1:71:31:25:60:bb:13:6a:
8d:cf:ff:a1
En este caso, el issuer es el certificado intermedio y el subject es el certificado final.
Certificado "chain"
En este apartado, concatenamos el certificado intermedio con el certificado final para verificar que este último se ha generado correctamente.
- Paso 1
Este certificado simplemente será la unión del certificado raíz con el certificado intermedio.
cat certificadoIntermedio.crt certificadoRaiz.crt > chain.crt
- Paso 2
Hacemos un "cat" para ver el certificado.
cat chain.crt
-----BEGIN CERTIFICATE----- MIID7zCCAtcCFEVFrQeUNQmfQ2ln5nkBt2UjvdUZMA0GCSqGSIb3DQEBCwUAMIG1 MQswCQYDVQQGEwJFUzETMBEGA1UECAwKTGFzIFBhbG1hczEjMCEGA1UEBwwaTGFz IFBhbG1hcyBkZSBHcmFuIENhbmFyaWExFTATBgNVBAoMDGVzdHVkaWFudGVTTDEV MBMGA1UECwwMZXN0dWRpYW50ZVNMMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNM LmNvbTEfMB0GCSqGSIb3DQEJARYQY29ycmVvMUB1bHBnYy5lczAeFw0xODEyMTgx NjI5MzVaFw0xOTEyMTMxNjI5MzVaMIGxMQswCQYDVQQGEwJFUzEQMA4GA1UECAwH U2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxsYTEaMBgGA1UECgwRZXN0dWRpYW50ZXNl dmlsbGExGjAYBgNVBAsMEWVzdHVkaWFudGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cu ZXN0dWRpYW50ZXNldmlsbGEuY29tMSIwIAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNl dmlsbGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtEv7NhX2 NfQw7frtzjsdSA5QYg7TIQAtVnciEXmijbzWbokgW+f6CJ+85JdwYy37A9Xnyza+ +ZTV51rDYh7VfvYn8ibZUvlEM44laACqzZwZJUqNLDCl/1ZikRvqo0IedcgQkG80 DeZUdgAXGwpLKRRjLt7d4qT5DJ5OpI6Wc1z25VRZ4zA+HWC75uqgKfmqVpYmRpd4 ND8Xv++0trRp9LbHA6lb/isaOGgMHz2bcBZp2ft1/zJOUO4dOYG2f9tIRjwk5LxZ CDrHlwkVl+4EmmQjGCQFWS/gcb//yK/qpEG7TG5HW4mzmI+idAZWk8pVQH7f2hNA QyKifpAOrPR3aQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB6Ixf1AqA0bKDGwySA aJFCSld7WvLQvsxW7dE8R9mQpCpOvP/Ky/qnvJYCq8YHdEJe/y/qiWf+iynmWPVO 6rEYgUPXK1UnqyI7MDDh5tPL30Cqlp8Sc6IqiDrNqEj/ZoEJd2OQrO5UhISgzpIF R3yD6vIkqOJtWB/tuihun3RPCK3b2ovcYN83jQSf3/i9dcjy6MQcZwPPUSy6xO7u 2HB1r4a9kM7f8v9HhlahfK0qOtAnO9rVtWPdceAqI3DJrpGnuzORAOLjDN0p9TGB CjdjbTg8M0PGXVsxrK7fzBWr5ctZMtY+wsZ88JM4T3H9TGK5Rme3iyhLD9makPuW XhKl -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID2TCCAsECFCEcfJBpmI4JDOO3VXf7XYuwBPNvMA0GCSqGSIb3DQEBCwUAMIGx MQswCQYDVQQGEwJFUzEQMA4GA1UECAwHU2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxs YTEaMBgGA1UECgwRZXN0dWRpYW50ZXNldmlsbGExGjAYBgNVBAsMEWVzdHVkaWFu dGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cuZXN0dWRpYW50ZXNldmlsbGEuY29tMSIw IAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNldmlsbGEuY29tMB4XDTE4MTIxODE4MTM1 OVoXDTE5MTIxMzE4MTM1OVowgZ8xCzAJBgNVBAYTAkVTMREwDwYDVQQIDAhUZW5l cmlmZTERMA8GA1UEBwwIVGVuZXJpZmUxFTATBgNVBAoMDGVzdHVkaWFudGV0ZjEV MBMGA1UECwwMZXN0dWRpYW50ZXRmMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZXRm LmNvbTEdMBsGCSqGSIb3DQEJARYOY29ycmVvM0B0Zi5jb20wggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCkOIgHcmhQjCeWCwJrs5b2qKuu2DJu4xXBwJpI KHh2icH9VaPsuUjGE1yMXyhO5plydvtbvCyjVCDSH6zUnEl7SCH6fNk9gB+nmTQ1 u0hjseNWzRNfw3MsVLHVgsBSdn960RSLO/uzYvJUpmvRqU3Az9oipB2wrRF07YlR 5QvaOokdjwdOlskqo9qG/dZcpVf1cVhBtOlfs7+8D9ccN4WyD0cE+rKlwPF0Arcm ckLz7uwDxO4v6n9Gh62PX5whgCkUxXun4T8O9k1h9Rb/kkPQZZfgnFJi3ng1Maa3 Sxmnk1I3p4udmcEb48+JQhRpwRkWzFVMi3wuDn/q7tzad7B1AgMBAAEwDQYJKoZI hvcNAQELBQADggEBAEjYc9fwnXT6NPbFmpz/tK3+hiloTsoz39iK42jCh7GL3rkc RLdpsiV/pdGai1fVKSM/Yx2iFiMeFluxIx+We5CD1gEnLNsw3FcGC08dPpWVdfub s8lXBa2ekD7cSOeDk9MSZTj6kEWpRgWvTueEC1L74s5XrKAbfZ3vLUoH8o4/XW4e pkfDd38WaQpDiUyo40BZgtocePQJhOAi/wAWrqoVTkL7USPRGdIr6M4ktjgKt0MA 8lOMnhUoHNWCs9i5DAFIf5SkMITYzwW4otq89mHCCUp+nc6QL/wBduZMwLBE7iIe Q6PtVmQoyeB6KxlxJi6deErxcTElYLsTao3P/6E= -----END CERTIFICATE-----
- Paso 3
Procedemos a la verificación del certificado.
openssl verify -CAfile certificadoRaiz.crt chain.crt
chain.cert: OK
Cadena de certificados en un solo fichero
En este caso, formaremos un solo fichero ".pem" que contendrá los tres certificados creados anteriormente. Es muy importante concatenarlos en el orden que se indica a continuación, sino daría errores como:
error 20 at 0 depth lookup: unable to get local issuer certificate error todos.cert: verification failed
- Paso 1
Juntamos los tres certificados en un solo fichero.
cat certificadoRaiz.crt certificadoIntermedio.crt certificadoFinal.crt > todos.crt
- Paso 2
Vemos el contenido del fichero creado.
cat todos.crt
-----BEGIN CERTIFICATE----- MIID8zCCAtsCFDlAjnGUjKoNdFgXQEvpAVygTpgWMA0GCSqGSIb3DQEBCwUAMIG1 MQswCQYDVQQGEwJFUzETMBEGA1UECAwKTGFzIFBhbG1hczEjMCEGA1UEBwwaTGFz IFBhbG1hcyBkZSBHcmFuIENhbmFyaWExFTATBgNVBAoMDGVzdHVkaWFudGVTTDEV MBMGA1UECwwMZXN0dWRpYW50ZVNMMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNM LmNvbTEfMB0GCSqGSIb3DQEJARYQY29ycmVvMUB1bHBnYy5lczAeFw0xODEyMTgx NjA0NDVaFw0zODEyMTMxNjA0NDVaMIG1MQswCQYDVQQGEwJFUzETMBEGA1UECAwK TGFzIFBhbG1hczEjMCEGA1UEBwwaTGFzIFBhbG1hcyBkZSBHcmFuIENhbmFyaWEx FTATBgNVBAoMDGVzdHVkaWFudGVTTDEVMBMGA1UECwwMZXN0dWRpYW50ZVNMMR0w GwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNMLmNvbTEfMB0GCSqGSIb3DQEJARYQY29y cmVvMUB1bHBnYy5lczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPRC 7OCckp5t7VhiqZNl0ZR4zXpSzXWS9W/0tsCnGgGzIdLSFFN/+wytavR0CLW9vQgA OSd6B7P94Gkdf9aWYvKIe6jBVG6Q2qo/FffyK/2uGC6d+XrcwHgDMyN9i/Hky6ju XqCXlUuJPCukusBeWHaBMEwNS13dFyyy80170XNWJs3ykRvihV/xKHCMUFOJEkKW hhYHzMCH+4wwVmIe1Gf/oFQygBT5oQ81cQLqRGQiJYy5uFy8Gw/tvmtxV1q9PDRQ 3Z/DQSclsS0OCtcAF/RK5kQ3jUHHvazACOhy/sQVtzmsrQKQypCOWmIGwqCASc2o dhzpZV0hCs3RE/7guTcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEACkTrCDwpnR5w CD6u876G8EXfa04zYtprQGZlEF7v2+f2X1eSVVrkyzmbsiXKwbNyTcJYHZGtLKct qblaD/ng1HCGBCP+Ih3T1ZdrfKj0MjeoR7z8wfJcZ4kFxfyiRKLpWXdxWQQu+t9t VpxFZKy+XtQzMG9jGz0hb2Xa35ocXCdUwI4LV0hQh6Of7WWdH3eSC3rj7WjfmsH7 gAVU9h3cPadzxfxBA6g28kCWVnNX5FUaxbaUWh8Zeq8O68AyKzABaS3J3KwqvcrE hoaBpZn1HU/Ypl9Ncpc2FWr1KKEY2ad7yYnR7sn2qV8pUry5LLT4TUgdYj5Ph7Gl 9ZCSj/2j5w== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID7zCCAtcCFEVFrQeUNQmfQ2ln5nkBt2UjvdUZMA0GCSqGSIb3DQEBCwUAMIG1 MQswCQYDVQQGEwJFUzETMBEGA1UECAwKTGFzIFBhbG1hczEjMCEGA1UEBwwaTGFz IFBhbG1hcyBkZSBHcmFuIENhbmFyaWExFTATBgNVBAoMDGVzdHVkaWFudGVTTDEV MBMGA1UECwwMZXN0dWRpYW50ZVNMMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZVNM LmNvbTEfMB0GCSqGSIb3DQEJARYQY29ycmVvMUB1bHBnYy5lczAeFw0xODEyMTgx NjI5MzVaFw0xOTEyMTMxNjI5MzVaMIGxMQswCQYDVQQGEwJFUzEQMA4GA1UECAwH U2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxsYTEaMBgGA1UECgwRZXN0dWRpYW50ZXNl dmlsbGExGjAYBgNVBAsMEWVzdHVkaWFudGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cu ZXN0dWRpYW50ZXNldmlsbGEuY29tMSIwIAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNl dmlsbGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtEv7NhX2 NfQw7frtzjsdSA5QYg7TIQAtVnciEXmijbzWbokgW+f6CJ+85JdwYy37A9Xnyza+ +ZTV51rDYh7VfvYn8ibZUvlEM44laACqzZwZJUqNLDCl/1ZikRvqo0IedcgQkG80 DeZUdgAXGwpLKRRjLt7d4qT5DJ5OpI6Wc1z25VRZ4zA+HWC75uqgKfmqVpYmRpd4 ND8Xv++0trRp9LbHA6lb/isaOGgMHz2bcBZp2ft1/zJOUO4dOYG2f9tIRjwk5LxZ CDrHlwkVl+4EmmQjGCQFWS/gcb//yK/qpEG7TG5HW4mzmI+idAZWk8pVQH7f2hNA QyKifpAOrPR3aQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB6Ixf1AqA0bKDGwySA aJFCSld7WvLQvsxW7dE8R9mQpCpOvP/Ky/qnvJYCq8YHdEJe/y/qiWf+iynmWPVO 6rEYgUPXK1UnqyI7MDDh5tPL30Cqlp8Sc6IqiDrNqEj/ZoEJd2OQrO5UhISgzpIF R3yD6vIkqOJtWB/tuihun3RPCK3b2ovcYN83jQSf3/i9dcjy6MQcZwPPUSy6xO7u 2HB1r4a9kM7f8v9HhlahfK0qOtAnO9rVtWPdceAqI3DJrpGnuzORAOLjDN0p9TGB CjdjbTg8M0PGXVsxrK7fzBWr5ctZMtY+wsZ88JM4T3H9TGK5Rme3iyhLD9makPuW XhKl -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID2TCCAsECFCEcfJBpmI4JDOO3VXf7XYuwBPNvMA0GCSqGSIb3DQEBCwUAMIGx MQswCQYDVQQGEwJFUzEQMA4GA1UECAwHU2V2aWxsYTEQMA4GA1UEBwwHU2V2aWxs YTEaMBgGA1UECgwRZXN0dWRpYW50ZXNldmlsbGExGjAYBgNVBAsMEWVzdHVkaWFu dGVzZXZpbGxhMSIwIAYDVQQDDBl3d3cuZXN0dWRpYW50ZXNldmlsbGEuY29tMSIw IAYJKoZIhvcNAQkBFhNjb3JyZW8yQHNldmlsbGEuY29tMB4XDTE4MTIxODE4MTM1 OVoXDTE5MTIxMzE4MTM1OVowgZ8xCzAJBgNVBAYTAkVTMREwDwYDVQQIDAhUZW5l cmlmZTERMA8GA1UEBwwIVGVuZXJpZmUxFTATBgNVBAoMDGVzdHVkaWFudGV0ZjEV MBMGA1UECwwMZXN0dWRpYW50ZXRmMR0wGwYDVQQDDBR3d3cuZXN0dWRpYW50ZXRm LmNvbTEdMBsGCSqGSIb3DQEJARYOY29ycmVvM0B0Zi5jb20wggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCkOIgHcmhQjCeWCwJrs5b2qKuu2DJu4xXBwJpI KHh2icH9VaPsuUjGE1yMXyhO5plydvtbvCyjVCDSH6zUnEl7SCH6fNk9gB+nmTQ1 u0hjseNWzRNfw3MsVLHVgsBSdn960RSLO/uzYvJUpmvRqU3Az9oipB2wrRF07YlR 5QvaOokdjwdOlskqo9qG/dZcpVf1cVhBtOlfs7+8D9ccN4WyD0cE+rKlwPF0Arcm ckLz7uwDxO4v6n9Gh62PX5whgCkUxXun4T8O9k1h9Rb/kkPQZZfgnFJi3ng1Maa3 Sxmnk1I3p4udmcEb48+JQhRpwRkWzFVMi3wuDn/q7tzad7B1AgMBAAEwDQYJKoZI hvcNAQELBQADggEBAEjYc9fwnXT6NPbFmpz/tK3+hiloTsoz39iK42jCh7GL3rkc RLdpsiV/pdGai1fVKSM/Yx2iFiMeFluxIx+We5CD1gEnLNsw3FcGC08dPpWVdfub s8lXBa2ekD7cSOeDk9MSZTj6kEWpRgWvTueEC1L74s5XrKAbfZ3vLUoH8o4/XW4e pkfDd38WaQpDiUyo40BZgtocePQJhOAi/wAWrqoVTkL7USPRGdIr6M4ktjgKt0MA 8lOMnhUoHNWCs9i5DAFIf5SkMITYzwW4otq89mHCCUp+nc6QL/wBduZMwLBE7iIe Q6PtVmQoyeB6KxlxJi6deErxcTElYLsTao3P/6E= -----END CERTIFICATE-----
- Paso 3
openssl verify -CAfile certificadoRaiz.crt todos.crt
todos.cert: OK
PEM a PKCS#12
Como se ha comentado en este documento, el formato "PKCS#12" almacena claves privadas y certificados en un solo archivo cifrado. Por ello, vamos a mostrar como se pasa de un formato a otro (usaremos el certificado intermedio para el ejemplo).
- Paso 1
Tener en cuenta que se nos pedirá la contraseña que usamos para proteger la clave y nos dará la posibilidad de cambiarla por una nueva. En "-inkey" se deberá introducir la clave privada y en "-in" el certificado correspondiente a dicha clave (en caso contrario, clave y certificado no coincidirían y nos daría error).
openssl pkcs12 -export -in certificadoIntermedio.crt -inkey certificadoIntermedio.key -out inter.p12
Enter pass phrase for certificadoIntermedio.key: Enter Export Password: Verifying - Enter Export Password:
- Paso 2
Si hacemos un "cat" veremos que esta en binario y se hace imposible enter su contenido por eso siempre se recomienda usar ".pem".
Una vez en este formato, el certificado podrá ser importado junto con su clave privada en navegadores, agentes de correo, etc. No olvidemos que se solicitará la contraseña de protección de la clave privada.
Referencias
- ↑ Colaboradores de Wikipedia. Función hash [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash&oldid=107845867>.
- ↑ Estilo ISO de citas bibliográficas Colaboradores de Wikipedia. Función hash criptográfica [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.
- ↑ D. Eloi Sanfelix. Curso de privacidad y protección de comunicaciones digitales [en línea]. Universidad Politécnica de Madrid, 2013 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.
- ↑ Estilo ISO de citas bibliográficas Colaboradores de Wikipedia. Función hash criptográfica [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 5 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Funci%C3%B3n_hash_criptogr%C3%A1fica&oldid=108461646>.
- ↑ MD5. (2018, 11 de septiembre). Wikipedia, La enciclopedia libre. Fecha de consulta: 16:43, noviembre 5, 2018 desde https://es.wikipedia.org/w/index.php?title=MD5&oldid=110565562.
- ↑ Wikipedia contributors. (2018, October 28). SHA-1. In Wikipedia, The Free Encyclopedia. Retrieved 15:50, November 5, 2018, from https://en.wikipedia.org/w/index.php?title=SHA-1&oldid=866182340
- ↑ Colaboradores de Wikipedia. SHA-2 [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 15 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=SHA-2&oldid=110395255>.
- ↑ Colaboradores de Wikipedia. (2018, 4 de noviembre). SHA-3. En Wikipedia, la Enciclopedia Libre . Consultado a las 17:27, 15 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=SHA-3&oldid=867303479
- ↑ Colaboradores de Wikipedia. (2018, 18 de octubre). Código de autenticación de mensaje. En Wikipedia, la Enciclopedia Libre . Consultado el 12:59, 3 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Message_authentication_code&oldid=864554738
- ↑ Colaboradores de Wikipedia. (2018, 26 de octubre). HMAC. En Wikipedia, la Enciclopedia Libre . Consultado a las 13:00, 3 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=HMAC&oldid=865863320
- ↑ Criptografía simétrica. (2018, 3 de julio). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:08, octubre 11, 2018 desde https://es.wikipedia.org/w/index.php?title=Criptograf%C3%ADa_sim%C3%A9trica&oldid=109083984.
- ↑ Colaboradores de Wikipedia. (2018, 27 de octubre). PBKDF2. En Wikipedia, la Enciclopedia Libre . Obtenido 18:55, 1 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=PBKDF2&oldid=866007861
- ↑ Colaboradores de Wikipedia. OpenSSL Wiki [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 17 de diciembre del 2018]. Disponible en <https://wiki.openssl.org/index.php/Main_Page>.
- ↑ Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 24 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.
- ↑ Colaboradores de Wikipedia. Vector de inicialización [en línea]. Wikipedia, La enciclopedia libre, 2015 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Vector_de_inicializaci%C3%B3n&oldid=79449760>.
- ↑ Colaboradores del Blog de Daniel Lerch. Modos de cifrado: ECB, CBC, CTR, OFB y CFB. [en línea]. El Blog de Daniel Lerch, 2007 [fecha de consulta: 12 de octubre del 2018]. Disponible en <http://dlerch.blogspot.com/2007/07/modos-de-cifrado-ecb-cbc-ctr-ofb-y-cfb.html>.
- ↑ Colaboradores del Blog de Daniel Lerch. Modos de cifrado: ECB, CBC, CTR, OFB y CFB. [en línea]. El Blog de Daniel Lerch, 2007 [fecha de consulta: 12 de octubre del 2018]. Disponible en <http://dlerch.blogspot.com/2007/07/modos-de-cifrado-ecb-cbc-ctr-ofb-y-cfb.html>
- ↑ Wikipedia contributors. (2018, October 16). Block cipher mode of operation. In Wikipedia, The Free Encyclopedia. Retrieved 17:43, October 25, 2018, from https://en.wikipedia.org/w/index.php?title=Block_cipher_mode_of_operation&oldid=864354561
- ↑ Colaboradores de Wikipedia. Cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrado_por_bloques&oldid=105539415>.
- ↑ Colaboradores de Wikipedia. Modos de operación de una unidad de cifrado por bloques [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 13 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Modos_de_operaci%C3%B3n_de_una_unidad_de_cifrado_por_bloques&oldid=108270945>.
- ↑ Wikipedia contributors. (2018, October 30). Block cipher mode of operation. In Wikipedia, The Free Encyclopedia. Retrieved 19:21, November 2, 2018, from https://en.wikipedia.org/w/index.php?title=Block_cipher_mode_of_operation&oldid=866522235
- ↑ Colaboradores de Wikipedia. Data Encryption Standard [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 12 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Data_Encryption_Standard&oldid=109510549>.
- ↑ Colaboradores de Wikipedia. Triple DES [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 13 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Triple_DES&oldid=107652683>.
- ↑ Colaboradores de Wikipedia. Advanced Encryption Standard [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 14 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Advanced_Encryption_Standard&oldid=110119865>.
- ↑ Colaboradores de Boxcryptor. Cifrado AES y RSA [en línea]. Boxcryptor [fecha de consulta: 14 de octubre del 2018]. Disponible en <https://www.boxcryptor.com/es/encryption/>.
- ↑ Colaboradores de Wikipedia. Cifrador de flujo [en línea]. Wikipedia, La enciclopedia libre, 2016 [fecha de consulta: 25 de octubre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Cifrador_de_flujo&oldid=94383885>.
- ↑ RSA. (2018, 26 de octubre). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:31, noviembre 7, 2018 desde https://es.wikipedia.org/w/index.php?title=RSA&oldid=111566892.
- ↑ Criptografía y Seguridad en Computadores. (2015, 5 de mayo). Wikipedia, La enciclopedia libre. Fecha de consulta: 17:31, noviembre 7, 2018.
- ↑ Colaboradores de Wikipedia. DSA [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 7 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=DSA&oldid=109487521>.
- ↑ Colaboradores de Wikipedia. (2018, 22 de octubre). Algoritmo de firma digital. En Wikipedia, la Enciclopedia Libre . Consultado a las 18:51, 7 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Digital_Signature_Algorithm&oldid=865188446
- ↑ Colaboradores de Wikipedia. Diffie-Hellman [en línea]. Wikipedia, La enciclopedia libre, 2018 [fecha de consulta: 15 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=Diffie-Hellman&oldid=107390867>.
- ↑ Colaboradores de Wikipedia. (2018, 6 de noviembre). Criptografía de curva elíptica. En Wikipedia, la Enciclopedia Libre . Consultado a las 18:13, 15 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Elliptic-curve_cryptography&oldid=867536222
- ↑ Colaboradores de Wikipedia. ECDSA [en línea]. Wikipedia, La enciclopedia libre, 2017 [fecha de consulta: 15 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=ECDSA&oldid=96631617>.
- ↑ Colaboradores de Wikipedia. (2018, 10 de octubre). Secreto compartido. En Wikipedia, la Enciclopedia Libre . Recuperado 18:21, 15 de noviembre de 2018, de https://en.wikipedia.org/w/index.php?title=Shared_secret&oldid=863386628
- ↑ Wikipedia contributors. (2018, April 12). Elliptic-curve Diffie–Hellman. In Wikipedia, The Free Encyclopedia. Retrieved 18:22, November 15, 2018, from https://en.wikipedia.org/w/index.php?title=Elliptic-curve_Diffie%E2%80%93Hellman&oldid=836070673
- ↑ Matt. (2018, December 24). Command Line Elliptic Curve Operations. Wiki OpenSSL. Retrieved 12:50, Decemeber 26, 2018, from https://wiki.openssl.org/index.php?title=Command_Line_Elliptic_Curve_Operations&oldid=2734
- ↑ Colaboradores de Wikipedia. S/MIME [en línea]. Wikipedia, La enciclopedia libre, 2016 [fecha de consulta: 26 de noviembre del 2018]. Disponible en <https://es.wikipedia.org/w/index.php?title=S/MIME&oldid=95828159>.
- ↑ Wikipedia contributors. (2018, November 21). PKCS 12. In Wikipedia, The Free Encyclopedia. Retrieved 16:56, November 23, 2018, from https://en.wikipedia.org/w/index.php?title=PKCS_12&oldid=869927894