PGP, criptología y la limpieza de primavera

Algún día tendría que escribir sobre mi involucración con la versión Atari de PGP o cómo viví en directo todo el tema de la vigilancia de Phil Zimmermann, la exportación del libro y la versión internacional de PGP. O sobre el movimiento Cypherpunk. Han pasado 20 años y, la verdad, no me siento nada mayor. Es más, siento que todo ese trabajo es más necesario ahora que nunca, y me alegra comprobar que mucha de la vieja guardia sigue activa.

Pero eso será otro día. Hoy toca limpieza criptológica primaveral. Al menos de las partes que puedo hacer públicas :-).

El primer lugar he cambiado mi clave PGP. La clave original se creó en enero de 1995. Hace 19 años. No es mala vida para algo confidencial que ha sobrevivido innumerables mudanzas informáticas y tecnológicas, pero ya iba tocando actualizarla.

Los motivos:

  • La clave original era RSA de 1024 bits. Aunque estas claves siguen siendo seguras para cualquiera que no tenga a la NSA (o a las mafias rusas :-) detrás, empieza a estar en el límite. Algo en plan "va tocando actualizar". Sin prisa, pero una vocecilla ahí, al fondo del cráneo...

  • La clave tiene 19 años. Nada del otro mundo. Mientras no se filtre por ahí, es segura, y tengo acumuladas en ella firmas digitales que atesoro, tengo documentos importantes protegidos con ella, etc. También he acumulado identificadores de usuario que ya están anticuados y hay que ir dejando atrás. Pero esos 19 años son un problema por el punto siguiente.

  • La clave es antigua y tiene un formato antiguo. Como hash usa SHA1 y no se puede cambiar. No puedo generar subclaves. Si alguien me quería enviar algo cifrado necesitaba emplear el algoritmo IDEA, con un diseño muy interesante, pero que hasta que caducó su patente en 2012 era un dolor de muelas (requería compilar el módulo IDEA de forma separada, un follón). En 2012, precisamente, apareció un ataque criptográfico sobre IDEA. El artículo es bastante interesante, y muy fácil de leer. No me parece un ataque que comprometa la seguridad de IDEA de forma significativa, porque sólo acelera la búsqueda de la clave cuatro veces respecto a fuerza bruta. O sea, sigue siendo necesario más tiempo que la edad del universo.

    Pero es verdad que desde Rijndael el grueso de la investigación en criptoanálisis se ha centrado en analizarlo a él, dejando de lado algoritmos de alta calidad pero minoritarios. Es hora de unirse a la horda OpenPGP y a algoritmos del tipo "si se rompen se acaba el mundo", como AES-128.

Así que he generado una clave nueva, de 4096 bits. Espero que future proof. Si consigue durar otros 19 años, me doy con un canto en los dientes. Para el día a día, he generado dos subclaves PGP de 2048 bits, con una esperanza de vida menor. Una para firmar y otra para cifrar. Como mi identidad digital va vinculada a mi clave de 4096 bits, puedo cambiar estas claves pequeñas en cualquier momento sin avisar a nadie. Intenté que una de las subclaves tuviese el mismo fingerprint que mi clave antigua, incluso a costa de tener una clave (revocada) de 1024 bits, como guiño a la historia, pero el fingerprint de OpenPGP se calcula sobre unos campos distintos a los del PGP tradicional, así que no es posible. Sin fuerza bruta, entendámonos.

Como ha sido un cambio de clave controlado, he podido generar una revocación de la clave antigua. Así que cuando refresquéis vuestro llavero de claves, recibiréis la revocación automáticamente. Porque refrescáis vuestro llavero con frecuencia, ¿verdad?.

La clave nueva tiene como identificador 1567BC0F, y su fingerprint es 8627 62C4 6EC3 567C B58C 7FB1 A510 404E 1567 BC0F. La podéis encontrar en los servidores de claves mundiales, como el de Red IRIS. Ya estáis tardando.

Utilizar una clave OpenPGP moderna tiene muchas ventajas, además de poder emplear subclaves. Por cierto en Hispasec no empleábamos subclaves porque eran problemáticas para algunas versiones comerciales de PGP. ¡Pero estamos en 2014, qué diablos!. Con OpenPGP podré emplear curvas elípticas cuando estén más popularizadas, simplemente añadiendo una subclave ECC a mi clave OpenPGP actual. Esto ya es motivo suficiente para dar el salto :). También puedo especificar qué algoritmos de cifrado y de hash soporto:

gpg> showpref
[ultimate] (1). Jesús Cea Avión <jcea@jcea.es>
     Cipher: AES, AES256, AES192, CAST5, 3DES
     Digest: SHA256, SHA512, SHA384, SHA224, SHA1
     Compression: ZLIB, ZIP, Uncompressed
     Features: MDC, Keyserver no-modify

Obsérvese el orden ligeramente diferente a la configuración estándar:

Cipher: AES256, AES192, AES, CAST5, 3DES
Digest: SHA512, SHA384, SHA256, SHA224, SHA1
Compression: ZLIB, ZIP, Uncompressed
Features: MDC, Keyserver no-modify

El comando a emplear para cambiar esa configuración es

gpg>  setpref AES AES256 AES192 CAST5 3DES SHA256 SHA512 SHA384 SHA224 SHA1 ZLIB ZIP
Set preference list to:
     Cipher: AES, AES256, AES192, CAST5, 3DES
     Digest: SHA256, SHA512, SHA384, SHA224, SHA1
     Compression: ZLIB, ZIP, Uncompressed
     Features: MDC, Keyserver no-modify
Really update the preferences? (y/N) y

You need a passphrase to unlock the secret key for
user: "Jesús Cea Avión <jcea@jcea.es>"
4096-bit RSA key, ID 1567BC0F, created 2014-01-13


pub  4096R/1567BC0F  created: 2014-01-13  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  2048R/4A86FE43  created: 2014-01-13  expires: never       usage: S
sub  2048R/05488493  created: 2014-01-13  expires: never       usage: E
[ultimate] (1). Jesús Cea Avión <jcea@jcea.es>

gpg> pref
[ultimate] (1). Jesús Cea Avión <jcea@jcea.es>
     S7 S9 S8 S3 S2 H8 H10 H9 H11 H2 Z2 Z1 [mdc] [no-ks-modify]


gpg> showpref
[ultimate] (1). Jesús Cea Avión <jcea@jcea.es>
     Cipher: AES, AES256, AES192, CAST5, 3DES
     Digest: SHA256, SHA512, SHA384, SHA224, SHA1
     Compression: ZLIB, ZIP, Uncompressed
     Features: MDC, Keyserver no-modify

gpg> save

jcea@ubuntu:~/hg/blog$ gpg --send-keys 1567BC0F
gpg: sending key 1567BC0F to hkp server pgp.rediris.es

He puesto como prioritario AES-128 y SHA256. ¿Y eso?.

En primer lugar, en este momento los ataques a AES-192 y AES-256 son, paradójicamente, más efectivos que los ataques conocidos a AES-128. Cosas de la vida.

En cuanto a SHA256, si sirve para los Bitcoins, sirve para mí.

Puedo cambiar esas preferencias en cualquier momento y basta con que refresquéis vuestro llavero para enteraros, de forma transparente. Porque refrescáis vuestro llavero con frecuencia, ¿verdad?.

He aprovechado la coyuntura también para actualizar mis claves SSH, que las originales son de 1996 y mi trabajo en Argo :). Pero eso no le interesa a nadie más que a mí. Bueno, y a los core developers de Python, que han tenido que cambiar mi clave para el Mercurial :).