Software de encriptación GPG

GPG (GNU Privacy Guard, gnupg.org, paquete gnupg) es un software de encriptación utilizado para cifrar y firmar documentos digitales, especialmente el correo, que utiliza criptografía híbrida: combina criptografía simétrica (por su rapidez), con criptografía asimétrica (por no necesitar compartir claves secretas). Sigue el estándar OpenPGP del IETF (Internet Engineering Task Force) y está integrado en numerosos programas como Secure-APT, Kmail, Evolution, Mozilla-Thunderbird, etc.

Equivalencias en Windows: PGP.

Recursos

Cómo funciona GPG

Veamos cómo funciona GPG.

  • Necesitaremos un par de claves pública/privada. Para generarlas haremos:
    $ gpg --gen-key

    La primera vez que lo ejecutemos creará el directorio ~/.gnupg y los archivos:

    • ~/.gnupg/gpg.conf: archivo de configuración de GPG.
    • ~/.gnupg/pubring.gpg (binario): archivo de claves públicas (anillo).
    • ~/.gnupg/secring.gpg (binario): archivo de claves privadas (anillo).
    • ~/.gnupg/trustdb.gpg (binario): base de datos de confianza.

    A continuación tendremos que responder a una serie de preguntas:

    • Tipo de clave
      Por favor seleccione tipo de clave deseado:
      (1) DSA y ElGamal (por defecto)
      (2) DSA (sólo firmar)
      (5) RSA (sólo firmar)
      Su elección:

      Seleccionamos el tipo de clave por defecto, 1.

    • Longitud de la clave
      El par de claves DSA tendrá 1024 bits
      Las claves ELG-E pueden tener entre 1024 y 4096 bits de longitud
      ¿De qué tamaño quiere la clave? (2048)

      Seleccionamos la longitud por defecto, 2048.

    • Caducidad
      Especifique el período de validez de la clave.
      0=    la clave nunca caduca
      <n>=  la clave caduca en n d&iacute;as
      <n>w= la clave caduca en n semanas
      <n>m= la clave caduca en n meses
      <n>y= la clave caduca en n a&ntilde;os
      &iquest;Validez de la clave (0)?

      Seleccionamos un año: 1y.

    • Identificador de usuario
      Necesita un identificador de usuario para identificar su clave.
      El programa construye el identificador a partir del Nombre,
      Comentario y email de esta forma:
      "Heinrich Heine (Der Dichter) <[email protected]>"
      Nombre y apellidos: frans berns
      Email: [email protected]
      Comentario: francis
      Ha seleccionado este ID de usuario:
      "frans berns (francis) <[email protected]>"
      &iquest;Cambiar (N)ombre, (C)omentario, (D)irecci&oacute;n, (V)ale o (S)alir?

      Si está bien pulsamos (V)ale y continuamos.

    • Passphrase
      Necesita una Frase contrase&ntilde;a para proteger su clave privada
      Introduzca Frase contrase&ntilde;a:
      Repita Frase contrase&ntilde;a:

    Una vez introducidos todos los datos, generará el par de claves. Durante este proceso GPG recoge datos aleatorios que usará para generar las claves:

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

    Cuando termine nos mostrará el mensaje final:

    ~/.gnupg/trustdb.gpg: se ha creado base de datos de confianza.
    Clave ED4B2ABA marcada como de confianza absoluta.
    Claves p&uacute;blica y secreta creadas y firmadas.
    Comprobando base de datos de confianza:
    3 dudosas necesarias, 1 completa necesaria.
    Modelo de confianza PGP:
    Nivel: 0 Validez: 1 Firmada: 0 Confianza: 0-, 0q, 0n, 0m, 0f, 1u
    Siguiente comprobaci&oacute;n de base de datos de confianza el 2007-04-09
    pub 1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09]
    Huella de clave: C8F1 06C9 27C9 C2D1 2205 95F3 14BB 1129 ED4B 2ABA
    uid frans berns (francis) <[email protected]>
    sub 2048g/D223B5B2 2006-04-09 [caduca: 2007-04-09]
  • Para comprobar si se han generado las claves, las listamos:
    • listamos las claves públicas (de momento sólo está la nuestra):
      $ gpg --list-keys
      /home/francis/.gnupg/pubring.gpg
      --------------------------------
      pub 1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09]
      uid frans berns (francis) <[email protected]>
      sub 2048g/D223B5B2 2006-04-09 [caduca: 2007-04-09]

      El UID lo utilizaremos cuando tengamos que seleccionar una clave. El UID de nuestra clave es ED4B2ABA.

    • listamos las claves privadas:
      $ gpg --list-secret-keys
      /home/francis/.gnupg/secring.gpg
      --------------------------------
      sec 1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09]
      uid frans berns (francis) <[email protected]>
      ssb 2048g/D223B5B2 2006-04-09
  • Para conocer el fingerprint de la clave cuyo UID es ED4B2ABA, haremos (si no especificamos el UID obtendremos los fingerprint de todas las claves):
    $ gpg --fingerprint ED4B2ABA
    Huella de clave: C8F1 06C9 27C9 C2D1 2205 95F3 14BB 1129 ED4B 2ABA

    Vemos que el UID de una clave son los últimos 8 caracteres de su fingerprint. El fingerprint lo utilizaremos para comprobar las claves que recibamos antes de certificarlas, y con nuestra clave para dárselo en mano o por teléfono a otros usuarios.

  • Podemos editar los parámetros de una clave con el comando:
    $ gpg --edit-key ED4B2ABA

    Entraremos en modo interactivo, donde disponemos de numerosos comandos. Por ejemplo, para modificar la fecha de caducidad ejecutaremos el comando:

    Command> expire

    Nos pedirá la passphrase y guardaremos los cambios con:

    Command> save
  • Para ver los certificados de las claves públicas que tenemos, haremos:
    $ gpg --list-sigs
    /home/francis/.gnupg/pubring.gpg
    --------------------------------
    pub   1024D/ED4B2ABA 2006-04-09 [caduca: 2007-04-09]
    uid                     frans berns(francis)<[email protected]>
    sub   2048g/D223B5B2 2006-04-09 [caduca: 2007-04-09]
    sig ED4B2ABA 2006-04-09 frans berns(francis)<[email protected]>

    Vemos que sólo tiene nuestro certificado.

  • Podemos borrar claves:
    • para borrar la clave pública cuyo UID es aa8e6a57, haremos:
      $ gpg --delete-key aa8e6a57
    • para borrar la clave privada cuyo UID es ED4B2ABA, haremos:
      $ gpg --delete-secret-key ED4B2ABA
  • Una vez que se tiene el sistema funcionando necesita ser mantenido:
    • para mantener actualizados los niveles de confianza, haremos:
      $ gpg --refresh-keys
    • para actualizar las claves del servidor, por si alguién añade un certificado a una clave y lo envía al servidor, haremos:
      $ gpg --check-trustdb

