¿Cómo puedo enviar correo electrónico encriptado y firmado?

En una de sus clásicas disertaciones en la Escuela de Guerra, el General Juan Perón expone un fundamental esquema para mantener el secreto operativo para la victoria a través de correo electrónico firmado y encriptrado en Ubuntu, el sistema operativo del Pueblo.

(...)
Las condiciones en las que muchas veces se produce la lid política, nos encontrará en la realidad de batirnos en las posiciones menos aureoladas. La acción no siempre se da en el terreno que auguramos, y en tal caso un Conductor ha de mostrarse hábil en la planificación, pero sobre todo capaz de accionar en un terreno del cual podría carecer de un dominio total.
Sun Tzu decía que el conocimiento de la acción del enemigo no puede darse por consagración del espíritu, ni por pensamiento inductivo en base a la experiencia. El conocimiento sobre el accionar del oponente ha de obtenerse a través del mismo enemigo, espiando sabiamente su accionar.

En el campo telemático, la acción responde a los mismos principios. Quien crea en la idea mágica de una red neutral, que se levante y vaya a comprar facturas. No en vano en los frontispicios de los campamentos de Roma esculpían el Legio regnus Leges nulis, donde Reina el Legión, la Ley es Nula.  Nos encontraremos así que las oscuras fuerzas de la oligarquia - a través de sus tentáculos omnímodos - osarán leer todo mensaje de los Luchadores de la Libertad que circule por redes a las que considerarán propias. Tomarán todos los recaudos para interceptar y hacer uso de dicha información para apuntalar un objetivo que por inconfesable, no deja de ser cierto. Lo harán pretendiendo ser nuestro proveedor de correo electrónico, nuestro proveedor de tecnología de la información, proveedor de comunicaciones, o vendiéndonos esa libertad en cómodas latas a las que llaman software privativo.

A lo largo de la historia, todo yacaré que osó dormitar se ha convertido en cartera. Nosotros somos un Movimiento que ha de conocer esta triste realidad para prevenir su accionar, y emprender una vez más la lucha por la Auténtica Liberación de nuestra Patria y su Software, a fin de reencontrarnos victoriosos en un futuro que no guarda para nosotros sino la dicha y la felicidad de todos los Argentinos.

¿Cómo podemos proteger nuestro tráfico de información en la lucha enconada que hemos de dar?. Vean señores, por más remozada que esté, la técnica computada no deja de ser - en su esencia - mas vieja que mear en los portones. Emplearemos el arte de los criptosistemas. Esto es, codificar un mensaje para que sólo sirva a nuestros intereses.

¿Como funciona el sistema? Se trata de un mecanismo de cifrado de alta computación para mensajes de punto a punto. Cada punto (remitente y receptor) poseen dos tipos de clave: una llamada Clave Privada, y otra que se combina con la anterior pero que debe compartirse con el resto del nuestros destinatarios de correo: la Clave Pública.

Cuando un remitente desea enviar correspondencia electrónica cifrada, debe primero encriptarlo mediante la Clave Pública de la persona a quien desea enviarle el correo. Esto hace que ya - durante su viaje - el mensaje vaya cifrado y sea totalmente inintelegible. Al llegar el mensaje cifrado al destinatario, éste utilizará su propia Clave Privada para actuar en combinación con la clave pública del remitente; sólo así el mensaje se descifrará y resultará legible.

El Conductor de un Movimiento debe ser - ante todo - un didacta. Es por ello que concentraré mis esfuerzos en iluminar a la Masa entendiendo que el empleo masivo de encriptación a nivel táctico y estratégico es un multiplicador de fuerzas, tendiente a otorgar a nuestro Movimiento la sorpresa en en planeamiento estratégico y en la ejecución táctica de las acciones que hemos de emprender.

Han de saber que los objetivos fundamentales de este criptosistema son:

a) certificar profundamente las identidades de quienes lo envían y reciben. Sólo esta protección de la identidad podrá asegurar que sólo la persona a quien queremos enviar el correo lo reciba. Esta protección a la identidad también asegurará al receptor que quién ha emitido el mensaje es la persona que dice ser.

b) intercifrar el mensaje de modo que quienes carezcan de las claves correspondientes tengan totalmente vedado, en la práctica, loa imprescindible lectura descifrada el mensaje.


CREACIÓN DEL PAR DE CLAVES
Para crear las claves usaremos el herramental GnuPG, una serie de programas libres para todo el cometido estratégico de la alta encriptación bajo las banderas del Justicialismo. Estas comprenderán nuestras armas de campo, y de ellas no debemos desconfiar pues son realmente potente para afrontar los distintos esquemas de seguridad (encriptado directo, firma digital, y gestión de claves, todo protegido con diferentes algoritmos).
En primer lugar hemos de instrumentar el par de claves (privada y pública) necesarias para el criptosistema del que os he hablado. Tanto el remitente como el destinatario deberán tener su par de claves.

Nos crearemos un par de claves para nuestro uso personal. Podremos utilizar el sistema gráfico o el la terminal para hacerlo. En este caso, será más ágil explicarlo con la terminal de texto. Por ello abrimos una Terminal con Ctrl+Alt+T e ingresamos:

gpg --gen-key

El sistema nos irá indicando los pasos para generar una clave. En el primero de los pasos, debemos configurar el esquema de claves. El caso por defecto emplea el algoritmo RSA+RSA, el cual recomiendo ampliamente para mensajes de texto simple. Si deseamos codificar programas, fotografías, videos o gran cantidad de datos podríamos preferir emplear el esqueema DSA+Elgamal, de menor requerimiento computacional. Nos aparecerá el siguiente diálogo:

gpg (GnuPG) 1.4.16; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Por favor seleccione tipo de clave deseado:

   (1) RSA y RSA (predeterminado)
   (2) DSA y Elgamal
   (3) DSA (sólo firmar)
   (4) RSA (sólo firmar)

¿Su selección?:1

las claves RSA pueden tener entre 1024 y 4096 bits de longitud.
¿De qué tamaño quiere la clave? (2048) 4096

El tamaño requerido es de 4096 bits

Por favor, especifique el período de validez de la clave.

         0 = la clave nunca caduca
        = la clave caduca en n días
      w = la clave caduca en n semanas
      m = la clave caduca en n meses
      y = la clave caduca en n años
¿Validez de la clave (0)? 0

La clave nunca caduca
¿Es correcto? (s/n)s

Necesita un identificador de usuario para identificar su clave. El programa construye el identificador a partir del Nombre Real, Comentario y Dirección de Correo electrónico de esta forma:

    "Heinrich Heine (Der Dichter) "

Nombre y apellidos: Juan Perón
Dirección de correo electrónico: juanperon@puertadehierro.com.es
Comentario: Conductor

¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir?V

Si es la primera vez que utilicemos nuestro sistema de cifrado en esta computadora,, el programa nos solicitará una contraseña para el anillo de claves, que nos permitirá controlar los cifrados. Este funciona como mi anillo de ónix que tiene las claves de mis cajas secretas de Suiza.

Esta contraseña del anillo de claves será distinta a las de las firmas digitales. Es imporante contar con una clave que recordemos, o al menos anotarla y guardarla en un lugar seguro, como una caja de seguridad, sobre lacrado, etc.

El procedimiento de generación de claves es computacionalmente intensivo, por lo cual puede tardar un par de minutos dependiendo de la complejidad de la clave (en bits). Para ello, el algoritmo requiere generar muchos bytes aleatorios, y lo hará a través de la llamada "entropía" de distintos dispositivos de sistema. Para que estos bytes aleatorios se generen mas rápidamente, se aconseja trabajar en muchas cosas a la vez, usar la red y los discos, usar varias ventanas, ver streams de videos, etc), y durante todo este procedimiento se generarán números primos y diferentes acciones de cifrado. Todas esta generación pseudoaleatoria de alta computación hará que la clave sea realmente compleja. En tanto no tengamos los datos necesarios, se nos mostrará un mensaje similar a este:

No hay suficientes bytes aleatorios disponibles. Por favor, haga algún otro trabajo para que el sistema pueda recolectar más entropía (se necesitan xxx bytes más).

Una vez realizado esto, se nos informará mediante un comunicado similar a este:

gpg: clave 8F7FGBC6 marcada como de confianza absoluta
claves pública y secreta creadas y firmadas.

gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,
modelo de confianza PGP
gpg: nivel: 0  validez:   2  firmada:   0  confianza: 0-, 0q, 0n, 0m, 0f, 2u
pub   4096R/7F7FGBC6 aaaa-mm-dd
      Huella de clave = zzzz zzzz zzzz zzzzz zzzz  zzzz zzzz zzzz zzzz zzzz
uid                  Juan Peron (conductor) [juanperon@puertadehierro.com.es]
sub   4096R/69FGFE5C aaaa-mm-dd

Estudiemos momentáneamente este resultado de ejemplo. Se nos indica el identificador de la clave pública 7F7FGBC6 y de la clave privada 69FGFE5C, así como su fuerza de encriptación (4096R, que significa 4096 bits RSA). Alguno de los comandos dependen de estos identificadores, de modo que debemos tomar nota de ellos, e idealmente guardarlos en lugar seguro.


CERTIFICADO DE REVOCACIÓN DE CLAVE
Apenas creamos el Par de claves, conviene crearnos un Certificado de Revocación para la clave privada. Este ejercicio se debe a que si en algún momento la clave privada resulta comprometida, la cambiamos, etc, debemos revocar la antigua, y el certificado hará dicho trámite. Debemos pensar en él Certificado de Revocación como "la escritura de la casa". Si tuviésemos que "cambiar la cerradura por algo", esta será nuestra llave maestra. Para generar el certificado de la clave pública haremos:

gpg --output cert_revok_69FGFE5C.asc --gen-revoke 0x69FGFE5C

Este dará como resultado un archivo de texto llamado cert_revok_69FGFE5C.asc que contendrá una clave con el certificado de revocación. Este fichero conviene guardarlo en algún medio de almacenamiento y colocarlo en sitio seguro (imprimirlo y guardarlo en sobre lacrado/caja fuerte, o idealmente tomar los dos temperamentos), pues nos servirá en caso de emergencias graves con la clave privada. Conforme el certificado de revocación de clave privada esté en orden, podremos ya con confianza compartir la clave pública a terceros.


COMPARTIR NUESTRA CLAVE PUBLICA
Para poder darle a futuros remitentes nuestra clave pública, hay que exportarla. Para ello utilizaremos el comando:

gpg --armor --output juan_peron_publica.asc --export juanperon@puertadehierro.com.es

Ello nos creará un archivo ASCII blindado que contendrá la clave pública, llamado en este ejemplo juan_peron_publica.asc. El contenido íntegro de dicho archivo podremos hacerlo público de la manera que se nos ocurra. Podríamos mandarlo adjunto por correo electrónico, o subirlo a algún servidor de claves públicas, o acercarlo por medio de algún método de transferencia de información.

Si no tenemos tantos problemas con la privacidad, podríamos hacer uso de servidores especializados para hacer pública nuestra clave pública, y que la misma esté disponible para cualquiera que nos busque para entablar un contacto certificado. Uno de los míticos es el servidor de claves PGP del MIT, sito en https://pgp.mit.edu/.

Si deseamos emplear otros servidores de manera sencilla, podríamos hacer uso de la interfaz gráfica de nuestro Ubuntu. Vamos a Sistema / Preferencias / Contraseñas y Claves. Elegiremos entonces el menú Remota / Sincronizar Claves.

Si presionamos Servidores de Claves, podremos elegir alguno. En el caso de Ubuntu 14.04LTS nos ofrecerá tres servidores seguros y confiables a disposición, pero podremos agregar más si lo deseamos.




Al presionar Sincronizar se cargarán (subirán) las claves públicas que querramos al servidor elegido. Si quisiéramos buscar una clave pública, podríamos utilizar la función Remota / Buscar Clave Pública.

Si echamos un vistazo al contenido de nuestro archivo de clave pública juan_peron_publica.asc, veremos la clave que su contenido tendrá una apariencia similar a esta:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

chorizodeletrasindescifrablesqueesnuestraclavepublicaimposiblederecordaretc
chorizodeletrasindescifrablesqueesnuestraclavepublicaimposiblederecordaretc
chorizodeletrasindescifrablesqueesnuestraclavepublicaimposiblederecordaretc
(...)

-----END PGP PUBLIC KEY BLOCK-----


AGREGARNOS LA CLAVE PÚBLICA DE UN TERCERO
Para poder enviarle correo electrónico cifrado a un tercero, debemos incorporar a nuestro critosistema la clave pública de dicha persona. Naturalmente, la misma tendrá la misma forma que nuestra propia clave pública: un archivo .asc, o eventualmente un archivo .gpg (la diferencia es que el .gpg no es blindado, pero para el caso es lo mismo).

Supongamos que nos hacen llegar por correo electrónico no cifrado la clave pública de nuestro destinatario jwk@orga.ar. La misma consiste en un archivo de clave pública llamado john_william_cooke.asc. La incorporamos a nuestro Movimiento con el comando:

gpg --import john_william_cooke.asc

Sólo si la clave está intacta, el sistema la incorporará. En tal caso nos devolverá algo como:

gpg: key 3DE3f869: Clave pública importada.
gpg: número total procesada: 1
gpg:              importada: 1


REVISAR Y VALIDAR LAS CLAVES ALMACENADAS EN EL CRIPTOSISTEMA

Podremos revisar las claves en nuestro sistema con el comando:

gpg --list-keys

...y este nos devolverá algo como:

/home/usuario/.gnupg/pubring.gpg
------------------------------
pub   4096R/7F7FGBC6 aaaa-mm-dd
uid                  Juan Peron (conductor)
sub   4096R/69FGFE5C aaaa-mm-dd

pub   2048R/3DE3f869 aaaa-mm-dd
uid                  John William Cooke
sub   2048R/C3CFF358 aaaa-mm-dd


Ahora bien, ¿cómo sabemos que realmente dicha clave es de la persona que deseamos, y no de alguien que pretende serlo? Por medio de las validaciones. Nosotros podemos validar firmas que sabemos reales, o poner en duda las que creemos falsas. En una empresa, el empleador podría validar las cuentas que ha creado para sus propios usuarios. Similarmente, en toda organizaación o Movimiento político ha de poder validar las claves de quienes la componen.

Para validarla podermos utilizar la ventana gráfica pues es más sencillo. Vamos a Sistema / Preferencias / Contraseñas y Claves. Se abrirá el cuadro de diálogo que nos permite administrar las claves. Debemos ir al menú Ver / Mostrar todas para que nos muestre todas las claves que tengamos.
En el campo de la izquierda, hacemos clic el apartado Claves GPG / Claves GnuPG. Allí se listarán todas las claves.

Hacemos doble clic en aquella que nos interese validar. Se abrirá un cuadro con la respectiva Clave Pública. Debemos ir a la solapa Detalles y elegir en el apartado Indique Confianza un valor para el mismo (puede ser Desconocida, Nunca, Marginal, Completa). Si sabemos efectivamente que el propietario es quien dice (por ejemplo, nos transfirió el archivo en mano, presencialmente, etc) podemos indicar Completa.


CODIFICAR UN MENSAJE Y ENVIARLO POR CORREO ELECTRÓNICO COMÚN


En este ejemplo cifraremos un importante mensaje estratégico llamado carta.txt, y lo firmaremos digitalmente, para luego enviárselo a John William Cooke a través de un correo electrónico convencional a su cuenta jwc@orga.ar.
Para ello utilizaremos la siguiente sintaxis de comando:

gpg --output cartaencriptada.gpg --encrypt --recipient jwk@orga.ar carta.txt

El sistema cifrará el archivo carta.txt usando la clave pública asignada a jwk@orga.ar, y el resultado de dicha encriptación quedará en el archivo cartaencriptada.gpg. Dicho archivo ya será ininteligible.

En el caso que la clave pública de Montoneros no esté certificada aún, podremos cifrar el mensaje de todos modos, pero el sistema, en aras de la seguridad extrema, nos lo advertirá con el siguiente mensaje:

gpg: 3DE3f869: No hay seguridad de que esta clave pertenezca realmente
al usuario que se nombra

pub  2048R/3DE3f869 aaaa-mm-dd John William Cooke
 Huella de clave primaria: xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx
      Huella de subclave: yyyy yyyy yyyy yyyy yyyy  yyyy yyyy yyyy yyyy yyyy

No es seguro que la clave pertenezca a la persona que se nombra en el
identificador de usuario. Si *realmente* sabe lo que está haciendo,
puede contestar sí a la siguiente pregunta.

¿Usar esta clave de todas formas? (s/N) s

Ahora que tenemos el archivo cifrado cartaencriptada.gpg, opcionalmente podremos firmarlo digitalmente. La firma actúa también como certificado de inviolabilidad, y alerta al receptor si el mensaje no ha sido alterado de cualquier forma durante su traslado telemático.

Para firmarlo se utiliza la clave privada del usuario remitente. Para ello debemos usar:

gpg --output cartaencriptadayfirmada.sig --sign cartaencriptada.gpg

El sistema nos advertirá:

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Juan Peron (Conductor) "
clave RSA de 4096 bits, ID 7F7FGBC6, creada el aaaa-mm-dd

Debemos ingresar entonces la contraseña que hayamos asignado al anillo de contraseñas de nuestro sistema para completar el criptofirmado.

Conforme hayamos realizado estos pasos, podremos ya enviar como adjunto el archivo cartaencriptadayfirmada.sig por correo electrónico convencional con suma confianza a la dirección jwk@orga.ar. Si cualquier espurio proveedor de internet deseara interceptar el archivo, solo recibiría basura ininteligible. Y si quisiera alterarlo por algo, alertaría al remitente que sin duda se produjo una modificación en el fichero...

Una vez recibido su correo electrónico, John William Cooke debe descargar el archivo cartaencriptadayfirmada.sig. Podrían entonces verificar la firma con:

gpg --verify cartaencriptadayfirmada.sig

...si todo es correcto, el sistema les devolverá el status de la firma. Si la firma está certificada ya por varias personas, podría indicarnos:

gpg: Firmado el ddd dd mmm aaaa hh:mm:ss TZ usando clave RSA ID 7F7FGBC6
gpg: Firma correcta de «Juan Perón (Conductor) »

...y si la firma no estuviese convenientemente certificada por terceros aún,, podría alertarnos al respecto:

gpg: Firmado el dd mmm aaaa hh:mm:ss TZ usando clave RSA ID 7F7FGBC6
gpg: Firma correcta de «Juan Perón (Conductor) »
gpg: AVISO: ¡Esta clave está certificada por una firma de confianza!
gpg:          No hay indicios de que la firma pertenezca al propietario.
Huellas dactilares de la clave primaria: zzzz zzzz zzzz zzzz zzzz  zzzz zzzz zzzz zzzz zzzz

Finalmente, John William Cooke utilizaría su propio criptosistema para descifrar el mensaje. En su equipo dotado con su propia clave privada, ingresaría los siguientes comandos de organización para descifrar la carta:

gpg --output cartacifrada.gpg --decrypt cartadescifradayfirmada.sig
gpg --output cartadescifrada.txt --decrypt cartacifrada.gpg

Esto ya nos dejaría el texto complemente descifrado. John William Cooke podría leer la carta de directivas estratégicas en la terminal Linux con:


less cartadescifrada.txt

...sabiendo que sólo él la ha leido, y que Fibertel la tiene adentro pero no le sirve de nada. Finalmente, podría borrar de forma segura la carta con:

shred cartadescifrada.txt

Método de Firma Acompañante:
El mecanismo anterior aporta una seguridad altamente eficiente para impedir que terceros vean el contenido del archivo, pero requiere aún así manipular un archivo cartacifrada.gpg intacto para poder descifrarla en cartadescifradayfirmada.sig y luego hacerlo legible.

Para certificar todo el camino del mensaje (en casos de seguridad de emergencia), debemos utilizar el esquema de firmas acompañantes, que prevee verificar que el archivo gpg esté intacto, por medio de un archivo de firma sig. Suponiendo que tenemos un archivo a codificar y firmar llamado carta.txt, en este caso como remitente Juan Domingo Perón indicaré:

gpg --output cartaencriptada.gpg --encrypt --recipient jwk@orga.ar carta.txt

...con lo cual se nos advertiría y cifraría el mensaje carta.txt en el archivo cifrado e ilegible cartaencriptada.gpg. Acto seguido empleamos el comando:

gpg --output firmademensaje.sig --detach-sig cartaencriptada.gpg

El criptosistema del remitente nos indicará algo como:

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Juan Domingo Peron (conductor) [juanperon@puertadehierro.com.es]"
clave RSA de 4096 bits, ID 7F7FGBC6, creada el dd mmm aaaa hh:mm:ss

...tras ingresar la contraseña de desbloqueo, el criptosistema y firmará el archivo firmademensaje.sig y lo encriptará. Para que el sistema de desencripción con firma acompañante funcione, debemos incluir ambos archivos en el correo electrónico, y ambos deben llegar intactos a John William Cooke (en casos muy extremos podríamos enviar cada archivo por vías diferentes).


Una vez que reciba ambos archivos adjuntos por correo electrónico convencional, John William Cooke primero verificará ambos archivos encriptados y su firma acompañante con el siguiente comando:

gpg --verify firmademensaje.sig cartaencriptada.gpg

...si el archivo no fue alterado de forma alguna y tanto las firmas públicas nuestras coiciden con las privadas del remitente, el criptosistema de John William Cooke debería devolverle algo como:

gpg: Firmado el dd mmm aaaa hh:mm:ss usando clave RSA ID 7F7FGBC6
 gpg: Firma correcta de «Juan Domingo Peron (conductor) [juanperon@puertadehierro.com.es]»
Confirmada la verificación y estando seguro que el archivo fue firmado por quien lo origina y no por otro, ahora sólo John William Cooke en su criptosistema podrá proceder a desencriptar el mensaje y leerlo. Lo haría con:

gpg --output cartaencriptada.gpg --decrypt firmademensaje.sig
gpg --output cartadescifrada.txt --decrypt cartaencriptada.gpg
 
En su equipo naturalmente se solicitará contraseña para poder desencriptar. Una vez realizado el procedimiento, podrá leer el archivo con:
 
less cartadescifrada.txt
 
Asimismo, tras leer el archivo cartadescifrada.txt, John William Cooke podría eliminar con seguridad todos los archivos de su disco rígido de una forma en la cual sea imposible recuperarlos, empleando el comando shred:
 
shred cartadescifrada.txt cartaencriptada.gpg firmademensaje.sig 
Indudablemente, que todas estas acciones de cifrado y descifrado, firmado y verificación desde la terminal, pueden llevarse a cabo mucho más fácilmente desde un cliente libre de correo electrónico de interfaz gráfica como Thunderbird, pero tal acción la llevaremos a cabo en otra clase de este mismo gabinete.