¿Qué es una función hash?

Ayer comentaba en Facebook que una cadena alfanumérica que aparecía en una noticia “parecía el resultado de alguna función hash” y hubo gente que me preguntó qué era eso de una función hash. Así que he pensado que lo mejor será contarlo por aquí que me puedo extender más.

Cifrado

Las funciones hash, también llamadas “digest” o “de resumen“, son algoritmos que calculan y devuelven una cadena de texto alfanumérica de longitud fija calculada a partir de un dato de entrada, que puede ser un texto o un fichero binario. Se trata de funciones unidireccionales, lo que quiere decir que aun teniendo el resultado y conociendo el algoritmo no debe ser posible revertir las operaciones para descifrar el dato de entrada.

Son también funciones determinísticas, siempre devuelven la misma salida para la misma entrada. Al ser resúmenes existe la posibilidad de que dos entradas totalmente distintas devuelvan el mismo resultado, es lo que se llama una “colisión“. Teóricamente es imposible crear una función hash sin colisiones, puesto que las posibilidades de entrada son infinitas pero las de salida están limitadas a la longitud de la cadena de resumen, por tanto a mayor logitud de respuesta menor posibilidad de colisión y mayor robustez para el algoritmo. Las colisiones son lo que facilita un tipo de ataque criptográfico llamado “Ataque de Cumpleaños” del que puedes leer en ese enlace.

Por ejemplo, si calculo el hash de la cadena “hola” con el algoritmo md5 el resultado será: 4d186321c1a7f0f354b297e8914ab240. En cambio si le paso la cadena “Hola“, con mayúscula, el resultado devuelto será: f688ae26e9cfa3ba6235477831d5122e.

¿Qué utilidad tiene esto? Bueno, no se trata de un algoritmo para cifrar un mensaje y poder descifrarlo luego, como pueda ser el caso de AES, no tiene el mismo propósito que la criptografía simétrica o asimétrica. Las funciones hash son útiles por ejemplo para almacenar contraseñas en una base de datos, ya que aunque alguien lograra acceder a ellas no podría descifrar cual es la contraseña original. Otro de sus principales usos es asegurar que un fichero no ha sido modificado durante el trayecto desde su envío: se calcula el hash antes de enviarlo, si al recibirlo lo volvemos a calcular y el resultado no es el mismo implica que alguien ha capturado (un ataque de intermediario o man in the middle) y modificado el fichero. Las funciones hash también se utilizan en los procesos de firma digital de documentos.

¿Cuales son los algoritmos de resumen más populares o más comunes? Te dejo una lista con sus enlaces a Wikipedia:

Cifrado extremo a extremo en Whatsapp ¿de qué va esto?

Seguramente a muchso ayer os apareció un mensaje tal que así si sois usuarios de Whatsapp:

actualización seguridad whatsapp

Por culpa del mensaje me pasé el día hablando de esto, así que creo que lo mejor es comentarlo por aquí. Whatsapp añade cifrado de extremo a extremo ¿esto qué significa?

Bueno, empezamos recordando que Whatsapp en sus inicios no era una aplicación que destacara por su seguridad ya que enviaba sus mensajes en texto plano. Las constantes publicaciones sobre los fallos de seguridad del popular servicio de mensajería llevaron a que en 2011 la compañía se decidiera a mejorar la seguridad aplicando un sistema de cifrado en tránsito. Esta solución evitaba que un atacante pudiera ver los mensajes mientras se enviaban, pero no protegía los mensajes almacenados a nivel local.

Ya a finales de 2014 Whatsapp anunció que comenzaría a aplicar un sistema de cifrado extremo a extreo, o end to end, para mejorar la seguridad en ese sentido, delegando del desarrollo y la implementación en una tercera empresa: Open Whisper Systems. Dicha empresa se ha basado en el software de código abierto de su creación TextSecure, que fue la base para el software de mensajería seguro Signal (nota: un amigo mío, experto en seguridad, me recomienda encarecidamente dicho software).

