Soporte de curvas elípticas (ECC)

RSA-2048 se vuelve cada vez más inseguro

Por razones de seguridad, la Oficina Federal Alemana de Seguridad de la Información (Bundesamt für Sicherheit in der Informationstechnik, BSI) ha dejado de recomendar el uso de claves RSA con una longitud de 2048 bits ` a partir de 2022 <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf?_blob=publicationFile&v=10>`_. Esto significa que en un futuro previsible habrá que utilizar claves más largas. Suponiendo un periodo de uso de cinco años, ya es necesario generar claves más largas. Sin embargo, las claves RSA más largas de 3072 bits o 4096 bits son significativamente más lentas. Por esta razón, los nuevos Nitrokey Storage 2 y Pro 2 (o la tarjeta OpenPGP integrada versión 3.3) soportan el cifrado mediante criptografía de curva elíptica (ECC). Este método se considera igual de seguro con claves ECC más pequeñas que con claves RSA más largas y, además, es considerablemente más rápido.

Fundamentos de la criptografía de curva elíptica

A diferencia de RSA, existen muchas formas diferentes (llamadas curvas) de criptografía de curva elíptica. En particular, la NSA participó en el desarrollo de las curvas del NIST. Incluso si no hay evidencia de puertas traseras en las curvas, el uso de una determinada curva puede plantear una cuestión de confianza. Afortunadamente, los nuevos Nitrokey Storage 2 y Pro 2 soportan dos tipos de curvas, NIST y Brainpool. En lo que sigue utilizaremos las curvas Brainpool. Este artículo proporciona un buen punto de entrada para obtener una comprensión general de la criptografía de curva elíptica.

Requisitos del sistema

Para crear claves basadas en curvas elípticas se requiere Nitrokey Storage 2 / Pro 2 y GnuPG versión 2.1.17 o superior.

Puedes leer la versión de la tarjeta OpenPGP de Nitrokey a través de gpg2 —card-status:

> gpg2 --card-status
Reader ...........: 20A0:...
Application ID ...: D276...
Version ..........: 3.3
...

El campo «Versión» representa la versión de la tarjeta OpenPGP integrada en la Nitrokey - en este caso es la 3.3, necesaria para la criptografía de curva elíptica. La versión 2.2 de la tarjeta OpenPGP no soporta ECC.

You can learn about the installed version of GnuPG via gpg2  --version. At least version 2.1.16 is required. The newest GnuPG version for Windows can be found here and the newest version for MacOS can be found here. A suitable version of GnuPG is included in the GNU/Linux distributions Ubuntu (since 18.04), Debian (from Stretch onwards), Arch Linux, Fedora (from Release 26 onwards) and openSUSE Tumbleweed. At the end of this articles are instructions how to manually update GnuPG on older Ubuntu versions.

Importante

GnuPG 2.0 se sigue utilizando, pero su soporte se ha interrumpido en 2017. Todos los interlocutores de la comunicación deben utilizar GnuPG 2.1 o más reciente para el cifrado del correo electrónico mediante ECC, ya que de lo contrario podrían surgir problemas de incompatibilidad. Por lo tanto, solo debe utilizar ECC si está seguro de que podrá sortear este problema.

Generación de llaves en el Nitrokey Storage 2 / Pro 2

Una vez cumplidos estos requisitos, puedes empezar. (Advertencia: ¡las claves existentes se sobrescribirán en el proceso!) Ahora tiene dos opciones. La primera opción es crear la llave directamente en el Nitrokey Start. La ventaja es que la llave nunca estará fuera del dispositivo y, por lo tanto, nunca podrá ser leída. La segunda opción es importar una clave generada previamente a nivel local. La ventaja en este caso es que puede almacenar de forma segura una copia de seguridad de la clave, que puede ser restaurada en caso de que se pierda la Nitrokey. A continuación sólo se describe la primera opción. Para crear una clave con copia de seguridad, puede acceder a las siguientes instrucciones y utilizar esta información general para transferir la clave a la Nitrokey.

Dentro de GnuPG ya existe un comando «generar», que puede utilizarse para crear fácilmente claves en el dispositivo. Sin embargo, todavía no es posible seleccionar el tipo de clave directamente, por lo que primero hay que preparar la clave. Para ello utilizamos los siguientes comandos:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 brainpoolP256r1" /bye

También se pueden seleccionar otras curvas, como se describe en la siguiente sección.

Ahora entramos en gpg2 --card-edit y vemos que brainpoolP256r1 está en «atributos de la clave» en lugar de rsa2048.

> gpg2 --card-edit
Reader ...........: 20A0:4109:0000000000000:0
Application ID ...: D276000124010303000500005F100000
Version ..........: 3.3
Manufacturer .....: ZeitControl
Serial number ....: 00005F10
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: brainpoolP256r1 brainpoolP256r1 brainpoolP256r1
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Entonces creamos la llave.

gpg/card> admin
Admin commands are allowed

gpg/card> generate
Make off-card backup of encryption key? (Y/n) n
Please note that the factory settings of the PINs are
PIN = '123456' Admin PIN = '12345678'
You should change them using the command --change-pin
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)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Jane Doe
Email address: jane.doe@example.org
Comment:
You selected this USER-ID:
"Jane Doe <jane.doe@example.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
gpg: key 7F8C68E1B084E169 marked as ultimately trusted
gpg: revocation certificate stored as '/home/jane/.gnupg/openpgp-revocs.d/F8C00BC1636A7D7604A31A877F8C68E1B084E169.rev'
public and secret key created and signed.

El Nitrokey Start incorpora ahora la criptografía de curva elíptica en lugar de las claves RSA y puede utilizarse como siempre.

Curvas disponibles

En el procedimiento anterior hemos elegido las curvas de Brainpool. Como alternativa, se pueden utilizar las curvas del NIST. La configuración se lleva a cabo de la siguiente manera:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 nistp256" /bye

Actualización de GnuPG en Ubuntu

Los siguientes pasos son necesarios sólo si está ejecutando una versión de Ubuntu anterior a la 18.04. Puede instalar GnuPG 2.1.18 en dicho sistema con los comandos siguientes. Esto implica paquetes Debian más nuevos, que es la opción más fácil. Este método ha sido probado con éxito en Ubuntu 17.10 y probablemente también funcione en 16.04. Sin embargo, no se puede excluir la aparición de problemas durante el uso.

$ mkdir gnupg_tmp
$ cd gnupg_tmp
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/dirmngr_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg-agent_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/scdaemon_2.1.18-8~deb9u1_amd64.deb
$ sudo dpkg -i *
$ cd ..
$ rm -rf gnupg_tmp

En caso de querer deshacer la instalación, hay que ejecutar los siguientes comandos:

$ sudo dpkg --remove --force-depends gnupg dirmngr gnupg-agent scdaemon
  # (removes manually installed packages)
$ sudo apt-get install gnupg dirmngr gnupg-agent scdaemon
  # (installs the appropriate packages from regular package repositories)