\section{Protegiendo nuestra privacidad: uso del GnuPG}
\label{seccion:gpg}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% La seguridad del correo electrónico %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{La seguridad del correo electrónico}
Generalmente se cree que el correo electrónico es totalmente privado,
que nadie, excepto el receptor del mensaje, puede leer el mensaje que
se envía. Esto dista de ser verdad, de hecho es mucho mas fácil espiar
el correo electrónico que el correo postal, dado que al fin de
cuentas, el correo electrónico termina siendo un archivo en algún o
algunos equipos en la red, a medida que viaja a su destino final.

Con lo dicho anteriormente, no se debe pensar que cada mensaje que se
envía es leído por alguna persona distinta a la que en realidad se le
envió el mensaje, pero es muy recomendable tener siempre en mente que
un mensaje que viaja por la red puede ser revisado \footnote{Esto
  obviamente es ilegal, es una violación a la privacidad y muchos
  países ya tienen leyes sobre este tema.}. Tarde o temprano, se
necesitará enviar información sensible por correo electrónico,
entonces habrá que utilizar algún método para \emph{cifrar} la
información de manera tal que sólo el receptor del mensaje pueda
descifrarla correctamente.

Esta sección se encarga de introducir al alumno al tema del cifrado de
datos utilizando una herramienta libre: el \emph{GnuPG (GNU Privacy
  Guard)}.

%%%%%%%%%%%%%%%%%%%%%
% ¿Qué es el GnuPG? %
%%%%%%%%%%%%%%%%%%%%%
\subsection{?`Qué es el GnuPG?}
El \emph{GNU Privacy Guard} (comúnmente conocido como GPG) es una
herramienta de cifrado de información, que utiliza un sistema de
\emph{cifrado asimétrico}, ?`que quiere decir esto?, que cada usuario
tiene un par de claves:

\begin{description}
\item[Clave pública] La cual se puede (y debe) hacer conocer a todas
  aquellas personas que quieran enviarnos información cifrada.
\item[Clave privada] Esta clave se debe guardar y en ninguna
  circunstancia entregar a nadie, se la utiliza para descifrar los
  mensajes que nos envían cifrados.
\end{description}

Este método se utiliza porque es mucho mas seguro que un sistema de
clave única, por ejemplo: Si la persona A y la persona B quieren
comenzar a mandarse correo cifrado, deberían establecer una clave con
la cual cifrar (y descifrar) la información (mensajes de correo en
este caso) que intercambian. La persona A establece una clave y se la
envía por correo a B, pero por correo no cifrado (porque aún B al no
tener la clave, no podría descifrar el mensaje de A). B al recibirla
comienza a cifrar los mensajes que envía a A, y A usa la misma clave
para descifrarlos y cifrar los suyos hacia B. Esto parece seguro, pero
de hecho no lo es, ya que si alguna otra persona pudo interceptar el
mensaje de A hacia B (no cifrado) con la clave, luego usando dicha
clave podría descifrar todos los mensajes que A y B intercambien sin
ningún problema.

El sistema de cifrado asimétrico soluciona este problema, ya que A y B
entonces tendrían dos claves cada uno, entonces A le envía su clave
pública a B y B envía su clave pública a A. Luego A utiliza dicha
clave pública de B para cifrar los mensajes dirigidos a B, lo mismo
hace B con la clave pública de A. Aquellos mensajes cifrados con la
clave pública de B sólo podrán ser descifrados con la clave
\emph{privada} de B al igual que los mensajes cifrados con la clave
pública de A, podrán ser descifrados con la clave privada de A. Como
dichas claves privadas están en poder de sus dueños y nadie mas,
cualquier persona que intercepte los mensajes no cifrados con las
claves públicas de A y B, no podrá utilizarlas para descifrar ningún
mensaje, ya que el único uso que tienen las claves públicas es cifrar
(y no descifrar) información que podrá ser descifrada solo por el
dueño de dicha clave pública.

%%%%%%%%%%%%%%%%%%%%%%%%%
% Configurando el GnuPG %
%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Configurando el GnuPG}
Como primera medida para utilizar el GPG, se debe configurar las
claves pública y privada. El comando correspondiente al GPG se llama
\comando{gpg}, y para generar las claves se debe ejecutar como sigue a
continuación:

\begin{verbatim}
usuario@maquina:~$ gpg --gen-key
gpg (GnuPG) 1.0.4; Copyright (C) 2000 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
 
