Hardening AES256 – CrypText

Castellano.

Ú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.

Haskell. Veni Vidi Vici

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.

— Copyright (C) 2019 Vicente Parra Hurtado – NukeBull — Licencia GPL 3


import Data.Char

— Creamos el alfabeto Latín Antiguo

alfabeto :: [Char]
alfabeto = [‘A’..’I’]++[‘K’..’T’]++[‘V’]++[‘X’..’Z’]

— 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”

Haskell, ¿donde esta for?.

Vamos a ir desarrollando pequeños programas en Haskell, para que podáis aprender conmigo a programar en este lenguaje. Nos servirá para aprender juntos y motivarnos a seguir escribiendo código.

Hoy vamos a crear un ejemplo básico pero instructivo, crearemos un programa para generar números primos, pero para los que vengáis de otros sistemas echareis de menos algo que siempre habéis usado, el muy conocido “for”, tan usado en otros lenguajes.

¿Deberiamos tener for en haskell?

Si vienes de otros lenguajes, la primera piensas que algo pasa, que no puede ser ¿como no puede haber for aquí? La respuesta es sencilla, por que no lo necesitamos, la programación funcional nos da unas herramientas muy potentes que nos harán olvidar a nuestro querido for.

Los que tengáis una base de matemáticas importante estaréis acostumbrados a este tipo de expresiones.

mathrm{mathsf{mathrm{S={2cdot xleft|: xinmathbb{N},: xleq10right.}}}}

En haskell gracias a las listas intencionales podemos definir conjuntos de una forma similar. [x*2 | x <- [1..10]]. Este ejemplo ha sido sacado de una de las mejores guías de Haskell en castellano: http://aprendehaskell.es/

Programar sin for.

El programa de ejemplo nos permitirá calcular los números primos entre 1 y otro que nosotros definamos.

Un número es primo cuando solamente es divisible por la unidad y por el mismo. 17 seria primo. 12 no lo seria, es divisible por 1,2,3,4 y 6.

http://www.nukebull.com
— El código genera todos los números primos entre el 1 y n

— Definimos cuantos divisores tiene un número, exceptuando el numero 1 y el mismo, mediante la función mod (modulo entero)

divisores :: Int -> [Int]
divisores y = [x | x <- [2..y-1], mod y x == 0]

— Es la función nos muestra todos los números entre 1 y n que cumplen la condición de no tener divisores (excepto 1 y n).

numerosprimos :: Int -> [Int]
numerosprimos y = [x | x <- [1..y], (divisores x)== []]

— Pediremos un numero n por terminal mediante getLine

main = do
putStrLn “¿Hasta qué número desea buscar?”
n <- getLine
let num = read(n)

— Mostramos por pantalla nuestros resultados.


putStrLn “Aquí los tiene “
putStrLn (show(numerosprimos num))

Lo guardamos como NumerosPrimos.hs y ejecutamos.

runhaskell NumerosPrimos.hs
¿Hasta qué número desea buscar?
80
Aquí los tiene
[1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79]

Como podemos apreciar no hemos usado for, debemos aprender a enfrentarnos a los problemas de forma funcional.

Whonix, la puerta a la Red Tor, corriendo sobre Antergos Linux (ArchLinux)

Whonix es una distribución basada en Debian que esta diseñada para correr en maquinas virtuales. Por tanto es posible utilizarla en Windows, Mac y LInux.

La página el proyecto es: https://www.whonix.org/y desde ella os la podéis descargar.

Esta basada en la navegación a través de la Red Tor y del uso de aplicaciones para pasar inadvertidos en la red.

Para los que buscáis una distro para hacking, texting de seguridad, esta no es de ese tipo, solo se limita a pasar inadvertido en la red, que no es poco en estos días

Os dejo un vídeo para que veáis como se instala y como funciona. Cualquier duda no dudeis en dejarme el comentario y os contestare.

