lunes, 28 de diciembre de 2015

¿Cómo puedo encriptar archivos y mensajes de manera simple?

En una serie de exposiciones en el Círculo de Oficiales durante la primera semana de mayo de 1944, Juan Perón expone la necesidad de contar con un sistema de cifrado para los mensajes tácticos y estratégicos de la lucha, y dicta cómo realizar dicho cifrado táctico en Ubuntu.


¡Camaradas de armas!

Una oligarquía cipaya y vendepatria no ha hecho mas que encaramarse espuriamente en el poder, lo que nos llamó a aunar esfuerzos para combatirla. Para ello, hubimos de emplear todas las herramientas puestas a nuestra disposición.

Nuestras consignas son públicas y sabidas por todos. Sin embargo, nuestra acción de conducción ha de prevenir ciertos esquemas que podrían ser perjudiciales para la Acción de Masas que hemos de emprender.

Esto es así porque en conducción de la acción, ha de lograrse la condición potenciadora requerida para toda victoria, la condición de la sorpresa en tiempo y en terreno.

La sorpresa se plantea a nivel táctico, pero se decide a nivel estratégico. Es por ello que debemos plantearnos necesariamente un accionar sorpresivo en la mayor cantidad de niveles de la acción política si es que queremos vencer. Quien no tenga la sorpresa, será siempre derrotado o sufrirá un desgaste tal en su accionar que poco provecho obtendrá de lo que gane. Esto, que se conoce desde los tiempos de Aníbal, ha de repercutir hoy con mucho más fuerza que nunca.

Señores, a nivel táctico habremos de dar apreciaciones, analizar factibilidades de lugar, plantear acciones de conjunto y desarrollarlas de manera que hagan trastabillar a un enemigo que se cree seguro en pos de nuestro objetivo final. Es lo que se dice, planear con inteligencia. Para ello, hemos de estar mas seguros que el enemigo, aplomados en una organización embuida en defensiva u ofensiva según lo determine la estrategia que habremos de emplear.

Ahora bien, todo accionar político que se precie debe estar profundamente estudiado, y ese planeamiento a nivel táctico - que muchas veces es inmediato - debe sufrir un requerimiento indispensable: debe comunicarse exitosamente entre todos los elementos de cuadros. Y es esta comunicación la que proveerá el camino de la sorpresa. Un enemigo hábil en el dominio del terreno que pisa dificultará sin lugar a dudas la comunicación de los elementos de lucha a los que habrá de enfrentar. Por ello, los compañeros han de saber organizar un buen sistema de cifrado que permita gran agilidad y facilidad para lograr el secreto y la sorpresa, para todo estamento de la acción que hemos de realizar.

Un ejemplo suele aclararlo todo, como decía Napoleón. Podríamos establecer un cifrado de tipo simple y casero por medio de texto binario, esto es, utilizando codificación de 0 y 1. Este tipo de codificación es totalmente conocida, y sólo puede usarse como algo lúdico. Pero nada quita que la utilicemos como caso de gabinete de lo que llamaremos "cifrado simétrico".

Fácilmente podremos programar un código PERL que convierta de ida y de vuelta en binario. Para ello podríamos abrir una terminal con Ctrl+Alt+T e ingresar el siguiente Comando de Organización:

sudo nano /usr/local/sbin/binconv

Conforme se  abra el editor GNU Nano, le pegaremos el código fuente:

#!/usr/bin/perl -W

# binconv convierte texto a binario y viceversa

use strict;
my @in;
my $file;

sub tobinary() {
my @in;
my $out;
my $x;
@in = @_;
for($x=0;$x<=$#in;$x++) {
$out .= unpack("B*", $in[$x]);
}
print("$out");
print("\n");
}

sub totext() {
my @in;
my $out;
my $x;
@in = @_;
for($x=0;$x<=$#in;$x++) {
$out = pack("B*", $in[$x]);
print($out);
}
print("\n");
}

sub help() {
print("\nUso: $0 [-b | -t] [-f filename | \"Cadena de texto\"]\n\n");
print(" -b : convierte texto a binario\n");
print(" -t : convierte binario a texto\n");
print(" filename : archivo a convertir\n");
print(" message : texto a convertir\n");
}