gpg: /home/usuario/.gnupg/secring.gpg: keyring created
gpg: /home/usuario/.gnupg/pubring.gpg: keyring created
Please select what kind of key you want:
   (1) DSA and ElGamal (default)
   (2) DSA (sign only)
   (4) ElGamal (sign and encrypt)
Your selection?
\end{verbatim}
%$

Se le solicita al usuario que seleccione el tipo de clave que se
utilizará. Como el mismo GPG lo dice, algunas claves sirven solo para
firmar, otras para firmar y cifrar, se recomienda utilizar la opción
por defecto.

A continuación el GPG pregunta sobre la longitud de las claves a
generar. Cuanto mas larga sean las claves, mas difícil será para
cualquier persona intentar romper el cifrado por \emph{fuerza
  bruta}\footnote{Se llama fuerza bruta al método de probar todas las
  combinaciones de algo, por ejemplo una clave numérica, para
  adivinarla. Imagine que una clave numérica de 3 dígitos es mucho mas
  fácil de adivinar probando todas las 1000 posibilidades, que una
  clave de 6 dígitos.}, el usuario entonces elegirá la longitud
(\comando{gpg} recomienda una longitud no mayor a 2048 bits)
dependiendo de su paranoia. Se debe tener en cuenta que cuanto mas
larga es la clave, también mas trabajo le toma a la máquina cifrar y
descifrar la información.

\begin{verbatim}
DSA keypair will have 1024 bits.
About to generate a new ELG-E keypair.
              minimum keysize is  768 bits
              default keysize is 1024 bits
    highest suggested keysize is 2048 bits
What keysize do you want? (1024)
\end{verbatim}

Una vez elegida la longitud de las claves, el programa pide la fecha
de caducidad de las mismas.

\begin{verbatim}
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
\end{verbatim}

Generalmente no se necesitará tener una fecha de caducidad, lo
recomendable es entonces elegir la primer opción. El problema de tener
una clave con fecha de caducidad es que una vez que el par de claves
caduca, se debe enviar el par nuevo a todas aquellas personas que
usaban el viejo par, y esto puede ser bastante engorroso.

Luego habrá que ingresar los datos personales, los cuales se
almacenarán con el par de claves para distinguirse de las demás claves
que luego se posean. GPG necesita el nombre real del usuario, la
dirección de correo electrónico y un comentario (como por ejemplo, el
teléfono o nombre de una empresa).

\begin{verbatim}
You need a User-ID to identify your key; the software constructs the user id
from Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
 
Real name: Usuario
Email address: usuario@maquina.dominio.com
Comment: 233-8847
You selected this USER-ID:
    "Usuario (233-8847) <usuario@maquina.dominio.com>"
 
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
\end{verbatim}

Una vez que se aceptan los datos ingresados, GPG solicita un nivel mas
de protección a la clave privada del usuario: una frase de contraseña.
Esto es muy útil por si alguna vez la clave privada es de alguna
manera robada del dueño, se necesitará saber esta frase para poder
utilizar la clave privada. Se recomienda que la frase contenga letras
mayúsculas, minúsculas y si es posible, números, de manera que sea muy
difícil adivinarla por \emph{fuerza bruta}\footnote{Se debe recordar
  exactamente cual es la frase de contraseña, respetando las
  minúsculas de las mayúsculas, porque se necesitará ingresarla cada
  vez que se quiera cifrar o descifrar algún mensaje.}.

Luego de ingresar la frase de contraseña dos veces, GPG necesita
obtener información al azar para la generación de las claves, y para
esto, toma la información de la actividad del sistema operativo, es
por eso que pide al usuario que realice cualquier actividad, como
mover el mouse, usar el disco rígido (por ejemplo cargando algún
programa), hasta obtener la cantidad necesaria de datos.

Con esto se concluye la etapa de configuración de GPG. El programa
habrá generado el directorio \archivo{.gnupg} en el directorio
personal del usuario. Los datos que contengan ese directorio no deben
ser publicados en ningún sitio, ya que ahí dentro se encuentra la
clave privada.

%%%%%%%%%%%%%%%%%%%%%%%%
% Uso diario del GnuPG %
%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Uso diario del GnuPG}
Una vez configurado el programa de cifrado, lo primero que se debe
hacer es \emph{generar un certificado de revocación}, el cual servirá
para poder anular el par de claves en el caso de olvido de contraseña,
o robo de la clave privada. Esto se hace de la siguiente forma:

\begin{verbatim}
usuario@maquina:~$ gpg --output cert-revocacion.asc --gen-revoke Usuario

sec  1024D/62B70584 2001-04-22   Usuario (233-8847) <usuario@maquina.dominio.com>
 