BlackArch Linux Penetration Testing Distribution

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

Pagina del proyecto/Distro : https://blackarch.org

Para su instalación Instalar BlackArch.

Repositorio en GitHub: GitHub de BlackArch.

BlackArch Linux  Penetration Testing Distribution
BlackArch Linux Penetration Testing Distribution

Visual Studio Code para Haskell – (Arch Linux)

Hoy muestro uno de los mejores editores para programar en haskell que he probado.

Es un viejo conocido que recientemente libero Microsorft. Visual Studio Code.

Como soy usuario de Antergos Linux,  os mostrare la instalación de este editor y de su extensión para haskell, en distribuciones basadas en Arch Linux.

Os dejo un vídeo para que os animéis a instalarlo, es muy sencillo y rápido. para los que uséis otro lenguaje de programación como Pythom el procedimiento es el mismo.

Para los que tengáis otras distros o S.O. os aconsejo utilizar Visual Studio Code para haskell.

 

Enlace de VSC.

Visual Studio Code

Enlace de Antergos Linux.

Antergos Linux

Backup automatizado para Arch Linux. ClamAv, rsync y cronie

Aprenderemos a automatizar nuestros backups en Arc Linux y derivados, usando tres aplicaciones de software libre.

  • ClamAV antivirus de libre disposición para limpiar nuestros dispositivo de huéspedes indeseables.
  • rsync potente herramienta para la transferencia y sincronización de archivos. Admite sincronización mediante ssh para transferencias a host remoto.
  • cronie (derivado de cron en ArchLinux) que permite programar o automatizar tareas.

A día de hoy, una de las mejores herramientas de seguridad, a mi entender, sigue siendo el BackUp. La copia de seguridad nos permitirá viajar atrás en el tiempo hasta ese momento en que todo era maravilloso. No hacerlo es asumir muchos e indeseables riesgos.

En mi caso y para que os sirva de ejemplo, haremos una copia de seguridad de mis carpeta Programación, donde guardo archivos que no quiero perder, en el primer vídeo también cifraremos el dispositivo usb usando la aplicación que viene por defecto en gnome; gnome-disks, ( en KDE hay una similar, pero si queréis usar la misma os pongo abajo como instalarla)

Que haremos realmente
  1. Pasaré un antivirus sobre la carpeta origen y destino.
  2. Guardare los logs del antivirus en archivos de texto.
  3. Usare solo Software libre. (cronie + antivirus ClamAV  + rsync ).
  4. En caso de  que sean datos sensibles, podríamos cifrar el dispositivo donde alojemos los backups.
  5. Usare un USB externo  en el que tendré 3 backups de la misma carpeta (diario, semanal, mensual).
  6. Realizare script de automatización que se ejecutara creando las copias de seguridad (mediante cronie).
Resumen de aplicaciones a instalar (también se puede hacer desde el gestor de paquetes):
  • Primero actualizar pacman sudo pacman -Syu
  • ClamAv, Antivirus. sudo pacman -S clamav 
  • rsync  sudo pacman -S rsync
  • cronie, gestor de tareas. sudo pacman -S cronie
  • Para cifrar almacenamiento externo externo uso el que viene en gnome instalado. sudo pacman -S gnome-disks

CIfrado (opcional)

Si deseamos cifrar seria el primer paso, el cual es dependiente del resto y opcional. (Ver video)

ANTIVIRUS (I)

Instalacion:

Instalaremos ClamAv desde terminal previa  actualización de pacman

  • sudo pacman -Syu
  • sudo pacman -S clamav 

para actualizar la base de datos del antivirus si no lo automatizamos:

sudo freshclam

Automatización del las actualizaciones del Antivirus ClamAV

Para que se  actualice ell antivirus cada vez que iniciemos el sistema. Equivale a hacer sudo freshclamen en cada inicio.

  • sudo systemctl start clamav-freshclam.service
  • sudo systemctl enable clamav-freshclam.service