if (@ARGV < 2) {
&help();
exit(1);
}

if ($ARGV[0] eq '-b') {
if ($ARGV[1] eq '-f') {
$file = $::ARGV[2];
open(F, "<$file") || die "Error: imposible abrir $file - $!\n";

@in = ;
close(F);
if (!@in) {
print("Error: sin datos en $file\n");
exit(1);
}
} else {
@in = $::ARGV[1];
}
&tobinary(@in);
}
elsif ($ARGV[0] eq '-t') {
if ($ARGV[1] eq '-f') {
$file = $::ARGV[2];
open(F, "<$file") || die "Error: imposible abrir $file - $!\n";

@in = ;
close(F);
if (!@in) {
print("Error: sin datos en $file\n");
exit(1);
}
} else {
@in = $::ARGV[1];
}
&totext(@in);
}
else {
&help();
exit(1);
}


...para luego guardarlo con ctrl+o, y salir del editor con Ctrl+x. Acto seguido le asignamos permisos de ejecución al programa con:

sudo chmod +x /usr/local/sbin/binconv

Este simple programa se encargará de convertir a binario una frase o convertir a partir de un archivo de entrada y dar un archivo de salida, o directamente darnos la salida propuesta. Si quisiéramos utilizarlo, podríamos usar:

binconv -b 'texto a convertir en string binario'

...y nos resultará en un string binario (0 y 1). Si quisiéramos convertir de binario a texto, deberíamos utilizar:

binconv -t 'string binario a convertir'

De esta forma, podremos emplear este cifrado simétrico en doble sentido: ambas partes comparten el código, y la única seguraridad que prevee se basa en que un tercero la desconozca. Por ejemplo:

De: monchos@orga.org.ar
A: pocho@puertadehierro.com.es

0101010001001110011011010110111101110011001000000110000100100000011011000110000101101110011101010110010001101111

De: pocho@puertadehierro.com.es
A: monchos@orga.org.ar

01001000010011010010000000110001001000000111000001110101011011001100001110110011011101100110010101110010


Naturalmente, este tipo de cifrado simétrico es totalmente banal, al ser simple, de ida y vuelta y de código conocido, no andaría ni en el Estado Mayor de Sobremonte.

En la guerra, los alemanes intentaron un dispositivo electromecánico llamado Enigma, que hacía las veces de codificador simétrico a través de permutaciones alfanuméricas cíclicas por medio de unos cilindros/engranajes con letras (los cuales a su vez debían disponerse según un código convencional militar). Sin embargo incluso estos dispositivos suelen tener un gran inconveniente: requieren gran potencia de cálculo para romper el código por medio de criptoanálisis o por medio de un ataque de fuerza bruta, pero siempre será posible hacerlo. Incluso con los primeros equipos computacionales modernos. La solución es imponer un cifrado computacionalmente tan complejo, que ahuyente la practicidad de intentar romperlo por medio de fuerza bruta de cálculo.

Vean señores, siempre es mejor un bruto que un malo. He visto brutos que se han vuelto buenos. Pero no he visto un malo que se haya vuelto bueno.

Por tanto, las encriptaciones modernas y prácticas han de ser de mayor complejidad para evitar a los brutos de la fuerza... Esto requiere que el código no sea una mera conversión a binario, sino que emplee una Clave Secreta específica para realizar (por medio de distintos algoritmos) la encriptación necesaria. Normalmente esto se logra a través de fórmulas de números compejos y primos grandes mutuamente recursivas.

 Este sistema es el de "encriptación simétrica por frase de paso", aunque también podríamos entenderla como "encriptación simple por contraseña", pueden emplearse en el nivel táctico en la acción que deseamos llevar a cabo, y ello es lo que enseñaré.

Ubuntu cuenta para estos menesteres con una excelente serie de herramientas, llamada GnuPG, o "Guardia de Privacidad". Este herramental consiste en una serie de funciones de seguridad para la Consola o integrada a nuestro escritorio gráfico, que permiten una comunicación electrónica y encriptación de archivos de variable complejidad, y nos aseguran ello a través de esquemas simples o los más complejos. También incluye funcionalidades avanzadas para protección de contraseñas.