El funcionamiento del nuevo sistema de seguridad es el siguiente: se crea una clave privada vinculada al dispositivo cada vez que se envía un mensaje, que sólo se almacena en dicho dispositivo. El mensaje es cifrado con una clave pública y sólo puede ser descifrado con dicha clave privada. De esta forma ni la propia compañía podría tener acceso a los mensajes, al menos en teoría (luego en la práctica ya veremos).

¿Cómo se activa? En principio viene activado por defecto en la última versión, así que si actualizáis ya lo veréis. Si queréis saber si lo tenéis activado os vais a los ajustes de Whatsapp:

ajustes cuenta whatsapp

Y ahí pulsáis en Seguridad:

Pestaña seguridad

Debería estar tal que así. Para que esto funcione el usuario con el que os comunicáis debe tener también el whatsapp actualizado. Para saber si podéis comunicaros con esa persona de forma segura podéis pulsar en su nombre para ver sus datos, y por allí os aparecerá un mensaje tal que así para confirmaros si la conexión está cifrada:

whatsapp confirma cifrado

Pulsando este código además podrás confirmar que los mensajes se están enviando cifrados. Si el contacto está presente físicamente puedes hacerlo mediante el escaneo de un código QR en pantalla, y si no mediante la comparación de un código de 60 dígitos que aparece bajo el código.

En resumen, que Whatsapp es sensiblemente más seguro que antes de esta actualización, y probablemente en cuatro días tendrá una pelotera tremenda con el FBI por esto, sobre todo tras la polémica que también tuvieron con Apple. ¿Significa esto que puedes mandar fotos tuyas en pelotas por este medio? Yo no te lo recomendaría.

Cifrar una memoria USB en Ubuntu

Tras una serie de artículos dedicados a otros temas volvemos con algunas de mis cuestiones favoritas: software libre, cifrado/encriptación y seguridad informática. Aunque algunos gobiernos nos quieran hacer creer que esto es sólo para quien tiene algo que ocultar, la privacidad es un derecho y el cifrado una herramienta necesaria para ello. ¿A alguien le parecería lógico pedir una ley  nos obligara a vivir en casas de paredes transparentes? ¿que quitáramos las persianas de nuestras ventanas y las cerraduras de nuestras puertas por si ocultamos algo tras ellas? El cifrado es la pared de tus datos, es la persiana, es la puerta.

En mis tiempos de subsistencia freelance llevaba muchas veces el proyecto de un cliente en un pendrive. ¿Qué pasaría si lo pierdo? La propia Ley Orgánica de Protección de Datos nos solicita almacenar la información sensible de una persona de forma segura. Si la tengo que llevar en una unidad extraíble entonces esta necesariamente debe estar cifrada.

Lo primero para nuestro caso es instalar el paquete cryptsetup si todavía no lo tenemos disponible en nuestra distro:

sudo apt-get install cryptsetup

Una vez instalado, y con el pendrive conectado al equipo, abrimos el administrador de discos de Ubuntu.

Administrador de discos de Ubuntu

Bajo la tabla de particiones del dispositivo verás un botón cuadrado parecido a un botón de stop (en la captura que he puesto a continuación es un botón de play porque ya lo había pulsado) que nos dará la opción de desmontar el volumen.

Particionando unidad usb

Una vez desmontado el volumen pulsas el botón con dos engranajes que está a la derecha del de desmontar y eliges la opción de Formatear. En el menú desplegable de la ventana flotante que se abrirá eliges Cifrado, compatible con sistemas Linux (LUKS + Ext4) en el menú desplegable con todos los formatos. Como puedes observar este método nos permite cifrar una partición, de forma que si no quieres no tienes por qué cifrar todo el pen, puedes hacerlo sobre una parte y dejar otra con menos seguridad para llevar algo intrascendente y tener un acceso más rápido. Seguidamente añades un nombre para el volumen que vas a formatear y una contraseña.

Finalizando el formateo de unidad cifrada

