Tipos de Criptografía
En este apartado estaremos viendo en detalle los tipos de criptografía simétrica y asimétrica. Es decir, sus algoritmos, usos, ventajas y diferencias, aplicaciones y demás para su correcta implementación de la confidencialidad y no-repudio en los datos de un sistema.
Table of Contents
ToggleCriptografía Simétrica
La criptografía simétrica es uno de los tipos de criptografía que utiliza la misma clave para cifrar y descifrar la información. Por lo tanto, ambas partes (emisor y receptor) deberán ponerse de acuerdo sobre la clave que utilizarán para cifrar.
Una de las características principales que tienen los algoritmos en este tipo de cifrado ,con respecto a otros, es la velocidad. Algunos de estos pueden ser DES, 3DES, AES, Blowfish, Cast, etc..
El cifrado simétrico puede generarse de dos formas, por bloque o por flujo:
Cifrado por Bloque
Estos tipos de criptografía usan un algoritmo que divide el texto claro en bloques de tamaño fijo, luego se aplican sobre cada uno sustituciones, permutaciones o cifrado de producto. Este último, consiste en intercalar confusión (sustituciones simples) con difusión (permutaciones). Se realiza por capas, y a esta estructura se la denomina red de sustitución/permutación.
Para descifrar, se aplica el mismo algoritmo pero usando cada clave Kn en forma inversa. Por lo tanto, no depende de la función.
Ejemplo de esto son los algoritmos DES (actualmente roto), Blowfish, Lucifer, Cast, etc..
Algorítmo AES
Cabe mencionar que también existen diversos algoritmos que utilizan otros tipos de cifrado por bloques, como es el caso de AES.
Este no posee estructura de red de Feistel como los anteriores. Es decir, cada ronda es una composición de cuatro funciones invertibles diferentes formando tres capas. Usa una matriz de estado de tamaño 4×4, cuyas 16 celdas o bytes van cambiando de valor de acuerdo a los procesos que ejecuta el algoritmo.
Podemos dividir este algoritmo en las siguiente capas:
No lineal (función SubBytes): Consiste en la aplicación paralela de s-cajas con propiedades óptimas de no linealidad.
Adición de clave (función AddRoundKey): Es un simple XOR entre el estado intermedio y la subclave correspondiente a cada ronda.
Mezcla lineal (funciones ShiftRows y MixColumns): Permite obtener un alto nivel de difusión a lo largo de varias rondas.
Cifrado por Flujo
Existen otros tipos de criptografía simétrica como es el caso de aquellos basados en flujo. Es decir, esta vez el algoritmo funciona cifrando cada dígito de texto plano a la vez con una clave generada pseudo aleatoriamente, conocida como keystream.
Las secuencias pseudoaleatorias pueden generarse a partir de:
a) Algoritmos PRNG (Pseudorandom Number Generators). Por ejemplo:
Lineal Congruential Generator (LCG)
Lineal Feedback Shift Register (LFSR)
Blum Blum Shub (BBS)
Multiply with carry (MWC)
b) Hardware TRNG (True Random Number Generators)
c) ORNS (Online Random Numbers Servers)
Criptografía Asimétrica
Supongamos que A (emisor) envía un correo electrónico a B (receptor), el primero solo necesita conocer la dirección del correo de B. A su vez, lo único que necesita B para leer el mensaje que A le ha enviado es la contraseña de su correo. Por lo tanto, no importa si todo el mundo conoce la dirección de correo de B, mientras este conozca y mantenga en secreto su contraseña, podrá tener acceso a los mensajes.
Los distintos tipos de algoritmos basados en criptografía asimétrica funcionan de forma similar a través de la generación de un par de claves, una pública y otra privada. Este mecanismo se utiliza para cifrado/descifrado, generar claves y firmar documentos.
Imaginemos que tenemos 2 interesados en cifrar de forma asimétrica, a los cuales llamaremos Alice y Bob. Cada uno de ellos generará su clave privada y a partir de la misma su clave pública. Posteriormente, cada uno hará llegar a la contraparte su clave pública utilizando el mecanismo que más le convenga para poder comunicarse.
Características
Podemos destacar de la criptografía asimétrica:
Se usa para cifrar/descifrar, generar claves y firmar documentos.
Algunos algoritmos utilizados son: RSA, Diffie-Hellman, DSA, criptografía de curva elíptica.
Se utiliza en programas como SSH, PGP o en SSL para comunicaciones TCP/IP.
Es un cifrado lento comparado con el simétrico, sus claves son más grandes y, en cuanto al mensaje cifrado, es mayor al texto claro.
Algorítmos de ejemplo
Dentro de los tipos de criptografía asimétrica podemos encontrar distintos algoritmos. Los mismos de detallan a a continuación.
Diffie-Helman
Supongamos que Alice quiere enviar un mensaje cifrado a Bob, para ello, Alice aplicará el algoritmo asimétrico a su mensaje en texto plano junto con la clave pública del mismo. Una vez que obtuvo el criptograma puede enviarlo segura de que si alguien intercepta el mismo no podrá interpretarlo, dado que, el único que podrá abrir el mensaje será Bob ya que dispone de la clave privada.
Por lo tanto:
a = Es un número secreto elegido por Alice.
b = Número secreto elegido por Bob.
g = Es un número generador.
p = Número primo.
El resultado K será la clave que utilizarán para cifrar, ya que en ambos lados será la misma.
RSA
Este algoritmo 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 números primos grandes.
Como podemos ver, consta de 3 pasos: generación de claves, cifrado y descifrado.
Criptografía híbrida
Como hemos visto hasta ahora, los tipos de criptografía simétrica y asimétrica tienen ciertas ventajas y desventajas. La primera es más rápida a la hora de cifrar mensajes, pero posee el inconveniente de ser vulnerable en un medio o canal inseguro ante ataques “Man in The Midle”. En cambio, la segunda no tiene este punto en contra, ya que permite mejor confidencialidad, autenticidad y no-repudio. Sin embargo, es más lenta que la simétrica.
Estos motivos llevaron a otros tipos de criptografía como es el caso de la híbrida. La misma permite utilizar lo mejor de cada una (simétrica y asimétrica) utilizando la primera para cifrar un documento y la segunda para generar claves y un medio seguro de comunicación. Ejemplo de esto podemos ver con el protocolo HTTPS, el cual utiliza el sistema SSL o TLS para mejorar el rendimiento y seguridad de una comunicación.
Entonces cuando utilizamos una clave simétrica para el cifrado de los datos, la clave es utilizada para cifrar el mensaje que queremos enviar. Cuando la otra parte recibe el mensaje, y necesitamos que lo descifre, debemos enviarle la clave simétrica. Por lo tanto, para realizar dicho envío, utilizamos la criptografía asimétrica.
Uso de GnuPG
La herramienta GNU Privacy Guard nos permite encriptar archivos o documentos a través de la implementación del estandar OpenPGP. La misma es una herramienta esencial para los tipos de criptografía mencionados anteriormente.
Encriptación simétrica
De forma simple, en nuestra terminal podemos colocar gpg -c file.txt para encriptar un archivo en salida binaria. Sin embargo, a continuación lo haremos de forma completa de la siguiente manera:
Como vemos, primero se nos pedirá una contraseña y luego veremos el archivo generado file.txt.asc. Por lo tanto, lo que hemos hecho es:
-a (–armor): Encriptamos el archivo a través de una salida blindada en formato ASCCI (base64).
-c (–symetric): Especificamos el algorítmo simétrico a utilizar.
–cipher-algo: Especificamos el encriptado simétrico.
A su vez, si queremos desencriptar y leer en texto claro el mensaje, solamente debemos usar la opción -d (–decrypt).
Y en el caso de querer que la salida sea en un archivo con otro nombre podemos hacer uso de -o (–output) especificando su nombre como se muestra en la captura anterior.
Encriptación asimétrica
En el caso de querer generar un par de claves, esta herramienta cuenta con un asistente que irá guiando paso a paso para poder generarlas. Para ello, hacemos uso de la siguiente línea de comandos
gpg –full-generate-key
Solo tendremos que especificar el tipo de algoritmo a utilizar, el tamaño de las claves, fecha de expiración, nombre, correo electrónico, una frase y contraseña de cifrado.
Luego si queremos ver las claves listadas en el sistema debemos colocar gpg –list-key de la siguiente manera.
De esta manera se nos imprimirá un listado de las mismas
Exportar/Importar claves
Para exportar la clave que hemos generado podemos colocar: asdasd
gpg -a –export (Correo o ID) > file.gpg
Ahora tenemos lista nuestra clave para enviarla a otros usuarios y puedan importarla. Para ello solo debemos colocar gpg –import public_key como vemos en el siguiente ejemplo:
Por lo tanto, desde otro usuario solo debemos usar la clave pública de Lathack para cifrar los mensajes que le enviemos a través de la siguiente línea de comandos:
gpg -a -r [email protected] –encrypt archivo_a_encriptar
Con la opción -a estamos colocando la clave en formato ASCII (en caso de estar en binario), con -r hacemos referencia al mail del destinatario y con –encrypt encriptamos los datos o archivo a enviar.
A su vez, el destinatario cuando reciba dicho archivo encriptado, solo podrá desencriptar los archivos generados con su clave pública de la siguiente manera:
gpg -a –decrypt archivo_encriptado > archivo_original.txt
Para ello, el sistema nos pedirá la contraseña correspondiente a nuestra clave privada.
Estos pasos los veremos con mayor detalle con la herramienta OpenSSL.
Uso de OpenSSL
El proyecto OpenSSL mantiene y hace uso del software OpenSSL el cual estaremos haciendo uso para encriptado simétrico y asimétrico al igual que la herramienta anterior. No muy distinta a la anterior, también es muy importante su uso para los distintos tipos de criptografía, con algunas mínimas diferencias como se verá a continuación.
Encriptación simétrica
Podemos encriptar un archivo haciendo uso de la siguiente línea de comandos:
openssl aes-256-cbc -a -e -in example.txt -out example.enc
Con esto especificamos lo siguiente:
-e (enc): Encripación simétrica.
-a: Codificación a base64 o cadena del tipo ASCII.
aes-256-cbc: Tipo de ecnriptación simétrica.
-in: Archivo a encriptar (example.txt).
-out: Salida del archivo encriptado (example.enc).
No obstante, para hacer que el cifrado sea más seguro y resistente contra ataques de fuerza bruta, a continuación haremos uso de la función de derivación de clave basada en contraseña 2 (-pbkdf2). Como así también, haremos uso del parámetro -iter NUMBER. De esta manera especificamos el número de iteraciones en la contraseña para derivar la clave de cifrado.
Veamos a continuación:
Por lo tanto, para desencriptar haríamos lo siguiente:
De esta manera podemos visualizar el contenido del mismo
Encriptación asimétrica
Recordemos que para generar un par de claves primero debemos generar una privada, y luego a partir de esta una pública. Veamos esto a continuación.
Cuya clave pública la veríamos de la siguiente manera:
Por lo tanto:
En la primera línea de comandos hemos generado la clave privada con genrsa a partir del comando openssl. A su vez, indicamos que el tamaño de nuestra clave privada será de 2048 bits.
En la segunda línea de comando especificamos que usaremos el algoritmo rsa y una clave pública a través del parámetro -pubout. Podemos notar que la entrada de la misma se hace vía la clave privada con -in private_key.
Entonces supongamos que dichas claves pertenecen a Bob. Lo que hace este es enviarle su clave pública a Alice. Por tanto, ella usará dicha clave para cifrar un documento llamado file.txt cuyo archivo generado será file.txt.rsa y luego se lo enviará a Bob.
Para ello usará la siguiente línea de comandos:
openssl pkeyutl -encrypt -inkey public_key.pem -pubin -in file.txt -out file.txt.rsa
Cuando Bob reciba el archivo file.txt.rsa tendrá que desencriptarlo haciendo uso de su clave privada. La línea de comandos sería la siguiente:
openssl pkeyutl -decrypt -inkey private_key.pem -in file.txt.rsa -out original_file.txt
Ejemplo
En el siguiente ejemplo el usuario root crea el archivo file.txt.rsa, y lo firma mediante la clave pública del usuario kali para luego enviárselo.
Por lo tanto, una vez que el usuario root haya enviado el archivo al usuario kali, este deberá usar su clave privada para poder hacer legible o leer el archivo que ha recibido (Recordemos que para cambiar el formato del archivo en ASCII debemos usar la opción -a).
Por lo tanto, el conocimiento y aplicación de los tipos de criptografía es esencial para resguardar la confidencialidad e integridad de los datos.