Frontales gráficos para GPG

Existen diversos frontales gráficos para gestionar GPG y los certificados:

  • Kgpg (paquete kgpg): frontal para GPG de KDE, integrado con Konqueror. Permite encriptar/desencriptar archivos y gestionar las claves (generar, exportar, importar, borrar, firmar, etc.).

    Kgpg

  • Kleopatra (paquete kleopatra): gestor de certificados X509 para KDE.

    Kleopatra

Distribución de claves públicas GPG

  • La clave pública tenemos que distribuirla. Podemos hacerlo de varias maneras:
    • para exportar nuestra clave pública a un archivo que posteriormente podemos enviar por correo, haremos:
      $ gpg -a --export ED4B2ABA > <archivo>.gpg

      La opción -a genera un archivo ASCCI.

    • para enviar nuestra clave pública a un repositorio de claves, primero editaremos el archivo ~/.gnupg/gpg.conf y descomentaremos la línea correspondiente a ese servidor, en este caso RedIRIS:
      keyserver pgp.rediris.es

      Para enviar nuestra clave pública, cuyo UID es ED4B2ABA, al servidor RedIRIS, haremos:

      $ gpg --send-keys ED4B2ABA

      Podemos añadir más servidores de claves en ~/.gnupg/gpg.conf, por ejemplo el MIT:

      keyserver pgpkeys.mit.edu

      Para conectar con un servidor específico usaremos la opción –keyserver, por ejemplo:

      $ gpg --keyserver pgpkeys.mit.edu --send-keys ED4B2ABA
  • Si hemos enviado nuestra clave a un repositorio, podemos revocar la clave mediante un certificado de revocación. Cuando creamos una clave es muy recomendable crear el certificado de revocación: puede ocurrir que perdamos la passphrase y no podamos utilizar la clave privada: en ese caso tendremos que revocar la clave, pero no podremos hacerlo por no disponer de la passphrase. Para crear el certificado de revocación de la clave cuyo UID es ED4B2ABA, haremos:
    $ gpg -a -o cert_revoc.asc --gen-revoke ED4B2ABA
    &iquest;Crear un certificado de revocaci&oacute;n para esta clave? (s/N)

    Nos preguntará porqué revocamos la clave.

    Elija una raz&oacute;n para la revocaci&oacute;n:
    0 = No se dio ninguna raz&oacute;n
    1 = La clave ha sido comprometida
    2 = La clave ha sido reemplazada
    3 = La clave ya no est&aacute; en uso
    Q = Cancelar

    Elegiremos 3 = La clave ya no está en uso.

    Nos pedirá un comentario opcional. Pondremos:

    Certificado por si pierdo la passphrase

    Por último tendremos que introducir la passphrase. El mensaje final es:

    Certificado de revocaci&oacute;n creado.
    Cuidado: si alguien consigue este certificado puede inutilizar su clave.
    Es inteligente imprimir este certificado por si acaso lo pierde.

    Se habrá generado el archivo ~/.gnupg/cert_revoc.asc (la opción -a genera un archivo ASCCI).

    Si más adelante necesitamos revocar la clave, añadiremos a nuestro listado de claves el certificado de revocación:

    $ gpg --import cert_revoc.asc

    y luego enviaremos al servidor la clave revocada:

    $ gpg --send-keys ED4B2ABA