Si en el futuro quieres deshacerte de la partición formateada tendrás que volver a formatear el dispositivo, pero en cambio si quieres cambiar la contraseña el administrador de discos te dará esa opción.

Cuando insertes un volumen así cifrado en un equipo con Ubuntu te dará varias opciones: pedir siempre la contraseña, recordarla mientras dure la sesión o recordarla siempre. Esta última puede ser muy cómoda, pero piensa que en según qué casos puede que no te interese que los datos estén accesibles siempre que el pen se conecte a ese equipo.

Desactivar el bloqueo de SSLv3 en Firefox

A partir de Firefox 34 el popular navegador libre bloquea el acceso a todas las páginas que usen SSLv3 por ser un protocolo de seguridad roto. ¿Cual es el problema? Que hay routers, por ejemplo los de fibra optica de Telefónica, que usan este protocolo para el acceso a su página de administración, así que si intentas acceder a la configuración simplemente no puedes, te quedas en una página de error. ¿Hay solución? , si no ya no me molestaría en escribir esto.

Primero hay que entrar en la configuración del navegador poniendo en la barra de direcciones about:config. Te dará un aviso de que por ahí mejor no tocar que igual se rompe, tú con aplomo y seguridad tira p’alante. En el campo de búsqueda pones security.tls.version.min, cuando lo encuentre haces doble click sobre él y cambias el valor que tiene por un 0. Tras esto cierras firefox y lo vuelves a abrir. Ahora ya debería permitirte acceder al router (o a la web a la que querías acceder, pero en caso de un sitio web externo ten en cuenta la seguridad de la transmisión no está garantizada)

Cifrar nuestro tráfico con DNSCrypt

El cifrado del tráfico entre nuestro equipo y el ISP es una medida de seguridad que nos permitirá protegernos de ataques Man in the Middle, de intentos de espiar nuestras comunicaciones y dificultará al ISP la posibilidad de aplicarnos algunas restricciones (ahora que la neutralidad de la red está en peligro).

Nuestra solución segura será usar DNSCrypt, un software disponible para Windows, Linux, BSD, Android, iOS y OSX. Aquí nos ocuparemos de la instalación en Linux. Como no existe ningún paquete .deb, .rpm o repositorio que podamos utilizar para instalarlo nos tocará compilar el código fuente. Como paso previo, pues, tendremos que tener en el equipo los paquetes necesarios para instalar. En los linux de la familia Debian lo amañamos con un

sudo apt-get install build-essential

Luego tocará descargar la librería libsodium, una librería necesaria para la compilación:

tar -xvzf libsodium-0.5.0.tar.gz
cd libsodium-0.5.0
./configure
make

make check  ##esto verificará si está todo en orden

sudo make install

El siguiente paso es descargar ya el código de DNSCrypt, descomprimirlo y compilarlo

sudo ldconfig #necesitamos lanzar esta configuración primero

tar -xvzf dnscrypt-proxy-1.4.0.tar.gz
cd dnscrypt-proxy-1.4.0
./configure
make

sudo make install

Muy bien, DNSCrypt está instalado, lo siguiente es configurarlo. Nos vamos a editar nuestra conexión de red y en la configuración de IPv4 elegimos en el campo Método la opción Sólo direcciones automáticas (DHCP) y en el campo Servidores DNS ponemos la dirección 127.0.0.1 (si os da problemas al probarlo cambiad por, por ejemplo, 127.0.0.2). Después desde el terminal ejecutamos restart network-manager. Tras hacer esto nos quedaremos sin conexión a internet ya que hemos desconfigurado las DNS y hasta que no se ejecute DNSCrypt no volverán a estar funcionales. Por tanto, lo ejecutamos:

/usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096

Para comprobar que todo funciona prueba a entrar en http://www.opendns.com/welcome/ para ver que la conexión ha vuelto. Como ya dije arriba es posible que usando 127.0.0.1 falle, así que si os pasa matáis el proceso de DNSCrypt, cambiáis la IP por, por ejemplo, 127.0.0.2 y volvéis a lanzar DNSCrypt añadiendo esa dirección como parámetro tal que así:

/usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096 --local-address=127.0.0.2

Ahora vamos con un último paso ¿quieres que DNSCrypt se ejecute cada vez que iniciamos el sistema? Si estás en un sistema basado en Debian toca modificar el archivo /etc/rc.local y pegamos, justo antes de la instrucción exit 0 una de las siguientes líneas:

#en caso de que utilicéis la ip 127.0.0.1
exec /usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096

#en caso de la 127.0.0.2
exec /usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096 --local-address=127.0.0.2

En la documentación de DNSCrypt podéis leer más opciones sobre parámetros, resolución de problemas, cambiar OpenDNS por un DNS alternativo…

SilentEye: más software para esteganografía en Ubuntu

Si el otro día hablaba sobre esteganografía en Ubuntu usando Outguess hoy vamos a ver otro programa para el mismo propósito: SilentEye.

Frente a Outguess os diré que es más coñazo de instalar (aunque no mucho) pero más fácil de usar. Para su instalación en Ubutu podéis descargaros desde aquí el paquete .deb, y previamente hay que tener instalado Qt4 C++, ya que depende del mismo para el entorno gráfico.

El uso del programa es extremadamente simple: con la aplicación abierta seleccionamos un archivo y pulsamos Encode. Eso nos permitirá elegir entre agregar un mensaje de texto escrito por nosotros o introducir un archivo que ocultar. Para recuperar el mensaje basta abrir el archivo desde el programa y pulsar Decode.

Lo que hace verdaderamente interesante SilentEye, por encima de su simpleza en el uso, es la posibilidad de añadirle diversos plugins para usar diversos formatos de imagen, vídeo y para añadir un cifrado fuerte. Por defecto ya deberían venir instalados en el .deb enlazado antes, pero si no podéis encontrarlos en la página del proyecto y, como no, si os veis con fuerza podéis intentar desarrollar vuestros propios plugins.

Cryptonite para Android: Cifrar carpetas locales y archivos de Dropbox

Cryptonite se trata de un proyecto de software libre (GPLv2) que te permite encriptar archivos y carpetas tanto en tu teléfono como en el conocido servicio de almacenamiento online. Está basado en TrueCrypt y EncFS y de momento todavía está en fase de desarrollo, por lo que puede que algunas funcionalidades no estén operativas, pero con todo ya te da las herramientas necesarias para tener un extra de privacidad en tu dispositivo.

Lo primero es descargar desde Google Play la aplicación, verás que sólo te va a pedir dos permisos (al menos así era cuando la descargué yo): acceso a internet (lógico por la compatibilidad con Dropbox) y al almacenamiento (lógico también), ambas justificadas. El resto, bussines as usual, aceptar y tirar p’alante como con cualquier app. Ya te advertirá que se trata de software en fase de desarrollo y que viene sin garantía, así que si te explota el teléfono no les puedes reclamar (ujejeje).

Una vez instalado verás que tiene tres pestañas con opciones (como en esta imagen sacada de la web original del proyecto):

Cryptonite
Cryptonite, pantalla principal

La primera te permite conectar el programa con Dropbox. La sincronización es inmediata y simple, basta meter tus credenciales. Si tienes un volumen encriptado con EncFS en Dropbox podrás trabajar con él a través del teléfono.

En cuanto a la pestaña Local verás varias opciones: Desencriptar directorio local, navegar por el directorio desencriptado, crear volumen local y montar un volumen EncFS (esto último sólo para teléfonos rooteados).

Si lo que quieres es crear un volumen nuevo en el teléfono, lo más habitual, entonces pulsas en Create Local Volume. Lo primero será que tengas que elegir el tipo de encriptación (como en la imagen):

Tipos encriptación Cryptonite
Tipos de encriptación

Yo me movería entre Paranoia y Standard, dependiendo ya de tu nivel de (valga la rebuznancia) paranoia.

