Guía del usuario GnuPG de Gentoo
1.
Introducción
Lo que aprenderá con esta guía
Esta guía asume que está familiarizado con la criptografía de
llave pública, cifrado y firmas digitales. Si no es el caso,
lea el capítulo Criptografía de Llave Pública
o dé una mirada al capítulo 2 del Manual
de GnuPG y luego regrese a esta guía.
Esta guía le enseñará cómo instalar GnuPG, cómo crear su par de
llaves, cómo agregar llaves a su anillo de llaves, cómo enviar su
llave pública a un servidor de llave y cómo firmar, cifrar
y verificar o decodificar los mensajes que recibe o envía.
También aprenderá cómo cifrar archivos en su computadora local
para prevenir que la gente vea el contenido.
Instalación del software requerido
En primera instancia necesita ejecutar emerge gnupg. Muchas
aplicaciones hoy en día tienen algún grado de soporte de gpg, así que
tener crypt en su variable USE es, probablemente, una buena
idea. Si desea tener un cliente de correo electrónico que sea capaz de
usar gnupg, puede usar pine (emerge pinepgp), mutt (emerge
mutt), Mozilla Thunderbird (emerge mozilla-thunderbird),
evolution (evolution es una aplicación del tipo Microsoft Outlook para
GNOME) y KMail de KDE (KMail es parte del paquete kdepim).
Kgpg puede interesarle si usa KDE. Este pequeño programa le permite
generar pares de llaves, importar llaves desde archivos ASCII, firmar
llaves importadas, exportar llaves y unas cuantas características
más.
2.
Generar su llave y agregar llaves públicas a su anillo de llaves
Crear su llave
Para crear su llave, tan sólo ejecute gpg --gen-key. La primera
vez que lo haga, el programa creará algunos directorios; ejecútelo de
nuevo para crear las llaves:
Listado de Código 2.1: Proceso de generación de llaves |
$ gpg --gen-key
gpg (GnuPG) 1.0.7; Copyright (C) 2002 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.
Please select what kind of key you want:
(1) DSA and ElGamal (default)
(2) DSA (sign only)
(4) ElGamal (sign and encrypt)
(5) RSA (sign only)
Your selection? 1
|
Aquí tiene la posibilidad de elegir el tipo de llave que quiere usar.
La mayoría de los usuarios elegirán la predeterminada DSA y ElGamal.
Lo próximo es el tamaño, recuerde que mientras más grande es mejor,
pero tampoco use llaves más grandes de 2048 con llaves DSA/ElGamal.
Normalmente 1024 es más que suficiente para correos electrónicos
normales.
Después del tamaño viene la fecha de expiración. Aquí mientras más
pequeño es mejor, sin embargo, la mayoría de los usuarios usan llaves
que nunca expiran o a lo sumo lo hacen en 2 ó 3 años.
Listado de Código 2.2: Eligir el tamaño de la llave |
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) 2048
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) 0
Key does not expire at all
|
Ahora es tiempo de ingresar alguna información personal suya. Si va a
enviar su llave pública a otras personas tendrá que usar su dirección
real de correo-e aquí.
Listado de Código 2.3: Ingresar información del usuario |
Is this correct (y/n)? y
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: John Doe
Email address: john@nowhere.someplace.flick
Comment: The Real John Doe
You selected this USER-ID:
"John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
Enter passphrase:
|
Ahora ingrese la contraseña de su llave dos veces. Es una buena idea
usar una contraseña segura. Si alguien obtiene su llave privada y
logra saber de alguna forma su contraseña, será capaz de enviar
mensajes firmados en su nombre haciendo que todos piensen que quien lo
envió fue Ud.
Luego, GnuPG generará su llave. Moviendo el ratón o reproduciendo un
mp3 en segundo plano ayudará a acelerar el proceso porque esto genera
datos aleatorios.
Generar un certificado de revocación
Importante:
Esta parte es muy importante y debe hacerla AHORA.
|
Luego de crear sus llaves debería crear un certificado de revocación.
Haciendo esto le permite revocar su llave en caso que algo
desagradable le pase a su llave (que alguien tenga su llave
privada/contraseña).
Listado de Código 2.4: Generar un certificado de revocación |
$ gpg --list-keys
/home/humpback/.gnupg/pubring.gpg
---------------------------------
pub 1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
sub 2048g/96D6CDAD 2002-12-08
$ gpg --output revoke.asc --gen-revoke 75447B14
sec 1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
Create a revocation certificate for this key? y
Please select the reason for the revocation:
0 = No reason specified
1 = Key has been compromised
2 = Key is superseded
3 = Key is no longer used
Q = Cancel
(Probably you want to select 1 here)
Your decision? 1
Enter an optional description; end it with an empty line:
> Alguien obtuvo mi llave y contraseña
>
Reason for revocation: Key has been compromised
Alguien obtuvo mi llave y contraseña
Is this okay? y
You need a passphrase to unlock the secret key for
user: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
1024-bit DSA key, ID 75447B14, created 2002-12-08
ASCII armored output forced.
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The print system
of your machine might store the data and make it available to others!
|
El comando gpg --list-keys muestra las llaves en su anillo de
llaves públicas. Puedes usarlo para ver el ID de su llave y poder
crear el certificado de revocación. Ahora es un buen momento para
copiar todo el directorio .gnupg y el certificado de revocación (en
escudo ASCII - revoke.asc) a un medio seguro (dos
disquetes o un CD-R que guarde en un lugar seguro). Recuerde que puede
usar revoke.asc para revocar sus llaves y hacerlas
inusables en el futuro.
Nota:
Si tiene varias direcciones de correo electrónico que quiera usar con
esta llave, puede ejecutar gpg --edit-key SU_ID y luego usar el
comando adduid. Le preguntará por el nombre, e-mail y un
comentario para la segunda ID que usará.
|
Exportar llaves
Para exportar su llave, tipee gpg --armor --output john.asc
--export john@nowhere.someplace.flick. Casi siempre puede usar el
ID de la llave o algo que identifique la llave (aquí usamos una
dirección de e-mail). John tiene ahora un archivo
john.asc que puede enviar a sus amigos, o poner en su
sitio web para que la gente se comunique de forma segura con él.
Importar llaves
Para agregar archivos a su anillo de llaves públicas, primero debe
importarlas, luego comprobar la huella digital de la llave. Y después
de verificar la huella digital debe validarla.
Nota:
Sea cuidadoso cuando verifique las llaves. Este es uno de los puntos
débiles de la criptografía de llave pública.
|
Ahora agregaremos la llave pública de Luis Pinto (un amigo mío) a
nuestro anillo de llaves públicas. Luego de haberlo llamado por
teléfono y de haberle preguntado por su huella digital, comparo la
huella con la salida del comando fpr. Como la llave es
auténtica, la agrego al anillo de llaves públicas. En este caso
particular, la llave de Luis expira el 2003-12-01 entonces se me
preguntará si quiero que mi firma en su llave expire en el mismo día.
Listado de Código 2.5: Importar y firmar llaves |
$ gpg --import luis.asc
gpg: key 462405BB: public key imported
gpg: Total number processed: 1
gpg: imported: 1
$ gpg --list-keys
/home/humpback/.gnupg/pubring.gpg
---------------------------------
pub 1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
sub 2048g/96D6CDAD 2002-12-08
pub 1024D/462405BB 2002-12-01 Luis Pinto <lmpinto@student.dei.uc.pt>
uid Luis Pinto <lmpinto@dei.uc.pt>
sub 4096g/922175B3 2002-12-01 [expires: 2003-12-01]
$ gpg --edit-key lmpinto@dei.uc.pt
gpg (GnuPG) 1.0.7; Copyright (C) 2002 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: checking the trustdb
gpg: checking at depth 0 signed=0 ot(-/q/n/m/f/u)=0/0/0/0/0/1
pub 1024D/462405BB created: 2002-12-01 expires: 2003-12-01 trust: -/-
sub 4096g/922175B3 created: 2002-12-01 expires: 2003-12-01
(1) Luis Pinto <lmpinto@dei.uc.pt>
(2). Luis Pinto <lmpinto@student.dei.uc.pt>
Command> fpr
pub 1024D/462405BB 2002-12-01 Luis Pinto <lmpinto@dei.uc.pt>
Fingerprint: F056 3697 ADE3 CF98 B80B 8494 0AD3 E57B 4624 05BB
Command> sign
Really sign all user IDs? y
pub 1024D/462405BB created: 2002-12-01 expires: 2003-12-01 trust: -/-
Fingerprint: F056 3697 ADE3 CF98 B80B 8494 0AD3 E57B 4624 05BB
Luis Pinto <lmpinto@dei.uc.pt>
Luis Pinto <lmpinto@student.dei.uc.pt>
This key is due to expire on 2003-12-01.
Do you want your signature to expire at the same time? (Y/n) Y
How carefully have you verified the key you are about to sign actually belongs
to the person named above? If you don't know what to answer, enter "0".
(0) I will not answer. (default)
(1) I have not checked at all.
(2) I have done casual checking.
(3) I have done very careful checking.
Your selection? 3
Are you really sure that you want to sign this key
with your key: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
I have checked this key very carefully.
Really sign? y
You need a passphrase to unlock the secret key for
user: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
1024-bit DSA key, ID 75447B14, created 2002-12-08
Command> check
uid Luis Pinto <lmpinto@dei.uc.pt>
sig!3 462405BB 2002-12-01 [self-signature]
sig!3 75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhe
uid Luis Pinto <lmpinto@student.dei.uc.pt>
sig!3 462405BB 2002-12-01 [self-signature]
sig!3 75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhe
|
3.
Intercambiar llaves con servidores de llaves
Enviar llaves a servidores de llaves
Ahora que tiene su llave, es buena idea enviarla a un servidor de
llaves. Hay un montón de servidores de llaves en el mundo y muchos de
ellos intercambian llaves entre ellos. Vamos a enviar la llave de Luis
al servidor subkeys.pgp.net. Este usa HTTP, o sea que si necesita usar
un proxy para el tráfico HTTP no olvide de configurarlo (export
http_proxy=http://proxy_host:port/). El comando para enviar llaves
es: gpg --keyserver subkeys.pgp.net --keyserver-options
honor-http-proxy --send-key 75447B14 donde 75447B14 es el
ID de la llave. Si no necesita un proxy HTTP puede quitar la opción
--keyserver-options honor-http-proxy.
Puede también enviar las llaves de otras personas que ha firmado al
servidor de llaves. Podríamos enviar la llave de Luis Pinto al
servidor. De esta forma alguien que confía en tu llave puede usar la
firma que pusimos ahí para confiar en la llave de Luis.
Obtener llaves desde los servidores de llaves
Ahora buscaremos la llave de Gustavo Felisberto y agregarla al anillo
de llaves de John Doe (sólo en el caso que no se haya enterado que
Gustavo Felisberto es la persona que escribió esta guía :) ).
Listado de Código 3.1: Buscar llaves en los servidores de llaves |
$ gpg --keyserver subkeys.pgp.net --keyserver-options honor-http-proxy --search-keys humpback@felisberto.net
gpg: searching for "humpback@felisberto.net" from HKP server subkeys.pgp.net
Keys 1-5 of 5 for "humpback@felisberto.net"
(1)Gustavo Felisberto (apt-get install anarchy) <humpback@felisberto.net> 1024
created 2002-12-06, key B9F2D52A
(2)Gustavo Felisberto <humpback@altavista.net> 1024
created 1999-08-03, key E97E0B46
(3)Gustavo A.S.R. Felisberto <humpback@altavista.net> 1024
created 1998-12-10, key B59AB043
(4)Gustavo Adolfo Silva Ribeiro Felisberto <humpback@altavista.net> 1024
created 1998-08-26, key 39EB133D
(5)Gustavo Adolfo Silva Ribeiro Felisberto <humpback@altavista.net> 1024
created 1998-06-14, key AE02AF87
Enter number(s), N)ext, or Q)uit >1
gpg: requesting key B9F2D52A from HKP keyserver subkeys.pgp.net
gpg: key B9F2D52A: public key imported
gpg: Total number processed: 1
gpg: imported: 1
|
Como puede ver desde la respuesta del servidor tiene un par de llaves
enviadas al servidor de llaves, pero actualmente sólo usa
B9F2D52A. Ahora John Doe podrá obtenerla y firmarla si confía
en ella.
4.
Usar un Agente GPG
¿Qué es un Agente GPG?
Hay casos cuando se está trabajando con ciertas aplicaciones donde usa
su llave GPG muy frecuentemente, lo que significa debe tipear su
contraseña muchas veces. Diversas aplicaciones solían ofrecer un
mecanismo de caching de la contraseña para facilitar la vida de los
usuario, esto sin embargo, inhabilitaba el compartir este caché con
otros programas (¿cuán seguro sería esto?) y forzaba a las
aplicaciones a reinventar la rueda una y otra vez.
Un agente GPG es una aplicación separada que GPG usa para mantener en
caché la contraseña de forma estándar y segura. Permite a las
aplicaciones usar GPG concurrentemente: si ingresa su contraseña
mientras trabaja en una aplicación, otra puede trabajar con GPG sin
pedir reiteradamente la contraseña para acceder a la llave - si el
agente GPG se configura para eso, por supuesto.
Gentoo proporciona algunas aplicaciones de agentes GPG.
app-crypt/gnupg-1.9.* se puede considerar como referencia, y
será la que usemos en este documento.
Instalar y configurar gpg-agent y pinentry
Debería instalar, gnupg-1.9.* el cual incluye gpg-agent,
y pinentry. pinentry es la aplicación auxiliar que usa
el gpg-agent para pedir la contraseña en una ventana gráfica. Viene en
tres sabores: puede que haga aparecer una ventana emergente usando
gtk+, Qt o la biblioteca curses (dependiendo de la bandera USE que
configuró cuando lo instaló con emerge).
Listado de Código 4.1: Instalar gpg-agent y pinentry |
# emerge \>=gnupg-1.9.20 pinentry
|
A continuación, cree un archivo llamado
~/.gnupg/gpg-agent.conf e ingrese las siguientes líneas
que definen el timeout por defecto de la contraseña (por ejemplo, 30
minutos) y la aplicación que será llamada cuando la contraseña sea
recuperada la primera vez (por ejemplo, la versión Qt de pinentry).
Listado de Código 4.2: Editar ~/.gnupg/gpg-agent.conf |
pinentry-program /usr/bin/pinentry-qt
no-grab
default-cache-ttl 1800
|
Ahora configure GnuPG para que use un agente cuando sea
apropiado. Edite ~/.gnupg/gpg.conf y agregue la siguiente
línea:
Listado de Código 4.3: Configurar GnuPG para usar un Agente GPG |
use-agent
|
Ahora su sistema está (casi) listo para usar el agente GPG.
Iniciar automáticamente el agente GPG
Si usa KDE como ambiente gráfico, edite
/usr/kde/3.x/env/agent-startup.sh (a nivel de todo el
sistema) o ~/.kde/env/gpgagent.sh (a nivel de usuario
local) y agregue el siguiente comando para que KDE inicie
automáticamente el agente GPG:
Listado de Código 4.4: Configurar KDE para inicie automáticamente el agente GPG |
eval "$(gpg-agent --daemon)"
|
Si usa un ambiente distinto, coloque dicha línea mencionada arriba en
~/.xinitrc (si usa startx) o ~/.xsession
(si usa XDM/GDM/KDM/...).
5.
Trabajar con documentos
Cifrar y firmar
Digamos que tiene un archivo que quiere enviar a Luis. Puede cifrarlo,
firmarlo, o cifrarlo y firmarlo. Cifrarlo significa que sólo Luis
podrá abrirlo. La firma le dice a Luis que fue realmente Ud. quien
creó el archivo.
Los siguientes tres comandos harán sólo eso, cifrar, firmar y
cifrar/firmar.
Listado de Código 5.1: Cifrar y firmar los archivos |
$ gpg --output doc.gpg --encrypt --recipient lmpinto@dei.uc.pt documento_a_cifrar
$ gpg --output doc.gpg --sign --recipient lmpinto@dei.uc.pt documento_a_firmar
$ gpg --output doc.gpg --encrypt --sign --recipient lmpinto@dei.uc.pt documento_a_cifrar_y_firmar
|
Esto creará archivos binarios. Si desea crear archivos ASCII, sólo
agregue el parámetro --clearsign al principio del comando
Descifrar y verificar firmas
Suponga que ha recibido un archivo que está cifrado El comando para
descifrarlo es gpg --output document --decrypt
documento_cifrado.gpg. Esto descifrará el documento y verificará
la firma (si es que hay una).
Encriptando y descifrando sin claves
Es posible encriptar archivos usando contraseñas en vez de claves. La
contraseña funcionará como clave y será utilizada como encriptado
simétrico. Se puede encriptar el archivo usando el parámetro
--symmetric del comando gpg; el descifrado usa el mismo
comando.
Listado de Código 5.2: Encriptando archivos con una contraseña |
$ gpg --output document.gpg --symmetric document
|
Características avanzadas
Hay algunas agradables características avanzadas en GnuPG. Para
encontrarlas, abra el archivo ~/.gnupg/gpg.conf.
Listado de Código 5.3: ~/.gnupg/gpg.conf |
#keyserver x-hkp://subkeys.pgp.net
#keyserver-options auto-key-retrieve include-disabled include-revoked
|
Busque las dos líneas anteriores y descoméntelas. Con esto, cada vez
que GnuPG necesite chequear un firma y no encuentre la llave pública
en el anillo de llaves local, contactará al servidor de llaves en subkeys.pgp.net e intentará
obtenerla desde ahí.
Otro buen comando es gpg --refresh-keys. Este contactará el
servidor de llaves definido en el archivos de opciones y actualizará
las llaves públicas en su anillo de llaves local a partir de ahí,
buscando llaves revocadas, nuevos identificadores, nuevas firmas en
llaves. Probablemente debería ejecutar esto una o dos veces al mes así
puede saber si alguien revocó su llave.
6.
Interfaces GnuPG
Acerca de las firmas de correo electrónico
El 95 % del tiempo usará GnuPG con el correo, firmando/cifrando sus
mensajes saliente y leyendo mensajes firmados/cifrados. Así que es
justo que hablemos acerca de lo primero.
Existen dos formas de firmar/cifrar un correo electrónico con GnuPG,
la antigua y nueva forma :). En la antigua, los mensajes aparecían en
texto plano sin formateo posible y los archivos adjuntos estaban sin
firmar o sin cifrar, a continuación hay un ejemplo de un mensaje
firmado a la antigua:
Listado de Código 6.1: Una firma en texto plano |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Test message
-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 6.5.8 for non-commercial use
iQA/AwUBP8461jMX0745gR7AEQIEOwCg011GbufXO3ED3FkLWXmfzg7xm1cAoJD0
0EU3Kd2EKNCqataEqM5qjpPs
=LchZ
-----END PGP SIGNATURE-----
|
Mensajes como este no son buenos en el mundo de hoy, donde tenemos
agradables interfaces de usuario gráficas y lectores de correo que
entienden HTML.
Para solucionar esto se creó un extensión a MIME (Extensiones de
Correo de Internet Multipropósito). Esto añade un campo al correo que
le notifica al programa lector que el contenido completo del mensaje
está firmado y/o cifrado. El problema con esto es que no todos los
lectores de correo lo soportan. Y en algunos casos desordena el
contenido, el programa Microsoft Outlook es famoso por no funcionar
con esto.
Kgpg
kgpg es una agradable GUI para GnuPG. En la pantalla principal puede
pegar el texto que desea firmar o cifrar, y también puede pegar el
texto con armadura ASCII que desea descifrar.
Ilustración 6.1 |
 |