Utilizar claves públicas GPG de otros usuarios

  • Cuando se recibe una clave pública de otro usuario tenemos que añadirla a la base de datos de claves públicas (anillo de claves públicas). Podemos hacerlo de varias maneras:
    • si hemos recibido de ese usuario un archivo con su clave pública, haremos:
      $ gpg --import <archivo>
    • si queremos bajarnos de un repositorio la clave pública de alguien, necesitamos su UID. Si tenemos su fingerprint, los últimos 8 caracteres son el UID. Para comprobar si el servidor dispone de la clave cuyo UID es aa8e6a57, haremos:
      $ gpg --search-key aa8e6a57

      Para bajarnos la clave cuyo UID es aa8e6a57, haremos:

      $ gpg --recv-keys aa8e6a57

      Para conectarnos a un servidor específico usaremos la opción –keyserver, por ejemplo:

      $ gpg --keyserver pgpkeys.mit.edu --recv-keys aa8e6a57
  • Para poder utilizarlas claves públicas de otros usuarios debemos decirle a GPG que son válidas, cosa que podemos hacer de dos maneras:
    • las claves públicas van acompañadas de un listado de certificados X509, el primero de los cuales es del propietario de la clave. Cada certificado está emitido por un certificador, que es un usuario que ha considerado válida esa clave pública. Yo tendré una base de datos de certificadores y a cada uno le asignaré un nivel de confianza: Nula, Total o No lo conozco. Cuando yo reciba una clave pública y a alguno de sus certificadores yo lo tenga catalogado con un nivel de confianza Total, automáticamente GPG considerará esa clave válida. De lo contrario, no será válida y no podré usarla, ya que no será de fiar, a no ser que yo mismo confirme su validez.

      Cualquier usuario puede certificar una clave, pero existen instituciones que se dedican expresamente a la tarea de certificar claves públicas: son las llamadas Autoridades Certificadoras (CA, Certificate Authority), como VeriSign, OpenCA, EnTrust, etc.

    • confirmo yo su validez. Si la clave pública recibida no viene firmada por ningún certificador de confianza total, para usarla tendré que darle yo validez. Previamente tendré que obtener el fingerprint por un medio alternativo y seguro (por ejemplo, por teléfono) y comprobar si el fingerprint de dicha clave pública corresponde realmente al remitente. Certificar una clave pública sin verificarla adecuadamente implica asumir el riesgo de una posible suplantación. De esa manera, mi nombre se añadirá al listado de certificadores que acompaña a la clave. En ese caso, tengo la opción de reenviar la clave con mi firma a su dueño para que disponga de ella.

      Por ejemplo, si quiero enviar un documento cifrado a alguien y su clave pública no está certificada, la certificaré yo haciendo:

      $ gpg --sign-key aa8e6a57

      o bien:

      $ gpg --edit-key aa8e6a57

      Entraremos en modo interactivo, y ejecutaremos la orden:

      Command> sign

      Nos pedirá la passphrase, confirmaremos que queremos certificar la clave y guardaremos los cambios:

      Command> save

      Previamente tengo que asegurarme de que esa clave es suya.

      Si he certificado la clave, puedo enviarla al servidor de claves incluyendo ese certificado:

      $ gpg --send-keys aa8e6a57

      Si no estoy seguro de que la clave sea suya pero de todos modos quiero utilizarla para cifrar un documento, lo que hare será certificar su clave (así podré usarla) pero de manera que mi certificado no se exporte a los servidores, haciendo:

      $ gpg --edit-key aa8e6a57

      En vez de:

      Command> sign

      pondremos:

      Command> lsign

      Esto significa que nuestro certificado es local y no se exportará. Confirmaremos que queremos certificar la clave y guardaremos los cambios.

Infraestructura de clave pública (PKI)

Para facilitar el uso de la tecnología de claves públicas, se ha desarrollado una Infraestructura de clave pública (PKI, Public Key Infrastructure), que consta de:

  • repositorios de claves públicas: se encargan de almacenar claves públicas para facilitar a los usuarios el intercambio de las mismas. No garantizan que la claves sean válidas: para eso están los certificados incorporados a las propias claves.

    Existen servidores de claves públicas repartidos por todo el mundo, como por ejemplo el de RedIRIS (rediris.es/cert/servicios/keyserver/). Es suficiente enviar la clave pública a un servidor: la información que mandemos se distribuirá rápidamente por otros servidores de claves, y ya no podremos borrar esos datos, sólo revocar la clave si tenemos el certificado de revocación.

  • autoridades certificadoras: se encargan de emitir, revocar y validar certificados. Es la entidad de confianza que da legitimidad a una clave pública.

Cifrar con GPG

Para cifrar, GPG usa cifrado híbrido: utiliza la clave pública de un usuario, y sólo ese usuario podrá descrifrarlo utilizando su clave privada.

  • Para cifrar un archivo, la sintaxis es:
    $ gpg -a -o <archivo_cifrado> -r <UID> -e <archivo>
    • -o <archivo_cifrado>: archivo cifrado.
    • -r <UID>: indica el UID del destinatario, y por tanto, el único que podrá descifrar el mensaje usando de su clave privada.
    • -e <archivo>: archivo que va a ser cifrado.
    • -a: genera un archivo ASCCI.

    Por ejemplo, para cifrar el archivo /etc/hostame con nuestra clave pública (para que sólo nosotros podamos descrifrarlo, con nuestra clave privada) y generar el archivo cifrado hostame_cifrado (texto), haremos:

    $ gpg -a -o hostame_cifrado -r ED4B2ABA -e /etc/hostame
  • Para descifrar un archivo, sólo podremos hacerlo si ha sido cifrado con nuestra clave pública. La sintaxis es:
    $ gpg -o <archivo> -d <archivo_cifrado>
    • -o <archivo>: archivo descifrado.
    • -d <archivo_cifrado>: archivo que va a ser descifrado.

    Por ejemplo, para descifrar el archivo hostame_cifrado y generar el archivo descifrado hostame_new, haremos:

    $ gpg -o hostame_new -d hostame_cifrado
    Necesito la passphrase del usuario:
    frans berns (francis) <[email protected]>
    para la clave primaria ED4B2ABA, creada el 2006-04-09

    Introducimos la passphrase que protege la clave privada y descifrará el archivo, que es idéntico al original /etc/hostame.

Firmar con GPG

Para firmar, GPG usa cifrado híbrido.

  • Para firmar un archivo con nuestra clave, la sintaxis es:
    $ gpg -r <UID> --sign <archivo>
    • -u <UID>: cuando tenemos varias claves privadas tenemos que seleccionar cuál se va a utilizar para firmar el documento.

    Nos pedirá la passphrase y generará un archivo comprimido (binario) que incluye la firma. Por ejemplo, si hacemos:

    $ gpg --sign hostame_new

    obtenemos hostame_new.gpg, un archivo comprimido (binario) que incluye la firma.

  • Para firmar un archivo con nuestra clave, pero sin comprimir, la sintaxis es:
    $ gpg --clearsign <archivo>

    Nos pedirá la passphrase y generará un archivo de texto que incluye la firma. Por ejemplo, si hacemos:

    $ gpg --clearsign hostame_new

    obtenemos hostame_new.asc, un archivo de texto que incluye la firma.

  • Si queremos firmar un archivo con nuestra clave, y que la firma vaya en un fichero binario aparte, haremos:
    $ gpg --detach-sign <archivo>

    Nos pedirá la passphrase y generará un archivo binario que contiene sólo la firma. Esto se utiliza normalmente para firmar archivos binarios o comprimidos. Por ejemplo, si hacemos:

    $ gpg --detach-sign hostame_new

    obtenemos hostame_new.sig, un archivo binario que contiene sólo la firma.

    Para que el archivo que contiene la firma sea un archivo de texto, incluiremos la opción -a. Por ejemplo, si hacemos:

    $ gpg -a --detach-sign hostame_new

    obtenemos hostame_new.asc, un archivo de texto que contiene sólo la firma.

  • Para verificar la firma que acompaña un documento, haremos:
    $ gpg --verify <archivo>

Artículos en la categoría "Encriptación y Criptografía"

  1. Checksum MD5
  2. Conexión remota segura SSH
  3. Software de encriptación GPG
  4. APT seguro (Secure APT)
  5. HTTPS (HTTP seguro): SSL

3 Comments:

  1. Felicitaciones por el tutorial. Excelente. Tengo la siguiente pregunta cuando se refieren a “las claves públicas van acompañadas de un listado de certificados X509, el primero de los cuales es del propietario de la clave. Cada certificado está emitido por un certificador, que es un usuario que ha considerado válida esa clave pública. Yo tendré una base de datos de certificadores y a cada uno le asignaré un nivel de confianza: Nula, Total o No lo conozco”

    ¿Como puedo saber que certificadores tengo y en que nivel de confianza estan? ¿como conozco la base de datos?
    Muchas Gracias. (Utlizo GnuPG)

  2. quiero agregar un archivo .jpg a mi llave publica cual es el codigo para hacer esto

    saludos

  3. Hola:
    Tengo una duda, ¿cómo se evita que dos personas tengan claves iguales?
    Saludos