Sinraxis y comandos usados.
  •  clamscan -r ORIGEN -l /DESTINOLOG
  • -r es recursivo escanea también las subcarpetas.
  • -l crea un archivo de texto con los datos del análisis.

 

Backup (II)

Instalacion.

Hemos elegido rsync por su velocidad y estabilidad, ademas de estar disponible en multitud de distribuciones y S.O.

  • sudo pacman -S rsync
Sintaxis y comandos de rsync.

La sintaxis es: rsync [opciones] origen destino

Pongo los comandos más usuales solamente, para ampliar usar rsync –help o mirara la bibliografía.

  • -a modo archivo, este modo permite copiar archivos de forma recursiva aceptando enlaces simbólicos, permisos, propiedad del usuario y grupo, así como las fechas de acceso.
  • -v muestra información en pantalla sobre las acciones que se realizan.
  • -r recursivo, realiza la copia de archivos de forma recursiva dentro de los directorios, pero no copia los permiso, los datos de las fechas de accesos o modificación de los archivos.
  • -z comprime los datos antes de enviarlos, lo que puede hacer más rápidas las transferencias entre hosts remotos, para rutas locales no proporciona ninguna ventaja usar esta opción.
  • -P Muestra el progreso de las transferencias.
  • — delete borra archivos que no estén en el origen.

 

Scripts (III).

Yo lo guarde como como BackUpDiario.sh, BackUpSemanal.sh y BackUpMensual.sh

Luego le di permisos mediante.

chmod +x BackUpDiario.sh BackUpSemanal.sh BackUpMensual.sh

El script parece más grade, porque lo he comentado todo, para que lo veáis mas claro. Estas son las instrucciones que lo componen.

  • Pasamos antivirus al Origen y guardamos el log: clamscan -r /home/nukebull/Programacion/ -l /home/nukebull/Logs/backupDiario.txt
  • Sincronizamos Archivos: rsync -a –delete /home/nukebull/Programacion/ /run/media/nukebull/401D-1A0E/BackUpDiario/
  • Pasamos antivirus al Destino y guardamos el log:clamscan -r /run/media/nukebull/401D-1A0E/BackUpDiario/ -l /home/nukebull/Logs/backupDiarioBackUp.txt
  • se añaden también dos instrucciones echo para ordenar los log del antivirus.

 

BackUpDiario.sh

#!/bin/bash

#Vicente Parra
#www.nukebull.com

# Pasamos el antivirus a la carpeta origen y guardamos los datos (log y fecha) en un archivo de texto

#escribimos en archivo log la fecha para tenerlo ordenado
echo -e “n Fecha del Backup :n” >> /home/nukebull/Logs/backupDiario.txt
echo `date` >> /home/nukebull/Logs/backupDiario.txt

# ejecutamos antivirus
clamscan -r /home/nukebull/Programacion/ -l /home/nukebull/Logs/backupDiario.txt

# Sincronizamos rsync -a –delete carpeta_origen/ carpeta_destino/ -vP ver datos des ploceso y program -delete hace pocias identicas al borrar los archivos distintos en destino
#rsync -avP –delete /home/nukebull/Programacion/ /run/media/nukebull/401D-1A0E/BackUpDiario/

rsync -a –delete /home/nukebull/Programacion/ /run/media/nukebull/401D-1A0E/BackUpDiario/

# Pasamos el antivirus a la carpeta de destino y guardamos los datos (log y fecha) en un archivo de texto

#escribimos en archivo log la fecha para tenerlo ordenado
echo -e “n Fecha del Backup : n” >> /home/nukebull/Logs/backupDiarioBackUp.txt
echo `date` >> /home/nukebull/Logs/backupDiarioBackUp.txt

# ejecutamos antivirus
clamscan -r /run/media/nukebull/401D-1A0E/BackUpDiario/ -l /home/nukebull/Logs/backupDiarioBackUp.txt

 