En esta imagen puede ver la ventana principal de Kpgp con el texto con
armadura ASCII y texto cifrado pegado en ella. Desde aquí puede
descifrarlo (tendrá que suministrar su contraseña), cifrar otros
archivos, pegar nuevo texto para firmar ...
Ilustración 6.2 |
 |
Ahora puede ver la ventana de administración de llaves. Desde aquí
podemos ver nuestra llave correcta para John Doe. Las dos llaves de
confianza de Gustavo y Luis, y la llave sin confianza de Daniel
Robbins (sigo sin llamarlo para preguntarle su huella de la llave :)
).
Seahorse
Seahorse apunta a ser una interfaz GUI de GnuPG para el escritorio
Gnome. El software ha evolucionado rápido, pero aún carece de muchas
características importantes que pueden ser encontradas en Kgpg o en la
versión de línea de comandos.
Enigmail
Enigmail es un "plug-in" para los clientes de correo electrónico
basados en Mozilla (tales como Thunderbird y Seamonkey) que es
bastante sencillo de configurar. En Seamonkey, basta con ir a
Preferences -> Privacy & Security -> Enigmail. Allí ingresa
la llave del correo y eso es todo. Primero, debe hacer emerge
enigmail para usarlo con Thunderbird. Luego puede configurarlo
yendo a Edit -> Account Settings -> OpenPGP Security.
Los correos que llegan con una firma pgp o gpg que no es confiable
serán marcados con un bolígrafo roto. Otros que tengan firmas
correctas aparecerán con un lindo bolígrafo entero. Enigmail además
viene con la posibilidad de obtener llaves desde servidores de llaves,
pero si tiene problemas imprimirá algunos mensajes muy raros (pero
todavía recuerda cómo usar la línea de comandos, ¿cierto?).
KMail
Si tiene configurada la bandera USE crypt, KMail será compilado
con soporte gpg y será capaz de cifrar y descifrar correos PGP
"inline" así como cifrar correos OpenPGP/MIME. Si quiere también
descifrar correos OpenPGP/MIME (probablemente sí) necesita tener un
agente GPG funcional (vea Usando un Agente
GPG).
Puede verificar si KMail está configurado apropiadamente yendo a
Settings, Configure KMail, Security, Crypto
Backends. Debería ver un entorno basado en GpgME y ser capaz de
marcar la casilla OpenPGP. Si está listada pero en color gris, haga un
click en Rescan. Si el entorno permanece grisáceo significa que
KMail no está funcionando correctamente.
Si aún es incapaz de hacer funcionar correctamente KMail, por favor
vea el KMail
PGP HowTo para más información.
Claws-Mail
Este lector de correos es muy rápido con buzones de correo
grandes, tiene todas las agradables característica que uno quiere en
un programa de este tipo y funciona bastante bien con gpg. El único
problema es que no funciona con las firmas PGP de antaño, así que
cuando recibe correos de ese tipo tiene que chequear manualmente las
firmas.
Para usar su llave gpg con Claws-Mail sólo vaya a la configuración de
la cuenta y seleccione la pestaña "privacy". Una vez ahí, elija qué
llave va a usar, la mayoría de los usuarios probablemente irá por la
llave por defecto.
7.
Criptografía de llave pública
Criptografía de llave pública básica
El concepto de criptografía de llave pública fue originalmente ideado
por Whitfield Diffie y Martin Hellman in 1976. Cuando escuché por
primera vez las palabras "llave pública" y "criptografía" en la misma
oración en el '93, pensé a mi mismo que sería imposible hacer
aquello. En ese entonces no había Internet (bueno había, pero no para
mí) así que fui a la biblioteca pública y pregunté por libros acerca
de Criptografía. Debo decir que tenía 16 años así que el encargado me
miró con asombro y me trajo un libro para niños sobre cifradores por
substitución (esos en que uno cambia una letra por otra como el famoso
Cifrador de César o ROT-13 (Tragbb rf yb zrwbe, l fnor dhr rf ohrab
cbedhr rfgn yrlraqb rfgr qbphzragb., (instale rotix si es que no puede
leer el texto anterior)). Me enojé mucho por esta situación y empecé
la búsqueda de más información al respecto. Es bueno tener matemáticos
en la familia, porque tan pronto hablé con uno de ellos, me vi metido
en un nuevo mundo.
Ahora, veamos un poco de matemáticas:
Listado de Código 7.1: Conceptos matemáticos |
Definiciones:
1- Un número primo es un número entero positivo mayor que 1 que es sólo
divisible por 1 y por sigo mismo (El resto de la división es 0).
Los primeros 8 números primos son 2,3,5,7,11,13,17,19.
Teorema (No se demuestra aquí)
1- Para cualquier número no primo entero positivo es posible separarlo como el
producto de números primos, y aquel producto es único.
4=2*2
6=2*3
8=2*4=2*2*2
10=2*5
12=2*6=2*2*3
"Hechos":
1- Es matemáticamente fácil multiplicar dos enteros grandes.
2- Es difícil encontrar los factores primos dado un entero positivo.
|
Si le doy el número 35 y le digo que este número es el producto de dos
números primos, es fácil encontrar que son el 5 y 7. Pero si le digo
lo mismo para el número 1588522601 gastará un montón de tiempo (o
ciclos de CPU) para encontrar que era 49811*31891. Y si este número es
realmente grande la tarea se vuelve "imposible". Así que ahora si le
digo al mundo el número más grande que conozco y que es el producto de
dos primos sé entonces algo acerca de ese número que nadie más conoce.
Esta es la base de las implementaciones de hoy en día de Criptografía
de Llave Pública (PKC en inglés). Como ejemplo, no realista, le doy a
alguien mi número y que aquella persona usará para cifrar un mensaje
para mi. Cualquier persona puede ver el mensaje cifrado porque soy el
único que sabe un atajo para leerlo, cualquier otra persona tendría
primero que "dividir" el número grande para ser capaz de leer el
mensaje, y es un "hecho" que es imposible de hacer eso en un periodo
corto de tiempo (los métodos actuales y las computadoras más rápidas
del mundo tomarían miles de años en hacerlo). En esta configuración
los dos números primos grandes serían llamados la "LLAVE PRIVADA" y el
número grande no primo es la "LLAVE PÚBLICA".
En la práctica esto no es un 100% acorde a la realidad, pero le dará
una buena idea al neófito. Puede encontrar más información en
Wikipedia sobre el protocolo de
Diffie-Hellman. Si está interesado, vaya a una biblioteca
pública y obtenga una copia del libro "Handbook of Applied
Cryptography" escrito por Alfred J. Menezes, Paul C. van
Oorschot and Scott A. Vanstone, este libro también está disponible en
línea sin costo alguno en el sitio mencionado anteriormente.
Como consecuencia de lo descrito más arriba, si cifra un mensaje para
mi y pierde el mensaje original no cifrado no será capaz de
recuperarlo a partir de la versión cifrada.
Firmas
Ya vimos cómo alguien puede enviarnos un mensaje cifrado si tiene su
llave pública. Pero, ¿Cómo sabemos que el autor del mensaje es
realmente quien dice ser?. En otras palabras: Si recibo un mail suyo,
¿Cómo se que es realmente suyo y no otra persona que trata de
suplantarlo?
¿Recuerda que le mencioné que la PKC no era tan simple como había
dicho? La idea es que cuando cifre un mensaje dirigido a mi, tiene que
firmarlo con su llave privada para que, cuando lo reciba pueda usar su
llave pública para verificar su firma y luego usar mi llave privada
para descifrar el mensaje. Como puede ver, no podríamos hacer eso con
la configuración descrita arriba.
También es muy importante lo siguiente, para firmar mensajes no tiene
que cifrarlos antes. Así que puede crear mensajes que pueden ser
leídos por cualquiera pero que vengan con su "marca". Y si algún
caracter cambió en el mensaje, éste puede (y será) detectado.
Servidores de llaves y llaves firmadas
Digamos que no tenga contacto previo con Ud. hasta que me envía un
mensaje, la pregunta es ¿Cómo obtengo su llave pública? y ¿Cómo se que
realmente es suya?
Para resolver este problema se crearon los Servidores de
llaves. Cuando crea su par de llaves (pública y privada), debería
enviar su llave pública al servidor de llaves. Luego de esto,
cualquier persona puede recuperarla desde ahí. Esto resuelve el
problema de encontrar la llave. Pero ¿Cómo sé realmente que la llave
corresponde a la llave del autor del mensaje? Para esto, se introduce
otro concepto, y es el de firmado de llaves:
Firmar una llave significa que, si tiene la llave pública de otra
persona, y sabe con seguridad que realmente es la llave de la
persona (es su amigo personal, alguien que conoce en la vida real,
etc.) puede firmar la llave pública y enviarla a los servidores de
llaves, de esa manera estará diciéndole al mundo: "Esta llave
realmente pertenece a la persona que dice ser". Así, las personas que
tengan su llave pública puede usar esa "confianza" para, valga la
redundancia, confiar en otras llaves.
Esto algunas veces puede causar confusión, así que veamos una
situación real:
Imaginemos una situación en que participan 3 personas: Juan, María y
Lisa. Juan es un buen amigo de María pero no conoce a Lisa; Lisa es
buena amiga de María pero no conoce a Juan. Un día Lisa le envía a
Juan un correo firmado. Juan recuperará la llave pública de Lisa desde
algún servidor de llaves y chequeará el mensaje, si todo marcha bien
él verá que quien haya creado el mensaje también creó la llave. Pero,
¿Cómo sabe que es realmente la persona que dice ser?
Juan entonces ve que la llave está firmada por María, puede chequearlo
porque ya tiene la llave de María y confía en esa llave. Con este
anillo de confianza, Juan puede concluir que el correo que recibió
realmente fue escrito por Lisa.
Ahora está listo para usar esta guía, vuelva al Capítulo 1 y aprenda a
cómo usar gpg.
8.
Consideraciones finales y créditos
Algunos problemas
Tuve algunos problemas con fotos en las llaves. Verifique la versión
que está usando. Si tiene la versión GnuPG 1.2.1-r1 o mayor
probablemente no tenga problemas, versiones más viejas pueden
tenerlos. A muchos servidores de llaves tampoco le gustan mucho las
llaves con fotos.
Las últimas versiones de gnupg no parecen funcionar con el comando
gpg --send-keys que fue usado para enviar todas las llaves de
su anillo al servidor de llaves.
¿Qué es lo que no hay aquí?
gpg es una herramienta muy compleja, le permite hacer mucho más
de lo cubierto aquí. Este documento es para el usuario que es nuevo en
GnuPG. Para más información, deberá leer el sitio Web de GnuPG.
No se escribió de otras herramientas como pgp4pine,
gpgpine, evolution o tal vez herramientas para Windows,
probablemente se extienda este documento en el futuro.
Créditos
El Manual de GnuPG de John
Michael Ashley es muy buen libro para los principiantes.
Swift (Sven Vermeulen) por motivarme a reescribir esta guía.
A todos los integrantes del canal de IRC #gentoo-doc.
Gracias a Tiago Serra por apoyarme en el estudio de la
privacidad.
El contenido de este documento está registrado bajo los términos de
la licencia
Creative Commons - Reconocimiento / Compartir Igual
|