Últimamente no he escrito mucho, he estado ocupado con otros proyectos, ahora llega el momento de fusionar ambos.
Estoy desarrollando una aplicación de cifrado seudo-paranoico. Se basa en el estándar AES256 al cual le añadimos dos capas para evitar algunos ataques.
El programa esta totalmente escrito en Haskell ayudándome de su entorno de desarrollo Stack y se encuentra en Alpha 0.1.3. Ya estoy implementando la ultima capa de cifrado simétrico.
Hasta la versión 1 estará solo disponible para cifrado de texto con clave de 512 bites o superior y orientado, a poder usarse en cualquier red social, servicio de mensajería o email. También cifrara mediante curvas elípticas para el envío de claves.
Los paquetes que estoy desarrollando están orientados a poderse usar también para el cifrado de archivos ya que están diseñadas para ByteString, pero esto no sera hasta la versión 2.
En versiones posteriores también se podría implementar un servicio de mensajería basado en el anonimato, una vez que añada conexión a base de datos. Quizá en la version 3
La aplicación se llama CrypText y se encuentra alojada en mi repositorio GitLab. Y se distribuye bajo licencia BSD 3-clause traducido al castellano Licencia Publica de Libre Uso.
Aquellos que queráis colaborar, probarla o trastear estáis invitados.
English.
Lately I have not written much, I’ve been busy with other projects, now it’s time to merge both. I am developing a pseudo-paranoid encryption application. It is based on the AES256 standard to which we add two layers to avoid some attacks.
The program is completely written in Haskell, helping me with its Stack development environment and it is in Alpha 0.1.3. I am already implementing the last layer of symmetric encryption.
Until version 1 will only be available for text encryption with a 512-bit key or higher and oriented, to be used in any social network, messaging service or email. It will also encrypt using elliptical curves for sending keys.
The packages that I am developing are oriented to be able to be used also for the encryption of files since they are designed for ByteString, but this will not be until the version 2.
In later versions you could also implement a messaging service based on anonymity, once you add a database connection. Maybe in version 3.
The application is called CrypText and is hosted in my repository GitLab. It is distributed under a BSD 3-clause license.
Those who want to collaborate, test or …. are invited.
Esta segunda entrada de programación en Haskell veremos un ejemplo de cifrado Cesar que nos permitirá practicar con la definición de funciones.
Para ponernos en situación veremos que es el cifrado Cesar, y en nuestro caso, con el fin de practicar con la definición de funciones, usaremos el alfabeto latín antiguo, el cual convivió con este cifrado en los años del Circo Romano, los acueductos…
Latín Antiguo.
El alfabeto que usaban en torno al año cero de la era cristiana, en el antiguo imperio romano era el latín antiguo y difería del alfabeto actual de 27 letras si incluimos la “ñ”
En la Roma Antigua solo teníamos mayúsculas y las letras J,U,Ñ,W no estaban aún en el alfabeto.
La J fue I y la U fue V ( JESUS era IESVS ) y no llegan como tales, hasta el siglo XVIII, aunque coexistieron desde el origen ligadas a las letras I y V.
X e Y entraron en siglo 2 a.C. por la conquista del Imperio Griego.
Las minúsculas llegaron en la Edad Media.
La Ñ aparece como sustitución del dígrafo “NN” al final de la Edad Media en algunos alfabetos derivados del latín como el Castellano.
W entra en el siglo XIII por influecia de las lenguas germánicas.
Resumiendo nos queda un alfabeto de 23 letras (Sin J,U,Ñ,W) ABCDEFGHIKLMNOPQRSTVYZ
Cifrado Cesar.
El cifrado César,es una de las técnicas de cifrado más simples y más usadas. Es un tipo de cifrado por sustitución en el que una letra en el texto original es reemplazada por otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto. Por ejemplo, con un desplazamiento de 3, la A sería sustituida por la D (situada 3 lugares a la derecha de la A), la B sería reemplazada por la E, etc. Este método debe su nombre a Julio Cesar, que lo usaba para comunicarse con sus generales. Texto obtenido de la Wikipedia
Cifrado Cesar
Programa en Haskell.
Adaptaremos nuestro programa de cifrado Cesar al alfabeto latín antiguo. Nos fijaremos en la definición de la función ya que es lo más significativo del programa.
antiguas :: Int -> Char -> Char antiguas n c | elem c [‘A’..’I’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n ) 23) | elem c [‘J’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23) | elem c [‘K’..’T’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23) | elem c [‘U’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23) | elem c [‘V’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-2 ) 23) | elem c [‘X’..’Z’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-3) 23) | elem c [‘ ‘] = ‘ ‘ |otherwise = ‘*’
— Cifrado Cesar latín antiguo versión modulo 23 con 3 desplazamientos.
— Implementando C. Cesar para cada letra antiguas :: Int -> Char -> Char antiguas n c | elem c [‘A’..’I’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n ) 23) | elem c [‘J’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23) | elem c [‘K’..’T’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23) | elem c [‘U’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-1 ) 23) | elem c [‘V’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-2 ) 23) | elem c [‘X’..’Z’] = alfabeto !! (mod ( (ord c) – (ord ‘A’) + n-3) 23) | elem c [‘ ‘] = ‘ ‘ |otherwise = ‘*’
— Implementamos para String.
cesar :: Int -> String -> String cesar n xs = [antiguas n x | x <- xs]
main = do
— Mostramos el Alfabeto Latin Antiguo.
putStrLn “Alfabeto latín antiguo” putStrLn ( show ( alfabeto))
— Pedimos el texto a cifrar.
putStrLn “Introduce el texto a cifrar (Los caracteres que no existían en el latín antiguo se transformaran en *) “ line <- getLine
— Ciframos y deciframos n=3 y n=-3 — El cifrado original cesar es de 3 desplazamientos.
let texto = cesar 3 line let textoDes = cesar (-3) texto putStrLn (“Cifro hacía la derecha moviendo 3 posiciones”) putStrLn ( show ( texto)) putStrLn (“Descifro hacía la izquierda moviendo 3 posiciones corrigiendo J y U “) putStrLn ( show ( textoDes))
Ejecutamos.
runhaskell CesarAntiguo.hs Alfabeto latín antiguo “ABCDEFGHIKLMNOPQRSTVXYZ” Introduce el texto a cifrar (Los caracteres que no existían en el latín antiguo se transformaran en *) JULIO CESAR VINI VIDI VICI Cifro hacía la derecha moviendo 3 posiciones “MZOMR FHXDV ZMQM ZMGM ZMFM” Descifro hacía la izquierda moviendo 3 posiciones corrigiendo J y U “IVLIO CESAR VINI VIDI VICI”
Os muestro un vídeo sobre BlackArch Linux, una distro basada en Arch Linux y que esta orientada al la seguridad informática.
Para los usuarios de Arch tenéis la posibilidad de añadir los repositorios de BlackArch y así acceder a todo su software incluso tenemos el repositorio del código fuente en github y podéis compilar las aplicaciones. También se puede instalar en disco o en un USBLIve
Si queremos alojar algún archivo en la red, si alguien se lo descarga tendrá un tiempo ilimitado para poder hackear su cifrado.
Si el archivo es de nuestra propiedad, no solo lo podemos proteger con un cifrado estandar aes256 (o similar), sino que para aumentar dramáticamente su nivel de cifrado de forma muy sencilla. Usando estos dos métodos no tendremos nada que envidiar, a los niveles de encriptación militar.
Este método es para archivos privados donde no transmitiremos nuestra clave a nadie, ya que no es necesario.
La fortaleza de este método se basa, en romper una de las leyes del cifrado, una clave una sola solución. En nuestro caso haremos una clave con millones de millones de soluciones y además crearemos una clave, no de 128 bits, no de 256 bits, no de 512 bits sino de varios Kb o Megas. (Por que tu lo vales)
Consideraciones Importantes:
También es aconsejable si el archivo esta expuesto, usar un cifrado simétrico previo, consiguiendo así algo muy, muy desagradable de crackear.
El programa posterior leer archivos de modo binario, por lo que a pesar de ser imágenes en el ejemplo, en la realidad sirve para cualquier tipo de archivos.
Por último, para aumentar la seguridad al absurdo, no se debe usar siempre el mismo archivo de cifrado, han de ser parejasmonogámicas. Quiero decir que cada archivo tendrá su pareja de cifrado única, impidiendo el posterior análisis criptográfico si subimos un numero grande de archivos con el mismo cifrado.
En el ejemplo hay una condición para simplificar el código y que sea más fácil de entender, El archivo de cifrado ha de ser mayor que el que se cifra. Con un par de lineas adicionales esta limitación desaparecería.
En el siguiente vídeo probaré el programa de ejemplo, para la imagen del logo de Antergos y posteriormente con un archivo cifrado mediante aescrypt. El código lo podéis modificar para vuestra conveniencia y recordar cuanto más aleatorio es el archivo de cifrado mas cerca del imposible esta su descifrado.
Ejemplo de cifrado/decifrado con Imágenes.
Ingredientes para la destrucción controlada:
Archivo a cifrar.
Archivo para cifrado de mayor tamaño al anterior.
Programa de cifrado y descifrado.
El ejemplo sera muy sencillo, lo mostraremos para una imagen, que es más visual e intuitivo. Pero lo ideal es cifrar el archivo primero por un cifrado simétrico estándar y luego añadir muestra capa de destrucción controlada.
Archivo Foto.jpg, archivo Original en mi caso usare una de Antergos mi S.O.
Foto.jpg
Archivo para cifrar FotoKey.jpg
FotoKey.png
Programa Cifrado/descifrado.(Al usar XOR es prácticamente lo mismo)
#include<iostream>
#include<fstream>
using namespace std;
// El programa encripta origen mediante cifrado XOR con origen2
// origen 2 debe ser mayor que origen en esta versión
// El resultado se escribirá en destinoint
main(){// Abrimos los ficheros origen y origen2 en modo lectura
// Abrimos destino en modo estritura
// puedes cambiar Foto.jpg , FotoKey.png, CopiaSegura.jpg por los que tu quieras
Para descifrar es el mismo programa cambiando [Foto.jpg por CopiaSegura.jpg ) y (CopiaSegura.jpg por CopiaDescifrada.jpg), FotoKey.png no se altera
#include<iostream>
#include<fstream>
using namespace std;
// El programa encripta origen mediante cifrado XOR con origen2
// origen 2 debe ser mayor que origen en esta versión
// El resultado se escribirá en destino
int main(){
// Abrimos los ficheros origen y origen2 en modo lectura
// Abrimos destino en modo estritura
// puedes cambiar Foto.jpg , FotoKey.png, CopiaSegura.jpg por los que tu quieras
Usar esta segunda capa de cifrado produce una destrucción de los datos del programa, si el original estaba cifrado, reconstruirlo es prácticamente imposible. Para archivos sensibles que estén expuestos es ideal, ya que el criptoanálisis que le pudieran hacer, se lo hacen a un archivo incompleto del que no saben que tipo de cifrado se ha usado o con que programa se ha encriptado.
El código se puede mejorar pidiendo los archivos desde consola, o añadiendo algún tipo de GUI. Pero en lo básico seguirá siendo similar.
Espero que les sirva de ayuda y deja un comentario si deseas alguna aclaración. Gracias
La esteganografía (del griego στεγανος steganos, “cubierto” u “oculto”, y γραφος graphos, “escritura”) trata el estudio y aplicación de técnicas que permiten ocultar mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. Es decir, procura ocultar mensajes dentro de otros objetos y de esta forma establecer un canal encubierto de comunicación, de modo que el propio acto de la comunicación pase inadvertido para observadores que tienen acceso a ese canal. (wiki)
El cifrado digital de mensajes tiene una variante que consiste en introducir un mensaje dentro de otro medio para que este pase desapercibido. Se utilizan imágenes, audios y vídeos. Cualquier medio digital es susceptible de portar mensajes.
Descripción del programa
Trabajaremos con Steghide, aplicación para Linux, que desde el terminal nos permitirá ocultar mensajes cifrados en archivos JPEG, BMP, WAV. En nuestro caso usaremos una imagen jpg. El software ha sido desarrollado gracias a la iniciativa de Stefan Hetzl y se aloja en la siguiente dirección: http://steghide.sourceforge.net/index.php
Para saber mas sobre ella nos fijaremos en sus dependencias:
libmhash Contiene los algoritmos tipo hash para generación de contraseñas. y archivos de verificación.
libmcrypt Esta librería contiene algoritmos simétricos comunes como son: aes, twofish,…
libjpeg Nos dará la capacidad de comprimir y descomprimir imágenes.
zlib Libreria para comprimir y descomprimir mensajes.
Además tenemos el manual en Ingles y castellano gracias a la traducción de “Alberto Adrián Schiano” (Muchas gracias por tu gran trabajo) Manual
Como usar steghide
Los ejemplos que mostrare a continuación se realizan sobre la imagen Descanso.jpg, también crearemos un archivo de texto (Mensaje.txt) con el mensaje que deseamos esconder. El programa podéis instalarlo del repositorio de vuestra distro.
Imagen Original
Sin mensaje oculto
Primer comando steghide –encinfo nos muestra todos los algoritmos disponible (heredados de la libreria libmcrypt)
Hoy aplicaremos un tipo de cifrado basado en un operador lógico XOR. Programaremos en C++ y compilaremos desde el terminal.
El operador XOR opera a nivel de bit A ^ A = 1 A ^ B = 0 (A ^ B) ^ B = B
Como ejemplo aplicaremos a la palabra nuke el operador XOR (la contraseña de cifrado que usaremos bull)
Cifrado XOR
En este tipo de cifrado, si se vuelve a cifrar una segunda vez con la misma clave obtengo el mensaje original. Usado de forma aislada como único método de cifrado es muy débil, pero esta incluido en algoritmos más complejos como puede ser AES.
Programa de cifrado usando XOR
Crearemos un archivo llamado XOR.cpp
El programa nos debe pedir la frase de cifrado y la clave.
Debe aplicar el operador XOR bit a bit.
Nos mostrará por pantalla como se va aplicando el operador letra a letra y la frase final cifrada.
Puedes copiarlo y pegarlo con cualquier editor de texto para hacer modificaciones y pruebas
#include <iostream>
#include <string>
using namespace std;int main(){// Variables
int a,b,c;
int i,j;
string frase;
string clave;string res;//Entrada de Datos
cout << “Este programa encripta una frase usando el operador XOR”;
cout << “n”;
cout << “Introduce la frase para encriptarn”;
getline(cin,frase);
cout << “clave:”;
cin >> clave;
res = frase;//Se aplica el operador XOR
for(i = 0; i < frase.length() ; i++){
a = int (frase[i]);
j = i % clave.length();
b = int (clave[j]);
c = a ^ b;
res[i] = char( c );
Compilamos desde el terminal usando; g++ -o XOR XOR.cpp
Y ejeculamos ./XOR
En el ejemplo usaremos como frase para cifrar: nukebull y clave: +-*
Y lo volveremos a aplicar una segunda vez al resultado con la misma clave para probar que obtenemos la frase original.
[nukebull XOR]$ g++ -o XOR XOR.cpp
[nukebull XOR]$ ./XOR
Este programa encripta una frase usando el operador XOR
Introduce una frase para encriptar
nukebull
clave:+-*
n XOR + = E
u XOR - = X
k XOR * = A
e XOR + = N
b XOR - = O
u XOR * = _
l XOR + = G
l XOR - = A
La frase encriptada es:
EXANO_GA
[nukebull XOR]$ ./XOR
Este programa encripta una frase usando el operador XOR
Introduce una frase para encriptar
EXANO_GA
clave:+-*
E XOR + = n
X XOR - = u
A XOR * = k
N XOR + = e
O XOR - = b
_ XOR * = u
G XOR + = l
A XOR - = l
La frase encriptada es:
nukebull
Cualquier consulta estaré encantado de responderos.
Esta entrada es para la consola de Linux Empezaremos viendo que es GnuPG y como se utiliza gpg para cifrar de forma simétrica. Crearemos scripts a modo de ejemplo
GnuPG
GNU Privacy Guard (GnuPG o GPG) es una herramienta de cifrado y firmas digitales desarrollado por Werner Koch, que viene a ser un reemplazo del PGP (Pretty Good Privacy) pero con la principal diferencia que es software libre licenciado bajo la GPL. GPG utiliza el estándar del IETF denominado OpenPGP. (Wiki)
Es un software utilizado para encriptación asimétrica , muy útil para enviar correo cifrado, y para firmar documentos. Desde la consola lo utilizaremos mediante el comando gpg. Presente en casi todas las distribuciones de Linux. Aconsejo usar el repositorio de tu distro si aún no lo tienes.
Cuando trabajamos con encriptación simétrica, una clave muy débil invalida la fortaleza de cualquier algoritmo. Aconsejo mirar anterior entrada Encriptacion Simetrica
Para entornos gráfico recomiendo Kleopatra, buena donde las haya esta aplicación.
¿Que algoritmos puedo usar?
Para ver con que algoritmos contamos en nuestro PC escribamos en la consola:
gpg –version
gpg (GnuPG) 2.2.10 libgcrypt 1.8.3 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
-a Armadura ASCII (no es necesario, solo si se desea)
–cipher-algo elije el algoritmo de cifrado, en el ejemplo twofish (si no se pone elige AES256 por defecto, para la versión actual de gpg)
Crear varias capas usando un script de Bash
Supongamos que tenemos El archivo Datos.txt y lo tenemos que subir a Dropbox para la consulta con otras personas.
Lo cifraremos para que no sea de dominio publico. Y también usaremos vtres capas, con distintos algoritmos, por si un de ellos fuese roto en el futuro, no tener los datos expuestos.
Primer script, se encarga de encriptar(en mi caso lo he llamado cripto, y le doy permisos con chmod +x cripto)
En mi caso para ejecutarlo ./cripto
#!/bin/bash
#Vicente Parra #www.nukebull.com # Encriptador por capas camellia256 + twofish + AES256 + ARMOR ASCII
# borra los fichero intermedio two, si se desea omitir comentar la siguiente linea rm Datos.dos
La contraseña dentro del script
En el siguiente ejemplo la password no nos la pide, va dentro del script para veáis como se utiliza, es necesario poner –batch para que funcione en mi versión de gpg
#!/bin/bash
#Vicente Parra #www.nukebull.com # Encriptador por capas camellia256 + twofish + AES256 + ARMOR ASCII
El programa es sencillo, mediante una contraseña maestra, crea un archivo encriptado donde guardará el resto de claves. También permite generar contraseñas seguras mediante un generador de contraseña.Se pueden ordenar por grupos.Para Linux en el repositorio encontrareis KeepasXC, con una GUI mejorada.
En el vídeo anterior se ve una muestra de como funciona.
Portabilidad
El archivo .kdbx contiene todas las claves, este mismo archivo lo podremos abrir desde el PC o desde el Movil,. Si no queremos pasarlo con todas las contraseñs, abrimos una copia borramos lo que no queremos que llegue al móvil y guardamos con otro nombre.
Por ejemplo podemos crear archivos; movil.kdbx, bancos.kdbx, foros.Kbdx si no las queremos en uno solo.
La criptografía es una palabra de origen griego (κρύπτos (kryptós), «oculto», y γραφή (graphé), «grafo» o «escritura») que significa escritura oculta.
Un ejemplo sencillo de entender, seria invertir las palabras, aunque facil de descifrar.
Que buen dia>>>> Euq neub aid.
Esta entrada esta orientada a usuarios domestico, para puedan crear contraseñas seguras, guardar fotos y archivos. También pequeñas empresas que quieran guardar archivos de forma segura.
Daré prioridad a programas que estén en Windows y sean gratuitos, ye que son más accesible para todos.
También creare posteriormente otra entrada para Linux con script para bash usando criptografía híbrida, con un nivel menos básico.
La criptografía la podemos dividir en tres grandes grupos; Simétrica, Asimétrica e Híbrida (mezcla de las dos anteriores).
En esta entrada nos centraremos en la criptografía simétrica, como es, como usarla y que programas utilizar.
¿Que es la Criptografía Simétrica ?
Hablaremos de criptografía simétrica cuando con la misma clave podremos encriptar el mensaje (hacerlo oculto) y desencriptar (hacerlo visible).
Se utiliza principalmente para guardar archivos, guardar las contraseñas, subir archivos a la nube.
En el mundo actual donde prácticamente todo esta informatizado, existen métodos muy seguros al alcance de todos.
¿Dónde reside la fortaleza de este tipo de encriptación?
La forma más común de romper este tipo de encriptación se llama fuerza bruta, es simplemente probar claves hasta dar con ella o buscarla en un archivo, con las claves mas utilizadas. La fortaleza de este sistema esta en la clave, si esta es muy sencilla o son nombres comunes tu clave es poco efectiva o vulnerable.
Por tanto, es necesario crear una clave difícil, unas 24 cifras, incluyendo números, mayúsculas y minúsculas, (128 bits), con este tipo de claves tu archivo se puede considerar secreto con los actuales algoritmos o métodos de cifrado. Este seria un tipo de clave segura: jPChasLdbPeGbX4vYs62wuSU En este tipo de cifrado lo más importante es la clave, independientemente del programa utilizado.
También es muy importante guardar la clave de forma segura, más abajo veremos gestores de contraseñas.
¿Qué algoritmo/método usar?
Normalmente a nivel usuario domestico aconsejo AES128 o AES256 es un estandar que encontrareis en la mayoria de programas y aún no se ha roto.
Existen más algoritmos para cifrar nuestros archivos, los más comunes son Twofish, Ghost,camellia,.. Todos a dia de hoy son muy buenos.
Para el usuario común, usando AES128 y una buena clave será suficiente, de echo este nivel de encriptación lo usan estados y empresas importantes.
Si eres de los que guarda tus datos comprometidos en la red o eres un poco paranoico, es aconsejable usar varias capas, si un algoritmo se consigue romper el otro u otros lo protegerán.
¿Programas para cifrar?
En esta entrada pondré varios programas de encriptación que estoy usando desde hace tiempo con muy buen resultado. En posteriores entradas explicare cada uno de ellos individualmente explicando como se utilizan.
Gestor de contraseñas: KeePass Password Safe
Es gratuito y lo encontramos en cualquier plataforma incluido Android. Te permite guardar todas tus contraseñas de forma segura. Enlace en el Blog Keepass Password Safe
Cifrar archivos: AES Crypt es gratuito y sencillo de utilizar, junto a un programa para comprimir archivos (wiinzip, winrar, 7zip, Tar) tendremos una poderosa herramienta. Permite cifrar cualquier archivo con el botón derecho del ratón.
Guardar archivos en la nube (Cloud): Cryptomator es gratuito en versión PC y de pago para IOS y Android (4.99€) Todos tus archivos en Dropbox, Drive, .. estarán cifrados y tan solo tu podrás verlos.
Caja de Seguridad,/Disco virtual Encriptado: Veracrypt es gratuito y con muchas opciones. Crea un archivo cifrado del tamaño que configures y lo podrás abrir como si fuera otro disco duro.
Estos cuatros programas gratuitos nos permitirán guardar información de forma segura y ser nosotros los dueños de nuestra intimidad.
Hay otros programas de pago, algunos muy buenos, que se tratarán en otras entradas. También mira tu antivirus, puede que tenga funciones de encriptación incluidas.
Si necesitáis ayuda, pon un comentario o mándame un email. Os contestare encantado