BackUpSemanal.sh

#!/bin/bash

#Vicente Parra
#www.nukebull.com

# Pasamos el antivirus a la carpeta origen y guardamos los datos (log y fecha) en un archivo de texto

#escribimos en archivo log la fecha para tenerlo ordenado
echo -e “n Fecha del Backup :n” >> /home/nukebull/Logs/backupSemanal.txt
echo `date` >> /home/nukebull/Logs/backupSemanal.txt

# ejecutamos antivirus
clamscan -r /home/nukebull/Programacion/ -l /home/nukebull/Logs/backupSemanal.txt

# Sincronizamos rsync -a carpeta_origen/ carpeta_destino/ // en esta omitimos –delete -v -P

rsync -a /home/nukebull/Programacion/ /run/media/nukebull/401D-1A0E/BackUpSemanal/

# Pasamos el antivirus a la carpeta de destino y guardamos los datos (log y fecha) en un archivo de texto

#escribimos en archivo log la fecha para tenerlo ordenado
echo -e “n Fecha del Backup : n” >> /home/nukebull/Logs/backupSemanalBackUp.txt
echo `date` >> /home/nukebull/Logs/backupSemanalBackUp.txt

# ejecutamos antivirus
clamscan -r /run/media/nukebull/401D-1A0E/BackUpSemanal/ -l /home/nukebull/Logs/backupSemanalBackUp.txt

 

BackUpMensual.sh

#!/bin/bash

#Vicente Parra
#www.nukebull.com

# Pasamos el antivirus a la carpeta origen y guardamos los datos (log y fecha) en un archivo de texto

#escribimos en archivo log la fecha para tenerlo ordenado
echo -e “n Fecha del Backup :n” >> /home/nukebull/Logs/backupSemanal.txt
echo `date` >> /home/nukebull/Logs/backupSemanal.txt

# ejecutamos antivirus
clamscan -r /home/nukebull/Programacion/ -l /home/nukebull/Logs/backupSemanal.txt

# Sincronizamos rsync -rvuc carpeta_origen/ carpeta_destino/ en esta omitimos –delete -v -P

rsync -a /home/nukebull/Programacion/ /run/media/nukebull/401D-1A0E/BackUpSemanal/

# Pasamos el antivirus a la carpeta de destino y guardamos los datos (log y fecha) en un archivo de texto

#escribimos en archivo log la fecha para tenerlo ordenado
echo -e “n Fecha del Backup : n” >> /home/nukebull/Logs/backupSemanalBackUp.txt
echo `date` >> /home/nukebull/Logs/backupSemanalBackUp.txt

# ejecutamos antivirus
clamscan -r /run/media/nukebull/401D-1A0E/BackUpSemanal/ -l /home/nukebull/Logs/backupSemanalBackUp.txt

Configuración de la  programación diaria, semanal y mensual (IV).

Instalamos en el sistema el daemon de cronie:

  • sudo systemctl start cronie
  • sudo systemctl enable cronie

Ejecutamos:

  • crontab -e

Sintasix: minutos(00-60), Horas(00-24),dia del mes en numero(1-31), mes en numero (1-12). Día de la semana(0-6), acción.

Y escribimos en el fichero que nos abre ( en mi caso abre nano como editor):

  • 15 20 * * * cd /home/nukebull/Programacion/Blog/ && ./BackUpDiario.sh
  • 10 20 * * 0 cd /home/nukebull/Programacion/Blog/ && ./BackUpSemanal.sh
  • 00 20 15 * * cd /home/nukebull/Programacion/Blog/ && ./BackUpMensual.sh

Para guardar en nano (Control + O), para salir (Control + X).

Bibliografía.

Sobre CalmAV.

Antivirus CamAV

Sobre rsync.

Comandos rsync

Ejemplos rsync

Configuracion cronnie – crontab.

cChuleta CronTab

 

Haskell, instalación en Arch Linux