Allí te llevará a un menú donde podrás elegir una carpeta ya existente o crear una nueva como directorio para guardar tus archivos encriptados. Tras seleccionar o crear una carpeta te pedirá que insertes la clave (recuerda, la fuerza de un buen algoritmo reside en la fuerza de la clave, así que no pongas 1234). Tras esto ya tienes tu directorio encriptado. Ahora ¿cómo metemos archivos dentro para que estén protegidos? No es cuestión de arrastrar a dentro de la carpeta y vía (pero casi, es fácil).

Para añadir nuevos archivos tendrás que pulsar “Decrypt Local Folder“. Allí os llevará a un navegador de archivos, seleccionáis la carpeta a usar e introducís la clave cuando os la pida. Con la carpeta temporalmente desencriptada basta pulsar Upload Files To This Folder para añadir nuevos archivos. Como puedes ver en la foto, está abajo a la derecha:

Añadir Archivos Carpeta Segura Cryptonite
Añadiendo archivos a carpeta encriptada

Cuando hayas acabado de añadirlos basta con pulsar Forget Decryption para que la carpeta vuelva a su estado de encriptado. Y ya ves, así de fácil tienes tus archivos protegidos.

Muchos dirán las babosadas de siempre: “Esto es para paranoicos”, “si alguien necesita tanta privacidad es que algo esconde”… En fin, ya no es hablar de espionaje ni de ese tipo de historias, simplemente piensa que si te roban el teléfono puede que haya algún archivo que lleves encima que no quieras que caiga en manos de otra persona. Incluso si lo usas para trabajar y por lo que sea tienes que llevar ahí documentos de un cliente (te mangan el móvil, se filtran y encima de comprar un teléfono nuevo y seguramente perder al cliente te chupas un multazo por no cumplir la LOPD).

Mailvelope: encriptar correos de Gmail en Chrome con GPG

Mailvelope es un complemento de Chrome que nos permite utilizar GPG para encriptar nuestros correos. De momento para Firefox no está disponible pero podéis descargar desde GitHub el código y compilarlo.

Si sois novatos en esto de la criptografía os diré que GPG funciona como un sistema criptográfico asimétrico. Ya he hablado de esto antes, pero resumiendo rápidamente hay dos claves, una pública que puede saber cualquiera y una privada que sólo tú sabes. Si quieres enviar un correo encriptado usas la clave pública del receptor para encriptarlo, y ese correo sólo podrá ser leído si se usa la clave privada para desencriptarlo.

Lo primero, tras la instalación, es generar una clave. Podéis hacerlo pulsando el icono que tenéis arriba a la derecha. En el submenú desplegable elegís Options.

Icono del navegador Mailvelope

En el menú de la izquierda seleccionáis Generate Key y ahí veréis un menú como el de la imagen de debajo donde podéis elegir el algoritmo y la longitud de clave, la contraseña que usaréis para desencriptar con vuestra clave privada y varios datos como el correo o el nombre.

Generar clave Mailvelope

El par de claves que creamos debe aparecerá en Display keys. La seleccionamos y hacemos click en Export » Display public key, como puedes ver en la imagen. Puedes elegir entre exportarla a un fichero o copiar el texto y subirlo a un servidor de llaves públicas.

Ok ¿cómo enviar un correo? Es simple. Lo primero es que tenéis que añadir a vuestro llavero/keyring la clave del usuario al que le queréis enviar el correo, que podéis importar desde el menú de opciones (como ya hemos dicho en el párrafo anterior, los usuarios pueden publicar su clave pública en un servidor de llaves o enviarte un archivo con ella).

Importando clave
Menú de importación de claves

Una vez tienes tu clave entras en tu webmail (es compatible con varios) y desde allí ya verás a la derecha un icono como el de la imagen cuando empieces a redactar.

icono de redactar Mailvelope

