Seguridad‎ > ‎Criptografía‎ > ‎

GnuPG


¿ Qué es GnuPG  (GPG) ?

GPG es una herramienta que sirve para firmado digital y cifrado, es la alternativa abierta y libre a PGP, basada en el estándar IETF llamado OpenPGP.
GPG es un sistema híbrido, que combina y permite el uso de las mejores características del cifrado simétrico y asimétrico.

El usuario puede generar un par de claves (una pública y privada, que, por el nombre notamos que sólo la primera se debe distribuir) tanto como para cifrado como para firmado, cuando estas se generan (usando un algoritmo simétrico libre de patentes como 3DES, AES y Blowfish), se "genera entropía" usando el movimiento del mouse y teclas pulsadas ...

Luego, cuando ciframos, usamos la clave pública del receptor, que .. junto con su clave privada y su contraseña usa para decodificar el contenido. Nótese además que el proceso de cifrado también incluye compresión (zip,zlib y bzip2), lo cual no sólo mejora la calidad de encripción, sino que también reduce el espacio usado significativamente.

Y Para firmar, un usuario usa su clave privada para generar una verificación, que indica que el contenido fue escrito por quien dice la clave, cosa que puede verificarse con la clave pública.

Tareas comunes de GPG En GNU/Linux

Antes de proceder, tenemos que asegurarnos de tener instalado gpg (ver Instalacion de Software bajo Linux ), tenemos dos ramas distintas, tanto la versión 1.* como la 2.*,  (la 1 es la más portable e independiente, a diferencia de la 2, que es más completa, díficil de compilar y modular), elegir una u otra queda en las necesidades del lector.
una vez instalado podemos verificar que la instalación haya sido exitosa y ver de qué opciones disponemos usando "gpg --version" por consola, obteniedo en mi caso :

vertex@Symphony ~ $ gpg --version
gpg (GnuPG) 2.0.14
libgcrypt 1.4.4
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
        CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

hecho esto, estamos listos para las siguientes secciones que enumeran las tareas comunes con gpg

Creando el par de claves

Nota : los archivos con la clave pública y privada se van a almacenar en ~/.gnupg de fábrica ...

Para crear el par, debemos ejecutar el siguiente comando : 

Usuario@Symphony ~ $ gpg --gen-key
gpg (GnuPG) 2.0.14; Copyright (C) 2009 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.