Create a revocation certificate for this key? y
Please select the reason for the revocation:
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  0 = Cancel
(Probably you want to select 1 here)
Your decision?
\end{verbatim}
%$

El argumento que se le debe pasar al parámetro \comando{--gen-revoke}
es el nombre que previamente se ingresó cuando se configuró GPG. El
programa pide la razón por la cual se genera el certificado de
revocación y un comentario, luego GPG genera el archivo
\archivo{cert-revocacion.asc} (que es un archivo de texto) con el
certificado incluido. Este archivo debería guardarse en algún medio de
almacenamiento y esconderse donde nadie tenga acceso, una de las
opciones válidas puede ser imprimir el archivo y guardar la hoja en
algún lugar seguro, luego borrar el archivo.

Por cada persona a la que se quiera enviar mensajes cifrados, se debe
tener almacenada su clave pública en el \emph{anillo de llaves} de
GPG. Para ver la lista de claves públicas que se tiene en cualquier
instante, se ejecutará el siguiente comando:

\begin{verbatim}
usuario@maquina:~$ gpg --list-keys
/home/usuario/.gnupg/pubring.gpg
--------------------------------
pub  1024D/62B70584 2001-04-22 Usuario (233-8847) <usuario@maquina.dominio.com>
sub  2048g/7459EB6A 2001-04-22
\end{verbatim}
%$

Inicialmente se tendrá únicamente la propia clave pública en el
anillo. Cuando se reciba alguna clave pública de otra persona, se la
debe agregar al anillo de la siguiente manera:

\begin{verbatim}
usuario@maquina:~$ gpg --import <nombre_archivo>
\end{verbatim}
%$

Donde \comando{<nombre\_archivo>} corresponde al archivo donde se
tengan la o las claves públicas a ingresar.

De manera similar, se necesitará exportar la propia clave pública a un
archivo de texto para poder enviarla a aquellas personas que quieran
enviar mensajes cifrados. Esto se hace como sigue:

\begin{verbatim}
usuario@maquina:~$ gpg --armor --output <archivo_exportado> --export <nombre>
\end{verbatim}
%$

Donde \comando{<archivo\_exportado>} será el archivo donde se
almacenará la clave pública en formato de texto, y \comando{<nombre>}
deberá corresponder con el nombre o la dirección de correo electrónico
propia que se haya ingresado en los datos del programa. De hecho, este
comando sirve para exportar cualquier clave pública, la propia o la de
cualquiera que esté en el anillo, proveyendo el correspondiente nombre
o dirección electrónica.

La clave pública exportada tendrá aproximadamente el siguiente
formato\footnote{De hecho esta clave que se incluye es la clave
  pública de unos de los autores de este manual, Lucas Di Pentima.}:

\begin{verbatim}
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org

mQGiBDq6OwIRBADXaEdL7bTUR8HtgfNYz+Bzm5oEGM/vm3tUB1yDgMGZAkugCZt4
b41HX2LXCqmfMLQclS+0B6gYSfYGNG1v/VdGFdXEkrWzVV3QcTEFVDC79qac06eD
zerdIgjgVaPKjwIY8b9i1I2OisjY4Ey5gw2w1CoepCj9DMZZZ7d0tLJhhwCg5OB4
UXQtitHd8L6ASkc9Eyjg6x0EAKg61fRranXcCWhaVDoPvKvjThCTf53wVaw9eSVy
CJwy4f18cMRC+MYT5J9wni4dC2I1YkLGuNrUgb0SVVS2TZkcaI/4LZvIzxSupMww
yMedstQfYe1kzjY/ODnE3OYXyW6k5eEfBopNGO/J300/YDZ/OCXj/zq/TOb9Ztls
SEGSA/9XeoEUqe6lolXMJMAK1eO0TkgFm1B5R+mjnkXrh8z/Ofgw+HuD0Pr9imQi
YMk9ymT+swhC08hv5lDPe0iOHc5biyvKh6t654vIiJF8sds8hkiwW5RYmiVeB3hG
R4dBfVuOEGQXYNabwGSiqECJpXeCl2q7NVvijIUJFqsLTPcBd7Q7THVjYXMgRGkg
UGVudGltYSAoVGVsOiA1NCAzNDIgNDU5MzEyMikgPGx1Y2FzQGx1bml4LmNvbS5h
cj6IVwQTEQIAFwUCOro7AgULBwoDBAMVAwIDFgIBAheAAAoJEI+YP89qpU/Jo18A
oJQ0OyVfioYgCxxbU6f1buN6uKsfAJ4nVyK+YW+RnofcbHJga/SsxAJ2drkBDQQ6
ujsGEAQA8g+dqkNhhywhkj3d8dCqVicq8JjEFQyWIQkP1/Qg0CshljSWjeX1D/bn
fEOkxqt/oy/+ClqMMKABO764NEcu3B7zz16OK/uLuvddY3vfZiA82XJdxu5wXqk4
dKA+iorx5xtE2eNxVAFydXnR7KkiN4HOoVDNxTNGKA22wra3ND8AAwUD/iSd3NoP
zPdhF7/laBefp7vdDo7LRn3iLe7m1NbvXvtYMtNvtWP9LIjq7q1iHqsZw+5Xymkl
LbhaMhfUIoZhqaLr1L1IajuLZA8wUmYeHK/ZswLoEK0bJBYfVxS8gbpJG89PiQXK
PFPwWSHmesR13+nKUtoAsEsOaxRM/f4PPPlziEYEGBECAAYFAjq6OwYACgkQj5g/
z2qlT8ka+ACg24eZNxUhYJ+FF6P7Cd3CPZ/dlhsAnj8NrXcAEN6BbOdTWaS6FDmt
a3FW
=SP6W
-----END PGP PUBLIC KEY BLOCK-----
\end{verbatim}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Subsubsección: Cifrando información %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{Cifrando información}
Suponiendo que una persona quiere enviarle correo cifrado a uno de los
autores de este curso, Lucas Di Pentima, una vez que la clave pública
de este personaje esté en el anillo de claves públicas, se verá algo
parecido a lo siguiente:

\begin{verbatim}
usuario@zeloran:~$ gpg --list-keys
/home/usuario/.gnupg/pubring.gpg
--------------------------------
pub  1024D/62B70584 2001-04-22 Usuario (233-8847) <usuario@maquina.dominio.com>
sub  2048g/7459EB6A 2001-04-22
 
pub  1024D/6AA54FC9 2001-03-22 Lucas Di Pentima (Tel: 54 342 4593122) <lucas@lunix.com.ar>
sub  1024g/9252D0E4 2001-03-22
\end{verbatim}
%$

Entonces para cifrar el archivo \archivo{/home/usuario/mensaje.txt} se
deberá ejecutar el siguiente comando:

\begin{verbatim}
usuario@maquina:~$ gpg --output mensaje.gpg --encrypt --recipient lucas@lunix.com.ar mensaje.txt
\end{verbatim}
%$

Una clave pública puede llegar a tener la certificación de otras
personas de que es válida, no ahondaremos en este tema, pero es
oportuno hacer notar que si una clave pública que se utiliza para
cifrar un mensaje, no está certificada por otros, significa que no es
seguro que sea realmente de la persona que dice ser. Si esta clave
pública la recibimos de fuentes confiables (por ejemplo, directamente
del dueño), se la puede utilizar de todas formas, aunque GPG avise que
no es totalmente confiable.

El archivo con el mensaje cifrado será, obviamente, el archivo
\archivo{mensaje.gpg}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Subsubsección: Descifrando información %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{Descifrando información}
Cuando recibamos algún mensaje o archivo cifrado con nuestra clave
pública, se debe ejecutar el siguiente comando para descifrarlo:

\begin{verbatim}
usuario@maquina:~/gpg --output archivo.txt --decrypt archivo.gpg
\end{verbatim}

Donde \archivo{archivo.gpg} es el archivo cifrado y
\archivo{archivo.txt} es el descifrado resultante.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Subsubsección: Conclusión %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsubsection{Conclusión}
Este curso aborda el tema del cifrado como una herramienta de
comunicación segura con otras personas a través del uso de un servicio
no seguro, como lo es el correo electrónico. Esto no quiere decir que
GPG sólo sirva para cifrar y descifrar mensajes de texto, al
contrario, GPG sirve para cifrar cualquier tipo de archivo, no
necesariamente que se deba enviar a otra persona, por ejemplo si el
alumno tiene un conjunto de documentos que quiere almacenar en un
CD-ROM como copia de seguridad, pero que no quiere que ninguna persona
que tenga acceso a ese CD-ROM pueda usar esos documentos, puede
cifrarlos con su propia clave pública y almacenar en CD-ROM los
archivos cifrados resultantes, teniendo la seguridad que nadie podrá
descifrarlos al no tener la clave privada correspondiente.

A continuación se describirán los pasos necesarios para integrar GPG
con el cliente de correo \comando{pine} para poder usar el cifrado en
los mensajes de correo electrónico de manera fácil y cómoda.