Si pulsas en él se te abrirá una ventana modal como la de la siguiente foto. En ella puedes redacatar el correo normalmente. Si pulsas el icono con forma de candado te abrirá un menú donde eliges la clave pública del receptor y, aceptando al clickar en Transfer, generará el mensaje encriptado. Luego simplemente envías de forma habitual.

redactar correo encriptado

Para leerlos es más simple, tan pronto recibas un correo encriptado con tu clave pública sólo tendrás que hacer click, meter tu clave privada y leer.

Así que ya puedes gozar de seguridad en tus envíos confidenciales sin necesidad de romperte mucho la cabeza.

Hashes de passwords en PHP 5.5

Uno de los problemas de los algoritmos criptográficos, como le explicaba el otro día a mi madre, es que al ser susceptibles de poder ser rotos por fuerza bruta cada X tiempo tienen que renovarse, dado que la mayor capacidad de procesamiento de los equipos (y más con la posibilidad de hacer computación distribuida) los hace vulnerables con el paso de los años. Decía un profesor mío, y un gran profesor por cierto, “por fuerza bruta todo se rompe, sólo hace falta tiempo“.

La hasta ahora última versión de PHP nos ofrece nuevas funciones a la hora de trabajar con hashes de passwords. Antes era tradicional utilizar funciones como md5(), sha1(), crypt() o hash(). El problema de usar md5() o sha1() es que usan algoritmos muy directos y ligeros. Es decir, que hacen la encriptación y resumen muy rápido, lo cual aunque beneficia el rendimiento en caso de un ataque (lo más habitual con md5() es el llamado “ataque de cumpleaños” que en lugar de intentar encontrar tu contraseña intenta encontrar simplemente una que de el mismo resultado como resumen) facilita la labor del atacante. En cambio hash() y crypt() son algoritmos más complejos, más lentos, tardan más en devolver el resultado. Algo que para el usuario es un imperceptible segundo de espera, pero que en caso de un ataque que tiene que probar millones de combinaciones se convierte en un poderoso impedimento.

En todo caso PHP 5.5 nos provee de nuevas funciones para trabajar con hashes de passwords:

  • password_get_info
  • password_hash
  • password_needs_rehash
  • password_verify

Las más importantes, en el uso normal que podemos hacer de estas funciones son la segunda y la cuarta. Empecemos entonces por password_hash():

Como su nombre indica, la función genera un hash de tu contraseña. Lógicamente tiene que recibir dicha contraseña como primer parámetro. Como segundo debe recibir una constante con el algoritmo a usar (las opciones son PASSWORD_DEFAULT, que es el que usa por defecto PHP, y PASSWORD_BCRYPT, que nos permite definir varias opciones), y si eliges PASSWORD_BCRYPT puedes pasarle como tercer parámetro una serie de opciones. Las más habituales son cost, que es el “coste de computación” o “número de vueltas” que dará el algoritmo y cuanto más alto sea este número menos rendimiento y más seguridad, y salt, que nos permite “salar” el password (añadirle una cadena para hacer más complejo el asalto a la contraseñas). Un ejemplo con las dos opciones, sacado de la web de php.net


<?php
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";

$options = [
    'cost' => 7,
    'salt' => 'BCryptRequires22Chrcts',
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

Como podéis ver se hacen dos hashes. El primero con los parámetros por defecto y el segundo usando PASSWORD_BCRYPT con un menor coste para el sistema (el cost en el algoritmo por defecto sería 10) pero con un salt definido. Por lo que he leído el algoritmo por defecto siempre mete un salt aunque no lo definas e incluso se recomienda que mejor dejar a PHP hacerlo antes que meter una cadena estática.

En el caso de password_verify() la cosa es más facililla. La función recibe la contraseña en texto plano y el hash, encriptado con la función password_hash(). Si conciden nos devuelve TRUE y si no coinciden nos devuelve FALSE.

De nuevo me remito al ejemplo del php.net para esto:


<?php
// Ver el ejemplo de password_hash() arriba para ver de dónde viene este hash.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo '¡La contraseña es válida!';
} else {
    echo 'La contraseña no es válida.';
}
?>