gpg: directorio `/home/Usuario/.gnupg' creado
gpg: creado un nuevo fichero de configuración `/home/Usuario/.gnupg/gpg.conf'
gpg: AVISO: las opciones en `/home/Usuario/.gnupg/gpg.conf' no están aún activas en esta ejecución
gpg: anillo `/home/Usuario/.gnupg/secring.gpg' creado
gpg: anillo `/home/Usuario/.gnupg/pubring.gpg' creado
Por favor seleccione tipo de clave deseado:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sólo firmar)
   (4) RSA (sólo firmar)
Su elección:



Acá entra el gusto personal, pero un detalle, las claves marcadas como "sign only" no se pueden usar para encriptar, solo para firmar.
en el caso de RSA, desde la versión 1.4 de gpg que se puede elegir "RSA and RSA" en vez de tener que crear una clave de firmado RSA y una subclave de encripción.
en mi caso, elijo RSA ... a esto, tenemos que elegir también de cuantos bits queremos la clave (entre 1024 y 4096) , también es elección personal, en mi caso voy a elegir 4096

Luego, podemos elegir si queremos que la clave expire o no, tenemos varias opciones :

  • 0 : No expira
  • n : Expira en n días
  • nw : Expira en n semanas (w es un sufijo al número, que viene de "week", semana)
  • nm : Expira en n meses (m es un sufijo al número, que viene de "month", mes)
  • ny : Expira en n años (w es un sufijo al número, que viene de "year", año)
el indicar cuanto tiempo se consideraría válida una clave es una elección personal y una "medida de seguridad", ya que podemos extender el cuando expira y además nos pueden seguir mandando mails usando la clave expirada, también podemos añadir más claves "de continuación" aunque, los servidores de claves pueden eliminar nuestra clave !

en mi caso, selecciono que no expira ...

Luego, viene nos pide un Nombre y mail para la creación del ID de usuario o UID, en mi caso elijo
 "Alex Kuster" y escribo mi mail ....

Finalmente elegimos nuestro password y el asistente nos va a pedir que "generemos entropía" como bien mencioné antes :

Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
la red y los discos) durante la generación de números primos. Esto da al
generador de números aleatorios mayor oportunidad de recoger suficiente
entropía.

hecho esto :
/home/Usuario/.gnupg/trustdb.gpg: se ha creado base de datos de confianza
gpg: clave 0F4C328E 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:   1  firmada:   0  confianza: 0-, 0q, 0n, 0m, 0f, 1u
pub   4096R/0F4C328E 2010-03-06
      Huella de clave = C690 531A 881A 5100 6324  6BBC 6669 CE89 0F4C 328E
uid                  Alex Kuster <Vertex. Symphony@ elhacker.
net
>
sub   4096R/D42B3241 2010-03-06

y tenemos nuestra clave lista para usar, esta es 0x
0F4C328E !

Agregar Otro UID

¿Tenés otro mail ? no hay problema, podemos agregarlo como otro user ID

Usuario@Symphony ~ $ gpg --edit-key 0x0F4C328E
gpg (GnuPG) 2.0.14; Copyright (C) 2009 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.

Clave secreta disponible.

pub  4096R/0F4C328E  creado: 2010-03-06  caduca: nunca       uso: SC
                     confianza: absoluta      validez: absoluta
sub  4096R/D42B3241  creado: 2010-03-06  caduca: nunca       uso: E
[  absoluta ] (1). Alex Kuster <Vertex. Symphony@ elhacker.
net
>

Orden> adduid
Nombre y apellidos: Alex Kuster
Dirección de correo electrónico: otra.direccion.de@correo.com
Comentario:
Ha seleccionado este ID de usuario:
    "Alex Kuster <otra.direccion.de@correo.com>"

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

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Alex Kuster <Vertex.Symphony@elhacker.
net
>"
clave RSA de 4096 bits, ID 0F4C328E, creada el 2010-03-06

pub  4096R/0F4C328E  creado: 2010-03-06  caduca: nunca       uso: SC
                     confianza: absoluta      validez: absoluta
sub  4096R/D42B3241  creado: 2010-03-06  caduca: nunca       uso: E
[  absoluta ] (1)  Alex Kuster <Vertex. Symphony @elhacker.
net
>
[desconocida] (2). Alex Kuster <otra.direccion.de@correo.com>

Orden> save


Seleccionar UID como primario

En caso de tener más de un UID, podemos elegir cual queremos que sea el primario de la clave :

Usuario@Symphony ~ $ gpg --edit-key 0x0F4C328E
gpg (GnuPG) 2.0.14; Copyright (C) 2009 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.                

Clave secreta disponible.

gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,
modelo de confianza PGP
gpg: nivel: 0  validez:   1  firmada:   0  confianza: 0-, 0q, 0n, 0m, 0f, 1u
pub  4096R/0F4C328E  creado: 2010-03-06  caduca: nunca       uso: SC
                     confianza: absoluta      validez: absoluta
sub  4096R/D42B3241  creado: 2010-03-06  caduca: nunca       uso: E
[  absoluta ] (1). Alex Kuster <otra.direccion.de@correo.com>
[  absoluta ] (2)  Alex Kuster <Vertex. Symphony@ elhacker.
net
>

Orden> uid 2

pub  4096R/0F4C328E  creado: 2010-03-06  caduca: nunca       uso: SC
                     confianza: absoluta      validez: absoluta
sub  4096R/D42B3241  creado: 2010-03-06  caduca: nunca       uso: E
[  absoluta ] (1). Alex Kuster <otra.direccion.de@correo.com>
[  absoluta ] (2)* Alex Kuster <Vertex. Symphony@ elhacker.
net
>

Orden> primary


luego de ingresar nuestra clave luego de ejecutar "primary", ejecutamos save para guardar los cambios....

Agregar subclave para encripción

En el caso que mencioné, de tener un GnuPG desactualizado, uno puede agregar una subclave para encripción (para seleccionar otro uid, usar el comando uid como se muestra en la sección anterior) :

Usuario@Symphony ~ $ gpg --edit-key 0x0F4C328E
gpg (GnuPG) 2.0.14; Copyright (C) 2009 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.                

Clave secreta disponible.

pub  4096R/0F4C328E  creado: 2010-03-06  caduca: nunca       uso: SC  
                     confianza: absoluta      validez: absoluta       
sub  4096R/D42B3241  creado: 2010-03-06  caduca: nunca       uso: E   
[  absoluta ] (1). Alex Kuster <Vertex. Symphony@ elhacker.
net
>         
[  absoluta ] (2)  Alex Kuster <otra.direccion.de@correo.com>         

Orden> addkey
La clave está protegida.

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Alex Kuster <Vertex. Symphony@ elhacker.
net
>"
clave RSA de 4096 bits, ID 0F4C328E, creada el 2010-03-06


el resto es terreno familiar, completamos datos, generamos entropía y voilá, para terminar, como habrás intuído, ejecutamos "save"


Servidores para enviar y recibir claves

Uno de los problemas que uno enfrenta es la distribución de su clave pública, y el uso de servidores de clave es una solución, ya que ellos se encargan de recibir las claves y difundirlas a otros servidores y así tener un directorio (al buen estilo guía telefónica) de claves ...

para enviar nuestra clave, hacemos lo siguiente : 

Usuario@Symphony ~ $ 
gpg --keyserver pgp.mit.edu --send-key 
0x0F4C328E
y para que otro la reciba, el comando es bastante similar
Usuario@Symphony ~ $ 
gpg --keyserver pgp.mit.edu --recv-key 
0x0F4C328E

en --keyserver podemos usar el servidor que querramos, así como también podemos evitar el comando agregando nuestro servidor favorito a ~/.gnupg/gpg.conf
por ejemplo agregamos :

keyserver hkp://subkeys.pgp.net

Exportar clave pública

Si necesitaramos subir  manualmente a un servidor nuestra clave o enviarla por mail, podríamos ejecutar el siguiente comando :

Usuario@Symphony ~ $ 
gpg --armor --export 0x0F4C328E > ./MiClave.asc

indicamos que queremos una salida ASCII con --armor y con --export indicamos qué clave queremos exportar .... y naturalmente lo guardamos en MiClave.asc para tenerlo listo para subir !

Generar certificado de revocación


En el caso de que mi clave sea vulnerada, puedo generar un certificado de revocación, el que subo a un servidor para indicar que mi clave no está más en uso ...
es importante solo generarlo cuando vamos a usarlo, ya que si generamos el certificado, y alguien lo obtiene, podría inhabilitar nuestra clave tranquilamente

Usuario@Symphony ~ $ gpg --armor --gen-revoke 0x0F4C328E

sec  4096R/0F4C328E 2010-03-06 Alex Kuster <Vertex. Symphony@ elhacker.
net
>

¿Crear un certificado de revocación para esta clave? (s/N) s
Por favor elija una razón para la revocación:               
  0 = No se dio ninguna razón                               
  1 = La clave ha sido comprometida                         
  2 = La clave ha sido reemplazada.                         
  3 = La clave ya no está en uso                            
  Q = Cancelar                                              
(Probablemente quería seleccionar 1 aquí)                   
¿Su decisión? 1                                             
Introduzca una descripción opcional; acábela con una línea vacía:
> Esta clave ha sido vulnerada por que ...... (motivo)
>                                                     
Razón para la revocación: La clave ha sido comprometida
Esta clave ha sido vulnerada por que ...... (motivo)   
¿Es correcto? (s/N) s                                  

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Alex Kuster <Vertex. Symphony@ elhacker.
net
>"      
clave RSA de 4096 bits, ID 0F4C328E, creada el 2010-03-06

se fuerza salida con armadura ASCII.
Certificado de revocación creado.

Por favor consérvelo en un medio que pueda esconder; si alguien consigue
acceso a este certificado puede usarlo para inutilizar su clave.
Es inteligente imprimir este certificado y guardarlo en otro lugar, por
si acaso su medio resulta imposible de leer. Pero precaución: ¡el sistema
de impresión de su máquina podría almacenar los datos y hacerlos accesibles
a otras personas!
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.14 (GNU/Linux)
Comment: A revocation certificate should follow

iQJTBCABAgA9BQJLkg5VNh0CRXN0YSBjbGF2ZSBoYSBzaWRvIHZ1bG5lcmFkYSBw
b3IgcXVlIC4uLi4uLiAobW90aXZvKQAKCRBmac6JD0wyjk8AEAC/PvE/05BOJpJU
JSg5+ESTR8QzPXlooeygOrqVu13nmS3Vjz/zfRkJM1ADwO9DY6oqn46pqOR/cKzZ
2mnPf0fAvXhvGTd1LNEm0HI4U42H/RpFnH9kt3OKpSJSFACwp6Xw727wtKHnRC5h
DnfWrGMqDF2tGqY0oSYizR2BWfuAhbWdU8wSiiw9IzkB4aLhhFBjJqDhX/E24yoT
wRBbk6X4rVe7wfCdHHGROrlvs4+1pPZwuGMx9H8awJXdwI/50LuvEXyyDU27KMQ5
AsJe1XvZz1nBZNa2YI5hWnWyesR7lfAOIaEf/kq/DiZmiGTX2tn28TXcF6ZUej1N
ddXIsgC3rX2kYGz8J90P0R1eOMwRDkr8R7jiu7w3Ul5X2AGTUxkXkCsppzRAkDUC
9Z/hSw2MCpW7knmszBCZ3cofke+IBdIFttPHMMgDSgLibyiKq8gq7kdAhn1gR6sm
POHm+XBIKrdHJUPORj2XXC4UiyTK5K851USaQh4Pn43C8bsAjT0qtJQTTCQdTMsq
q1VVb6FzZHVnAZr9gbZS/D/vg+VaLQl6VZQVdBHt+OqP2ez8WdHRxXeECtmkN5Cs
MU37mSM5hTI2CFRTljAy7260xs6Nb5KTl14gp8PWZkplUFgFGEn5+0/Jy2qvtlSf
BjJ0NJn72agyotbGpB32doMGxZgi0w==
=Kb2H
-----END PGP PUBLIC KEY BLOCK-----


lo que está en azul es lo que nos importa, lo guardamos en un archivo de texto, por ejemplo, certificadoRevocacion.txt

Usuario@Symphony ~ $ nano certificadoRevocacion.txt #acá guardo el certificado (lo azul)
Usuario@Symphony ~ $ gpg --import ./certificadoRevocacion.txt
gpg: clave 0F4C328E: "Alex Kuster <Vertex.Symphony@ elhacker.net>" certificado de revocación importado
gpg: Cantidad total procesada: 1
gpg:         nuevas revocaciones de claves: 1
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,
modelo de confianza PGP
gpg: nivel: 0  validez:   1  firmada:   0  confianza: 0-, 0q, 0n, 0m, 0f, 1u
Usuario@Symphony ~ $ gpg --keyserver pgp.mit.edu --send-keys 0x0F4C328E
gpg: enviando clave 0F4C328E a hkp servidor pgp.mit.edu
Usuario@Symphony ~ $

y listo, clave revocada !

Referencias
Comments