Acabo de comenzar mis primeros pasos con este lenguaje de programación, funcional y distinto a otros en sintaxis y conceptos.

Os dejare referencias bibliográficas para los que empezáis como yo, también un video de como descargar e instalar el compilador y el entorno de desarrollo.

En las siguientes entradas y con el fin de practicar Haskel, los script o pequeños programas ya no serán escritos en C++, se escribirán en Haskell.

Instalación.

En mi caso soy usuario de Antergos una distribución basada en Arch Linux y mostrare como podéis instalarlo. Dejare referencias de como instalarlo en otras distribuciones. Así como donde descargarlo para Windows y MacOS.

Es importante para los que empezamos instalar lo mas básico y necesario el compilador ghci y cabal. Posteriormente instalaremos stack que es su entorno de desarrollo y ademas os añadirá muchas librerías.

sudo pacman -S ghc cabal-install happy alex haddock

sudo pacman -S stack

 

Bibliografía.

Primeramente la principal fuente, su propia pagina: https://www.haskell.org/

En la wiki nos explica de donde surgió el lenguaje y una breve descripción sobre él. https://es.wikipedia.org/wiki/Haskell

En mi caso, los primeros pasos los he dado siguiendo esta web y con estos libros.

Destrucción Controlada. Tus archivos, sólo para ti.

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 parejas monogá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
    Foto.jpg

     

  • Archivo para cifrar FotoKey.jpg

FotoKey.png
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
ifstream origen(“Foto.jpg”,ios::binary);
ifstream origen2(“FotoKey.png”, ios::binary);
ofstream destino(“CopiaSegura.jpg”,ios::binary);
// Defino las Variables Byte (origen) key(origen2)
// a,b,c se usarán para el cálculo XOR
char byte;
char key;
int a,b,c;
// Creamos un bucle para la lectura de datos
while( !origen.eof() && !origen.fail() && !origen2.eof() && !origen2.fail()){
origen.read((char *) & byte, sizeof(char));
origen2.read((char *) & key, sizeof(char));
if (origen.good()){
//Creo la máscara con XOR
a = int(byte);
b = int(key);
c = a ^ b ;
byte = char(c);
// Escribimos en el archivo de salida
destino.write((char *) & byte, sizeof(char));
}
}
// Cerramos los tres archivos
destino.close();
origen2.close();
origen.close();
return 0;
}

 

El programa esta en C++, para compilarlo y ejecutarlo desde el terminal:

 

[nukebull ]$ c++ -o CifradoXOR CifradoBinario.cpp
[nukebull]$ chmod +x CifradoXOR
[nukebull]$ ./CifradoXOR

 

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
ifstream origen(“CopiaSegura.jpg”,ios::binary);
ifstream origen2(“FotoKey.png”, ios::binary);
ofstream destino(“CopiaDescifrada.jpg”,ios::binary);
// Defino las Variables Byte (origen) key(origen2)
// a,b,c se usarán para el cálculo XOR
char byte;
char key;
int a,b,c;
// Creamos un bucle para la lectura de datos
while( !origen.eof() && !origen.fail() && !origen2.eof() && !origen2.fail()){
origen.read((char *) & byte, sizeof(char));
origen2.read((char *) & key, sizeof(char));
if (origen.good()){
//Creo la máscara con XOR
a = int(byte);
b = int(key);
c = a ^ b ;
byte = char(c);
// Escribimos en el archivo de salida
destino.write((char *) & byte, sizeof(char));
}
}
// Cerramos los tres archivos
destino.close();
origen2.close();
origen.close();
return 0;
}

 

El programa esta en C++, para compilarlo y ejecutarlo desde el terminal:

 

[nukebull ]$ c++ -o CifradoXORInv CifradoBinarioInverso.cpp
[nukebull]$ chmod +x CifradoXORInv
[nukebull]$ ./CifradoXORInv

 

Programa