Con estas dos funciones podéis hacer de manera muy simple un sistema de login en PHP, con apoyo de una base de datos.

Criptografía básica: diferencia entre clave simétrica y asimétrica

Una cuestión que siempre se pregunta todo el que se empieza a introducir en el mundo del saber oculto, en el mundo de la criptografía, es qué diferencia hay entre la criptografía simétrica o de clave secreta y la de clave pública o asimétrica. Al contrario de lo que mucha gente piensa, la criptografía asimétrica no proporciona una seguridad más robusta que la simétrica, simplemente ambas tienen una función distinta. Aunque la criptografía existe  ya desde la Roma Clásica, en los últimos años con las comunicaciones informatizadas se ha vuelto una pieza presente en nuestras vidas, aunque para los usuarios suela ser algo transparente su uso.

La criptografía simétrica es simple de explicar (bueno, de explicar por encima, que es lo que voy a hacer aquí): se trata de algoritmos que hacen uso de una sola clave para encriptar y desencriptar mensajes. Dado que en un buen algoritmo criptográfico la fuerza ha de estar en la clave, esto es que da igual que el atacante conozca el algoritmo pues no ha de servirle de nada si no tiene la clave, se nos plantea el problema de cómo compartirla entre dos usuarios de forma segura. Es decir, si yo mando un archivo encriptado a un amigo, este necesita la clave para poder acceder a su contenido, por lo que se nos plantea el ¿cómo le hago llegar de forma segura la clave?.

Y para solventar ese problema de intercambio de claves se creó la criptografía asimétrica. Esta nos ofrece dos posibilidades: enviar un mensaje que sólo puede ser leído por el destinatario y comprobar también que un mensaje no se ha modificado desde que sale del remitente. Como te puedes imagina, la criptografía asimétrica no utiliza una sola clave como la anterior, sino dos: una pública, que puede ser conocida por cualquiera, y una privada, que sólo conoce un usuario (de aquí en adelante llamado UserA para los ejemplos). Ok, ejemplos prácticos: Un amigo de UserA quiere mandarle un archivo con una foto suya en la que le pintaron un pene en la frente mientras dormía, y obviamente no quiere que nadie más la vea. Entonces utiliza la clave pública, que puede estar colgada en un repositorio de claves públicas por ejemplo, de UserA para codificar el archivo. Cuando UserA reciba el mensaje y quiera leerlo le bastará con usar su clave privada, que sólo él conoce, para desencriptarlo. La clave pública no permite desencriptar el mensaje, por lo que da igual que un atacante la tenga y, por otra parte no ha tenido el problema de enviar la clave a su amigo por un canal potencialmente inseguro. Otro ejemplo: UserA quiere responder a este mensaje enviándole al colega la dirección de otro de la pandilla para que le pase la foto. Obviamente necesita poder demostrar que el correo ha sido enviado por él. En este caso usa su clave privada para firmar digitalmente el correo, de forma que cualquiera con acceso a su clave pública puede verificar que la firma es auténtica y que el documento no se ha modificado entre medias. La criptografía asimétrica es esencial para las comunicaciones seguras entre usuarios, partiendo de los preceptos establecidos en el protocolo de intercambio de claves Diffie-Hellman.

El problema es que los algoritmos de clave asimétrica suelen requerir de más recursos del sistema para hacer su trabajo, son más pesados, más lentos, se tarda maś tanto en encriptar como en desencriptar, lo cual hacía muy engorroso encriptar mensajes o archivos muy grandes. Eso hizo que naciera la criptografía híbrida, basada en una idea sencilla: se envía el mensaje en dos bloques: uno encriptado de forma simétrica con el mensaje grande y otro de forma asimétrica sólo con la clave simétrica que desencripta el mensaje largo. Esto permite combinar la ligereza del algoritmo simétrico con la seguridad en el intercambio de claves del asimétrico.

En fin, espero que como aclaración esto os haya servido de algo. Un saludo y a seguir seguros.