Analicemos su uso práctico en un ejemplo simple y empleo táctico, pues ella es la mejor manera de aprender.

Supongamos que contamos con un archivo de texto con órdenes e instrucciones tácticas en formato ASCII (o sea, sin formato, texto plano) llamado resistencia.txt del que deseamos crear una copia cifrada para que sólo puedan leerlo quienes dispongan de la clave necesaria. Para ello usamos:

gpg -c resistencia.txt

Si es la primera vez que utilizamos nuestras herramientas GnuPG, el sistema nos devolverá algo como:

gpg: anillo «/home/usuario/.gnupg/secring.gpg» creado
gpg: datos cifrados CAST5
gpg: cifrado con 1 frase contraseña
gpg: AVISO: la integridad del mensaje no está protegida



Si estamos en modo gráfico, GnuPG arrancará un agente que nos solicitará contraseña (el sistema bloqueará otros programas en ejecución hasta que introduzcamos la contraseña para evitar filtrados):

Si cancelaramos el agente gráfico, o si estuviésemos en la Consola terminal, el sistema nos indicará:

Introduzca frase contraseña:
Repita frase contraseña:

Como ya es clásico en GNU con Linux, hemos de introducir una contraseña "a ciegas" y repetirla a fin de certificar que no existan errores de tipeo. Podremos utilizar caracteres alfanuméricos, y la clave es sensible a mayúsculas, por lo cual que las mismas también pueden utilizarse. Como en toda clave simple, cuanto mayor sea su longitud y menos palabras de diccionario utilice, mucha mayor será su seguridad relativa.

Conforme pongamos dos veces la misma contraseña, el sistema la utilizará el algoritmo de cifrado CAST5 y creará un nuevo archivo llamado resitencia.txt.gpg. El archivo .asc original todavía estará a mano, y podríamos triturarlo con el comando shred y luego borrarlo con el comando rm si deseamos solo conservar la versión cifrada.

Si deseáramos comprobar el encriptado, podríamos utilizar el comando cat para ver el contenido del archivo cifrado. Por ejemplo:

cat resistencia.txt.gpg

...pero ello no servirá de nada, pues lo que veamos será totalmente ininteligible.


Para descifrar el archivo, empleamos el comando:

gpg resistencia.txt.gpg

gpg: datos cifrados CAST5
gpg: cifrado con 1 frase contraseña

Introduzca la contraseña:
gpg: AVISO: la integridad del mensaje no está protegida


Al introducir la contraseña provista anteriormente, se descifrará el archivo .gpg y hará una copia del archivo original (tengamos en cuenta que si no la hubiésemos eliminado, naturalmente nos solicitará permiso para sobreescribirla).

Hemos de tener en cuenta que como nos informa el sistema, la integridad de este archivo .gpg no está garantizada. La codificación CAST5 es bastante potente para un esquema simple de transmisión de archivos a través de medios tácticos no telemáticos (o sea, sin transmisión en redes abiertas como Internet). Aunque por sí sola no impide que el archivo sea modificado/arruinado por un tercero durante su viaje a través de diferentes servidores, ni garantiza su autenticidad (no posee firma digital). Aún así, puede ser adecuado para codificar un archivo de forma fácil, para introducirlo en un medio de almacenamiento seguro, etc.

El problema de este esquema para la transmisión, es que ambas partes (remitente y receptor) deben estar de acuerdo en una única clave. Lograr esto en todas las condiciones tácticas no es problema, pero a nivel estratégico es una invitación al desastre. Convenir una clave entre dos que están al lado es fácil, el problema radica en transmitírsela a un tipo que no conocemos por medio de medios telemáticos que no dominamos ni podemos certificar en toda su extensión, o que para peor, están dominados por el enemigo.

Por ello, el tipo de cifrado expuesto sólo puede servir para cifrar documentos  locales de tipo táctico, material que revista importancia pero que no requiera transmitirse normalmente.

La transmisión de documentos cifrados a nivel estratégico necesita indudablemente un esquema más avanzado de seguridad. Este esquema más complejo para transmitir nos llevará a proponer pares de Claves Públicas y Privadas codificadas, sistema en el que nos extenderemos a continuación.

No hay comentarios:

Publicar un comentario