Conclusión.

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

 

Steghide, mensajes ocultos (Esteganografía)

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)

[Steghide]$ ls
Descanso.jpg Mensaje.txt[Steghide]$ steghide –encinfo
algoritmos d/encriptado:
<algoritmo>: <formas reconocidas>…
cast-128: cbc cfb ctr ecb ncfb nofb ofb
gost: cbc cfb ctr ecb ncfb nofb ofb
rijndael-128: cbc cfb ctr ecb ncfb nofb ofb
twofish: cbc cfb ctr ecb ncfb nofb ofb
arcfour: stream
cast-256: cbc cfb ctr ecb ncfb nofb ofb
loki97: cbc cfb ctr ecb ncfb nofb ofb
rijndael-192: cbc cfb ctr ecb ncfb nofb ofb
saferplus: cbc cfb ctr ecb ncfb nofb ofb
wake: stream
des: cbc cfb ctr ecb ncfb nofb ofb
rijndael-256: cbc cfb ctr ecb ncfb nofb ofb
serpent: cbc cfb ctr ecb ncfb nofb ofb
xtea: cbc cfb ctr ecb ncfb nofb ofb
blowfish: cbc cfb ctr ecb ncfb nofb ofb
enigma: stream
rc2: cbc cfb ctr ecb ncfb nofb ofb
tripledes: cbc cfb ctr ecb ncfb nofb ofb

También es recomendable para saber el espacio que tenemos para ocultar el mensaje,

steghide –info Descanso.jpg

[Steghide]$ steghide –info Descanso.jpg
“Descanso.jpg”:
formato: jpeg
capacidad: 9,6 KB
Intenta informarse sobre los datos adjuntos? (s/n) n

¿Como introducir mensaje.txt en Descanso.jpg ?

Nos pedirá una contraseña desde el terminal (-cf fichero contenedor, -ef fichero embebido )

steghide embed  -cf Descanso.jpg -ef Mensaje.txt

Añadimos algunos argumentos para su funcionamiento

  • -z para el nivel de compresión (1-9)
  • -e tipo de algoritmo,
  • -p contraseña (passphrase).
  • -v información detallada (verbose).

steghide embed -e rijndael-256 -z 9 -v -p nukebull -cf Descanso.jpg -ef Mensaje.txt

[Steghide]$ steghide embed -e rijndael-256 -z 9 -v -p nukebull -cf Descanso.jpg -ef Mensaje.txt
leyendo archivo secreto “Mensaje.txt”… hecho
leyendo archivo d/portada “Descanso.jpg”… hecho
creando el gr�fico… 154 valores d/muestra, 567 v�rtices, 104113 bordes
ejecutando Static Minimum Degree Construction Heuristic… 99,8% (1,0) hecho

El proceso de extracción  lo realizaremos utilizando (-sf fichero esteganográfico) y nos creara el fichero oculto en la carpeta que ejecutemos.

esteghide extract -sf Descanso.jpg

[Steghide]$ steghide extract -sf Descanso.jpg
Anotar salvoconducto:
anot� los datos extra�dos e/”Mensaje.txt”.[Steghide]$ steghide –info Descanso.jpg
“Descanso.jpg”:
formato: jpeg
capacidad: 9,6 KB
�Intenta informarse sobre los datos adjuntos? (s/n) s
Anotar salvoconducto:
archivo adjunto “Mensaje.txt”:
tama�o: 59,0 Byte
encriptado: rijndael-256, cbc
compactado: si

Imagen Esteganográfica

password nukebull

Notas Importantes

  • Al subir imágenes a twiter, wassap, telegram,.. le aplican un algoritmo para comprimir jpg que destruye el menaje oculto. (comprobado)
  • Para no destruirlo lo podéis subir a Google Drive  (comprobado) Enlace G. Drive
  • La imagen subida en una pagina web también conserva el mensaje. La de esta pagina sirve de ejemplo.