Support des courbes elliptiques (ECC)#

(Nitrokey Pro 2 - Linux)

RSA-2048 devient de plus en plus insécure#

Pour des raisons de sécurité, l’Office fédéral allemand de la sécurité des informations (Bundesamt für Sicherheit in der Informationstechnik, BSI) ne recommande plus l’utilisation de clés RSA d’une longueur de 2048 bits après 2022. Cela signifie que des clés plus longues devront être utilisées dans un avenir prévisible. En supposant une période d’utilisation de cinq ans, il est déjà nécessaire de générer des clés plus longues. Cependant, les clés RSA plus longues de 3072 bits ou 4096 bits sont nettement plus lentes. C’est pourquoi les nouveaux Nitrokey Storage 2 et Pro 2 (resp. la carte OpenPGP intégrée version 3.3) prennent en charge le cryptage au moyen de la cryptographie à courbe elliptique (ECC). Cette méthode est considérée comme tout aussi sûre avec des clés ECC plus petites que des clés RSA plus longues et est également considérablement plus rapide.

Les bases de la cryptographie à courbe elliptique#

Contrairement au RSA, il existe de nombreuses formes différentes (appelées courbes) de cryptographie à courbes elliptiques. Notamment, la NSA a participé au développement des courbes du NIST. Même s’il n’y a aucune preuve de portes dérobées dans les courbes, l’utilisation d’une certaine courbe peut poser une question de confiance. Heureusement, les nouveaux Nitrokey Storage 2 et Pro 2 prennent en charge deux types de courbes, à savoir NIST et Brainpool. Dans ce qui suit, nous utiliserons les courbes Brainpool. Cet article constitue un bon point d’entrée pour acquérir une compréhension générale de la cryptographie par courbes elliptiques.

Configuration requise#

Pour créer des clés basées sur des courbes elliptiques, un Nitrokey Storage 2 / Pro 2 et GnuPG version 2.1.17 ou supérieure sont nécessaires.

Vous pouvez lire la version de la carte OpenPGP de Nitrokey via gpg2 --card-status :

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

Le champ « Version » représente la version de la carte OpenPGP Card intégrée à la Nitrokey - dans ce cas, il s’agit de la version 3.3, nécessaire pour la cryptographie à courbe elliptique. La version 2.2 de l’OpenPGP Card ne prend pas en charge l’ECC.

Vous pouvez connaître la version installée de GnuPG via gpg2  --version. La version 2.1.16 au moins est requise. La dernière version de GnuPG pour Windows se trouve ici et la dernière version pour MacOS se trouve ici. Une version appropriée de GnuPG est incluse dans les distributions GNU/Linux Ubuntu (depuis 18.04), Debian (à partir de Stretch), Arch Linux, Fedora (à partir de la version 26) et openSUSE Tumbleweed. À la fin de cet article, vous trouverez des instructions pour mettre à jour manuellement GnuPG sur les anciennes versions d’Ubuntu.

Important

GnuPG 2.0 est toujours utilisé, mais son support a été interrompu en 2017. Tous les partenaires de communication doivent utiliser GnuPG 2.1 ou une version plus récente pour le cryptage des e-mails au moyen d’ECC, faute de quoi des problèmes d’incompatibilité pourraient survenir. Par conséquent, vous ne devez utiliser ECC que si vous êtes sûr de pouvoir contourner ce problème.

Génération de clés sur le Nitrokey Storage 2 / Pro 2#

Une fois ces conditions remplies, vous pouvez commencer. (Attention : les clés existantes seront écrasées au cours du processus !) Vous avez maintenant deux options. La première option consiste à créer la clé directement sur le Nitrokey Storage 2 / Pro 2. L’avantage est que la clé ne sera jamais en dehors de l’appareil et ne pourra donc jamais être lue. La deuxième option consiste à importer une clé précédemment générée localement. L’avantage dans ce cas est que vous pouvez stocker en toute sécurité une sauvegarde de la clé, qui peut ensuite être restaurée en cas de perte de la Nitrokey. Seule la première option est décrite ci-dessous. Pour créer une clé avec sauvegarde, vous pouvez accéder aux instructions suivantes et utiliser cette information générale pour transférer la clé sur la Nitrokey.

Dans GnuPG, il existe déjà une commande « generate », qui peut être utilisée pour créer facilement des clés sur l’appareil. Cependant, il n’est pas encore possible de sélectionner le type de clé directement, donc la clé doit d’abord être préparée. Pour cela, nous utilisons les commandes suivantes :

> 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

On peut aussi choisir d’autres courbes, comme décrit dans la section suivante.

Maintenant nous entrons dans gpg2 --card-edit et nous voyons que brainpoolP256r1 est sous « key attributes » au lieu 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]

Ensuite, nous créons la clé.

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.

La Nitrokey intègre désormais la cryptographie à courbe elliptique au lieu des clés RSA et peut être utilisée comme d’habitude.

Courbes disponibles#

Dans la procédure ci-dessus, nous avons choisi les courbes Brainpool. Alternativement, les courbes NIST peuvent être utilisées. La configuration s’effectue comme suit :

> 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

Mise à jour de GnuPG sur Ubuntu#

Les étapes suivantes ne sont nécessaires que si vous utilisez une version d’Ubuntu antérieure à 18.04. Vous pouvez installer GnuPG 2.1.18 sur un tel système avec les commandes ci-dessous. Cela implique des paquets Debian plus récents, ce qui est l’option la plus facile. Cette approche a été testée avec succès sur Ubuntu 17.10 et fonctionne probablement aussi sur 16.04. Cependant, l’apparition de problèmes pendant l’utilisation ne peut être exclue.

$ 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

Si vous voulez annuler l’installation, vous devez exécuter les commandes suivantes :

$ 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)