AdaStegano: Esteganografía en Ada
Este es mi último proyecto, hecho 100% en Ada95 y disponible bajo licencia GPL.
Se trata de un programa de criptografía y esteganografía, que permite ocultar ficheros dentro de otros y cifrándolos mediante una contraseña.
¿Porqué esteganografía?
La esteganografía consiste en ocultar un mensaje dentro de otro.
AdaStegano permite ocultar cualquier tipo de fichero en imágenes bitmap de 24bpp, de forma que para una tercera persona no sepa que esa imagen contiene otro archivo. A partir de una contraseña definida por el usuario, se ocultan los datos en un orden aleatorio; sin esa contraseña, es casi imposible siquiera "ver" que hay un fichero oculto en su interior.
¿Porqué criptografía?
Porque aún sabiendo que hay un fichero oculto, una tercera persona no puede obtener el fichero. Aún conociendo el orden interno, los datos están codificados, y el fichero seguirá inaccesible e ilegible para alguien
que no conozca la contraseña con la que se cifraron los datos.
Funciones:
Cifrar archivos:
Permite ocultar y cifrar un archivo dentro de otro.
Se pedirá el método a utilizar, la ruta del fichero a ocultar, el archivo que contendrá el fichero anterior, la ruta "Guardar como..." y la contraseña.
Un archivo BMP de 24bpp puede almacenar en su interior otro archivo de su octava parte de tamaño, aproximadamente.
Descifrar archivos:
Permite obtener el archivo oculto.
Se pedirá el método a utilizar, la ruta del fichero contenedor, la contraseña,
y las opciones para restaurar el archivo oculto: Sobreescribir (si ya existe un fichero con el mismo nombre, se sobreescribe), Renombrar (si ya existe un fichero con el mismo nombre, se renombra con extensión diferente) y Guardar como (el usuario especifica la ruta y el nombre del fichero a obtener y lo guarda como tal).
Con el asistente el archivo se guardará con la opción "Renombrar".
Metodos
Por el momento AdaStegano incorpora dos métodos de cifrado para dificultar la labor de un atacante por descubrir y leer el archivo oculto.
Ambos métodos tienen en común que se guarda la información en un orden aleatorio según la contraseña; un ataque a esto por fuerza bruta es casi impracticable. Además, AdaStegano codifica la información de dos maneras:
- Metodo Cesar:
Una vez decidido el orden en el que se guardará la información, se codifica la información con dos métodos seguidos: el método Cesar de desplazamiento y un xor byte a byte con la contraseña.
- Metodo Serpent:
Una vez decidido el orden en el que se guardará la información, se codifica la información dividiendola en trozos de 16 bytes (128 bits) y cifrando cada trozo usando un algoritmo AES candidato (Serpent).
AdaStegano funciona tanto en Linux como en Windows, con el mismo código fuente (excepto por un paquete de manejo de consola, que hay que usar uno u otro según el SO). La versión en consola se puede ejecutar tanto por comandos (y automatizarlo por lotes, por ejemplo) como con un asistente intuitivo.
Además hay una versión gráfica, desarrollada con JEWL para Windows.
La versión actual es la 0.2 y se encuentra disponible para descargar en Canal Ada, que ha proporcionado alojamiento para el programa.
Binarios para Linux
http://www.canalada.org/recursos/adaste ... ux_bin.zip
Binarios para Windows
http://www.canalada.org/recursos/adastegano_win_bin.zip
Codigo fuente (v0.2)
http://www.canalada.org/recursos/adastegano_source.zip
Codigo fuente antiguo (v0.1)
http://www.canalada.org/recursos/adaste ... e_v0.1.zip
Hay un archivo odt (de OpenOffice.org) que sirve de documentación sobre algunos algoritmos usados, y ayuda a comprender como está hecho AdaStegano y que partes necesitan mejoras.
Sigo trabajando en el código, por ahora he conseguido mejorar el método Serpent, de forma que no ocupe el doble de espacio (además, al ocultar los caracteres hexadecimales en 4 bits en vez de 8 (ASCII) dificulta que se pueda hacer un análisis para sacar la información). Esto que acabo de mencionar NO está implementado todavía en el código fuente que está disponible para descargar; si alguien lo quiere, que me lo diga y le pasaré lla nueva implementación gustosamente.
Espero hacer más cambios (y si alguien se anima a colaborar, con código cambiado o ideas nuevas, serán bienvenidas) para sacar pronto la versión 0.2 (y si no, la sacaré como 0.1b o algo así :p).
Screens:

Se trata de un programa de criptografía y esteganografía, que permite ocultar ficheros dentro de otros y cifrándolos mediante una contraseña.
¿Porqué esteganografía?
La esteganografía consiste en ocultar un mensaje dentro de otro.
AdaStegano permite ocultar cualquier tipo de fichero en imágenes bitmap de 24bpp, de forma que para una tercera persona no sepa que esa imagen contiene otro archivo. A partir de una contraseña definida por el usuario, se ocultan los datos en un orden aleatorio; sin esa contraseña, es casi imposible siquiera "ver" que hay un fichero oculto en su interior.
¿Porqué criptografía?
Porque aún sabiendo que hay un fichero oculto, una tercera persona no puede obtener el fichero. Aún conociendo el orden interno, los datos están codificados, y el fichero seguirá inaccesible e ilegible para alguien
que no conozca la contraseña con la que se cifraron los datos.
Funciones:
Cifrar archivos:
Permite ocultar y cifrar un archivo dentro de otro.
Se pedirá el método a utilizar, la ruta del fichero a ocultar, el archivo que contendrá el fichero anterior, la ruta "Guardar como..." y la contraseña.
Un archivo BMP de 24bpp puede almacenar en su interior otro archivo de su octava parte de tamaño, aproximadamente.
Descifrar archivos:
Permite obtener el archivo oculto.
Se pedirá el método a utilizar, la ruta del fichero contenedor, la contraseña,
y las opciones para restaurar el archivo oculto: Sobreescribir (si ya existe un fichero con el mismo nombre, se sobreescribe), Renombrar (si ya existe un fichero con el mismo nombre, se renombra con extensión diferente) y Guardar como (el usuario especifica la ruta y el nombre del fichero a obtener y lo guarda como tal).
Con el asistente el archivo se guardará con la opción "Renombrar".
Metodos
Por el momento AdaStegano incorpora dos métodos de cifrado para dificultar la labor de un atacante por descubrir y leer el archivo oculto.
Ambos métodos tienen en común que se guarda la información en un orden aleatorio según la contraseña; un ataque a esto por fuerza bruta es casi impracticable. Además, AdaStegano codifica la información de dos maneras:
- Metodo Cesar:
Una vez decidido el orden en el que se guardará la información, se codifica la información con dos métodos seguidos: el método Cesar de desplazamiento y un xor byte a byte con la contraseña.
- Metodo Serpent:
Una vez decidido el orden en el que se guardará la información, se codifica la información dividiendola en trozos de 16 bytes (128 bits) y cifrando cada trozo usando un algoritmo AES candidato (Serpent).
AdaStegano funciona tanto en Linux como en Windows, con el mismo código fuente (excepto por un paquete de manejo de consola, que hay que usar uno u otro según el SO). La versión en consola se puede ejecutar tanto por comandos (y automatizarlo por lotes, por ejemplo) como con un asistente intuitivo.
Además hay una versión gráfica, desarrollada con JEWL para Windows.
La versión actual es la 0.2 y se encuentra disponible para descargar en Canal Ada, que ha proporcionado alojamiento para el programa.
Binarios para Linux
http://www.canalada.org/recursos/adaste ... ux_bin.zip
Binarios para Windows
http://www.canalada.org/recursos/adastegano_win_bin.zip
Codigo fuente (v0.2)
http://www.canalada.org/recursos/adastegano_source.zip
Codigo fuente antiguo (v0.1)
http://www.canalada.org/recursos/adaste ... e_v0.1.zip
Hay un archivo odt (de OpenOffice.org) que sirve de documentación sobre algunos algoritmos usados, y ayuda a comprender como está hecho AdaStegano y que partes necesitan mejoras.
Sigo trabajando en el código, por ahora he conseguido mejorar el método Serpent, de forma que no ocupe el doble de espacio (además, al ocultar los caracteres hexadecimales en 4 bits en vez de 8 (ASCII) dificulta que se pueda hacer un análisis para sacar la información). Esto que acabo de mencionar NO está implementado todavía en el código fuente que está disponible para descargar; si alguien lo quiere, que me lo diga y le pasaré lla nueva implementación gustosamente.
Espero hacer más cambios (y si alguien se anima a colaborar, con código cambiado o ideas nuevas, serán bienvenidas) para sacar pronto la versión 0.2 (y si no, la sacaré como 0.1b o algo así :p).
Screens:
