Uso de Correo Cifrado con GnuPG ¿Cómo podemos proteger nuestro tráfico de información en Texto-Plano.xyz? La privacidad es un valor impostergable en un sistema de cómputo. Para ello, debemos aprender a encriptar mensajes y correo electrónio en el ambiente Texto-plano. A tal efecto debemos utilizar un criptosistema. Texto-plano.xyz puede oficiar como tal gracias al GNU PGP. El criptosistema ofrece un mecanismo de cifrado para mensajes de punto a punto. Cada punto (remitente y receptor) posee 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 encriptarla 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. Los objetivos fundamentales del criptosistema PGP son: a) certificar profundamente las identidades de quienes lo envían y reciben. Únicamente 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 lectura descifrada el mensaje. CREACIÓN DEL PAR DE LLAVES Para crear las llaves usaremos el herramental GnuPG, una serie de programas libres para todo el cometido de alta encriptación. Estas comprenderán encriptado directo, firma digital, y gestión de llaves, todo protegido con diferentes algoritmos). En primer lugar hemos de generar el par de llaves (privada y pública) necesarias para el criptosistema. Tanto el remitente como el destinatario deberán tener su par de claves. gpg --gen-key El sistema nos irá indicando los pasos para generar un par de llaves. En el primero de los pasos, debemos configurar el esquema de claves. El caso por defecto emplea el algoritmo RSA+RSA, recomendado para mensajes de texto simple. Si deseamos codificar programas, fotografías, videos o gran cantidad de datos podríamos preferir emplear el esquema 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. [ SCROLL (F)ORWARD, (B)ACKWARD - (Q)UIT ] FORWARD 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 Se necesita un ID (identificador) de Llave para identificarla individualmente. Afortunadamente, el GnuPG formará el Identificador en base al Nombre Real, Comentario y Dirección de Correo electrónico de esta forma: "Heinrich Heine (Der Dichter) " Nombre y apellidos: Sultano Mengano Dirección de correo electrónico: sultamenganono@texto-plano.xyz Comentario: Blablabla ¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir?V GnuPG nos solicitará ingresar nuestra contraseña de usuario de texto-plano para el abrir nuestro Llavero ("Key-Ring"), que nos permitirá controlar los cifrados. El procedimiento de generación de claves tardará unos segundos. Una vez realizado esto, se nos informará mediante un comunicado similar a este: gpg: clave XXXXXXXX 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/XXXXXXX aaaa-mm-dd Huella de clave = zzzz zzzz zzzz zzzzz zzzz zzzz zzzz zzzz zzzz zzzz uid Sultano Mengano (blabla) [sultanomengano@texto-plano.xyz] sub 4096R/ZZZZZZZZ aaaa-mm-dd Estudiemos momentáneamente este resultado de ejemplo. Se nos indica el identificador de la clave pública XXXXXXX y de la clave privada ZZZZZZZ, 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. CREACION DEL CERTIFICADO DE REVOCACIÓN DEL PAR DE LLAVES No bien creamos el Par de Llaves, conviene crearnos inmediatamente un Certificado de Revocación para el Par de Llaves. Este ejercicio opcional 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. Es bueno 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 garantía de llave maestra. En el ejemplo, para generar el certificado de revocación de la clave pública usaríamos: gpg --output cert_revoc_sultano_mengano_tp_ZZZZZZZ.asc --gen-revoke 0x69FGFE5C Este dará como resultado un archivo de texto llamado cert_revoc_sultano_mengano_tp_ZZZZZZZ.asc que contendrá una clave con el certificado de revocación. Conviene guardar este fichero en algún medio de almacenamiento seguro distinto a texto-plano y colocarlo a resguardo (en caso serio, 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 con terceros dentro de texto-plano.xyz o en cualquier parte. COMPARTIR NUESTRA CLAVE PUBLICA CON TERCEROS Para poder darle a futuros remitentes nuestra clave pública, hay que exportarla. Para ello utilizaremos el comando: gpg --armor --output sultano_mengano_tp_publica.asc --export sultanomengano@texto-plano-xyz Ello creará un fichero de texto codificado en ASCII blindado que contendrá la clave pública, llamado en este ejemplo mengano_sultano_tp_publica.asc. El contenido íntegro de dicho archivo podremos hacerlo público de la manera que gustemos. Podríamos mandarlo adjunto por correo electrónico, ingresarlo a nuestro "finger" en Texto-plano, subirlo a nuestra www o gopherhole. Si echamos un vistazo al contenido de nuestro fichero de clave pública mengano_sultano_tp_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. La misma tendrá la misma forma que nuestra propia clave pública: un fichero .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 fulano@texto-plano.xyz. La misma consiste en un archivo de clave pública llamado fulano_tp.asc. La incorporamos a nuestro Movimiento con el comando: gpg --import fulano_tp.asc Sólo si la clave está intacta, el sistema la incorporará. En tal caso nos devolverá algo como: gpg: key YYYYYY: 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/YYYYYYY aaaa-mm-dd uid Sultano Mengano (blablabla) sub 4096R/ZZZZZZ aaaa-mm-dd pub 2048R/3DE3f869 aaaa-mm-dd uid Fulano TP sub 2048R/C3CFF358 aaaa-mm-dd CIFRAR UN MENSAJE Y ENVIARLO POR CORREO ELECTRÓNICO COMÚN En este ejemplo cifraremos un mensaje contenido en un archivo llamado carta.txt, y lo firmaremos digitalmente, para luego enviárselo a Fulano a través de un correo electrónico convencional a su cuenta fulano@texto-plano.xyz. Para ello utilizaremos la siguiente sintaxis de comando: gpg --output cartaencriptada.gpg --encrypt --recipient fulano@texto-plano.xyz carta.txt El sistema cifrará el archivo carta.txt usando la clave pública asignada a fulano@texto-plano.xyz, 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 Fulano no esté certificada aún, podremos cifrar el mensaje de todos modos, pero el criptosistema de Texto-plano.xyz 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 Fulano 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 criptosistema nos advertirá: Necesita una frase contraseña para desbloquear la clave secreta del usuario: "Sultano Mengano (Blablabla) " clave RSA de 4096 bits, ID 7F7FGBC6, creada el aaaa-mm-dd Debemos ingresar entonces la contraseña que hayamos asignado al Llavero de Claves 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 fulano@texto-plano.xyz. Si alguien intercepta el fichero de correo, 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, Fulano debe descargar el archivo cartaencriptadayfirmada.sig. Podrían entonces verificar la firma con: gpg --verify cartaencriptadayfirmada.sig ...si todo es correcto, su propio criptosistema le 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 «Sultano Mengano (Blablabla) » ...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 «Sultano Mengano (Blablabla) » 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, Fulano utilizaría su propio criptosistema para descifrar el mensaje. Desde su cuenta dotada 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. Fulano 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. Finalmente, podría borrar de forma segura la carta con: gshred 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 Sultano Mengano indicaría: gpg --output cartaencriptada.gpg --encrypt --recipient fulano@texto-plano.xyz 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: "Sultano Mengano (Blablabla) [sultanomengano@texto-plano.xyz]" 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 Fulano (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, Fulano 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 Fulano debería devolverle algo como: gpg: Firmado el dd mmm aaaa hh:mm:ss usando clave RSA ID 7F7FGBC6 gpg: Firma correcta de «Sultano mengano (Blablabla) [sultanomengano@texto-plano.xyz]» Confirmada la verificación y estando seguro que el archivo fue firmado por quien lo origina y no por otro, ahora sólo Fulano 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 criptosistema solicitará contraseña del Llavero para poder desencriptar. Una vez realizado el procedimiento, podrá leer el archivo con: less cartadescifrada.txt Asimismo, tras leer el archivo cartadescifrada.txt, Fulano podría eliminar gpg --output cartaencriptada.gpg --decrypt firmademensaje.sig gpg --output cartadescifrada.txt --decrypt cartaencriptada.gpg Su criptosistema solicitará contraseña del Llavero para poder desencriptar. Una vez realizado el procedimiento, podrá leer el archivo con: less cartadescifrada.txt Asimismo, tras leer el archivo cartadescifrada.txt, Fulano 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: gshred cartadescifrada.txt cartaencriptada.gpg firmademensaje.sig CONCLUSIÓN Todas estas acciones de cifrado y descifrado, firmado y verificación desde la terminal de texto-plano.xyz permiten al Entorno Texto-plano oficiar como un excelente y seguro sistema de transporte y entrega de correo electrónico cifrado. Puede operar dentro de Texto-plano o fuera de él con seguridad de cifrado y firmado digital.