Sous-clés de déchiffrement supplémentaires (ADSK) avec GnuPG

Additional Decryption Subkeys (ADSK) peut être utilisé pour ajouter automatiquement des destinataires lors du cryptage d’un message avec GnuPG. Les cas d’utilisation typiques sont les suivants

  • disposer d’une clé de chiffrement unique pour un groupe sans avoir à partager la clé privée entre les membres du groupe,

  • l’ajout d’une clé de sauvegarde à une clé de chiffrement, et

  • la mise en place d’une clé principale qui peut décrypter les messages des autres clés.

Note

Pour configurer un ADSK, vous avez besoin de GnuPG 2.4.1 ou d’une version plus récente. Pour chiffrer un message pour une clé avec un ADSK, vous avez besoin de GnuPG 2.2.42 ou d’une version plus récente.

Vue d’ensemble

Ce guide explique comment ajouter une clé de sauvegarde (ID utilisateur backup@example.com) en tant qu’ADSK à une clé principale (ID utilisateur main@example.com). Les deux clés sont stockées sur une Nitrokey. Les mêmes étapes peuvent être utilisées pour ajouter plusieurs ADSK à une clé, ou pour ajouter la même clé en tant qu’ADSK à plusieurs autres clés.

Préparation des clés

Suivez l’un de ces guides pour générer les deux clés :

Assurez-vous que vous pouvez lister les deux clés avec gpg --list-keys, par exemple: :

$ gpg --list-keys main@example.com backup@example.com
pub   ed25519 2023-07-04 [SC]
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE
uid           [ultimate] Main Key <main@example.com>
sub   ed25519 2023-07-04 [A]
sub   cv25519 2023-07-04 [E]

pub   ed25519 2023-07-04 [SC]
      5271152B531F7FFD8787818251FB75800E281241
uid           [ultimate] Backup Key <backup@example.com>
sub   ed25519 2023-07-04 [A]
sub   cv25519 2023-07-04 [E]

Ajout d’un ADSK

Déterminez d’abord l’empreinte digitale de la sous-clé de chiffrement de la clé de sauvegarde: :

$ gpg --list-keys --with-subkey-fingerprints backup@example.com
pub   ed25519 2023-07-04 [SC]
      5271152B531F7FFD8787818251FB75800E281241
uid           [ultimate] Backup Key <backup@example.com>
sub   ed25519 2023-07-04 [A]
      7AEA1A0EC7BD66FF03AFEFAC8F243D8EC7678FCC
sub   cv25519 2023-07-04 [E]
      C1735CB29890EEDEABCF1D0DC9310F81D77519BC

Recherchez la ligne commençant par sub et contenant la lettre E, qui indique une sous-clé dotée d’une capacité de cryptage. L’empreinte de cette sous-clé est indiquée à la ligne suivante. Dans ce cas, l’empreinte est C1735CB29890EEDEABCF1D0DC9310F81D77519BC.

Déterminer ensuite l’empreinte digitale de la clé principale: :

$ gpg --list-keys main@example.com
pub   ed25519 2023-07-04 [SC]
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE
uid           [ultimate] Main Key <main@example.com>
sub   ed25519 2023-07-04 [A]
sub   cv25519 2023-07-04 [E]

Vous le trouverez dans la ligne qui suit pub, dans ce cas 55BC284C1D30D97638DA4A2C7963A4CD00C947CE.

Vous pouvez maintenant ajouter l’ADSK en utilisant le drapeau --quick-add-adsk: :

$ gpg --quick-add-adsk \
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE \
      C1735CB29890EEDEABCF1D0DC9310F81D77519BC

Le premier argument est l’empreinte digitale de la clé principale. Le deuxième argument est l’empreinte de la sous-clé de chiffrement de la clé de sauvegarde.

Vous pouvez vérifier que l’ADSK a été créé: :

$ gpg --list-keys --with-subkey-fingerprints main@example.com
pub   ed25519 2023-07-04 [SC]
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE
uid           [ultimate] Main Key <main@example.com>
sub   ed25519 2023-07-04 [A]
      9DF42A789DA4E848295C529634E35A6897DFABFD
sub   cv25519 2023-07-04 [E]
      1DFD6EA8D8B88BEA063ADB4BD75708BAF0CD49C8
sub   cv25519 2023-07-04 [R]
      C1735CB29890EEDEABCF1D0DC9310F81D77519BC

La sous-clé ayant la capacité R (restreinte) est l’ADSK. Elle a la même empreinte que la sous-clé de chiffrement de la clé de sauvegarde.

Vous pouvez maintenant distribuer la clé publique avec l’ADSK.

Utilisation d’un ADSK

Lors du cryptage d’un message pour la clé principale, la clé de secours est désormais automatiquement ajoutée en tant que destinataire. Les seules conditions à remplir sont les suivantes :

  • L’expéditeur du message dispose d’une clé publique actualisée qui comprend l’ADSK.

  • L’expéditeur du message utilise GnuPG 2.2.42 ou une version plus récente.

Si vous ajoutez le drapeau --verbose, vous pouvez vérifier les clés sur lesquelles le message est chiffré: :

$ echo message | gpg --verbose --encrypt --armor --recipient main@example.com > /tmp/msg.asc
gpg: using pgp trust model
gpg: using subkey D75708BAF0CD49C8 instead of primary key 7963A4CD00C947CE
gpg: automatically retrieved 'main@example.com' via Local
gpg: This key belongs to us
gpg: reading from '[stdin]'
gpg: writing to stdout
gpg: ECDH/AES256 encrypted for: "D75708BAF0CD49C8 Main Key <main@example.com>"
gpg: ECDH/AES256 encrypted for: "C9310F81D77519BC Main Key <main@example.com>"

Vous pouvez également utiliser l’option --list-packets pour vérifier un message crypté: :

$ gpg --pinentry-mode cancel --list-packets /tmp/msg.asc | grep "pubkey enc packet"
:pubkey enc packet: version 3, algo 18, keyid D75708BAF0CD49C8
:pubkey enc packet: version 3, algo 18, keyid C9310F81D77519BC

Chaque ligne pubkey enc packet représente une clé qui peut décrypter le message.

Révoquer un ADSK

Si vous révoquez un ADSK, il ne sera plus ajouté comme destinataire lors du chiffrement d’un message. Pour effectuer une révocation, ouvrez la clé avec gpg --edit-key: :

$ gpg --edit-key main@example.com

sec  ed25519/7963A4CD00C947CE
     created: 2023-07-04  expires: never       usage: SC
     card-no: FFFE 5E0E868D
     trust: ultimate      validity: ultimate
ssb  ed25519/34E35A6897DFABFD
     created: 2023-07-04  expires: never       usage: A
     card-no: FFFE 5E0E868D
ssb  cv25519/D75708BAF0CD49C8
     created: 2023-07-04  expires: never       usage: E
     card-no: FFFE 5E0E868D
ssb  cv25519/C9310F81D77519BC
     created: 2023-07-04  expires: never       usage: R
[ultimate] (1). Main Key <main@example.com>

Sélectionnez la sous-clé à révoquer avec key N. La sous-clé sélectionnée est marquée d’un astérisque: :

gpg> key 2

sec  ed25519/7963A4CD00C947CE
     created: 2023-07-04  expires: never       usage: SC
     card-no: FFFE 5E0E868D
     trust: ultimate      validity: ultimate
ssb  ed25519/34E35A6897DFABFD
     created: 2023-07-04  expires: never       usage: A
     card-no: FFFE 5E0E868D
ssb  cv25519/D75708BAF0CD49C8
     created: 2023-07-04  expires: never       usage: E
     card-no: FFFE 5E0E868D
ssb* cv25519/C9310F81D77519BC
     created: 2023-07-04  expires: never       usage: R
[ultimate] (1). Main Key <main@example.com>

Révoquez la sous-clé avec revkey et enregistrez les modifications avec save: :

gpg> revkey
Do you really want to revoke this subkey? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
Your decision? 0
Enter an optional description; end it with an empty line:
>
Reason for revocation: No reason specified
(No description given)
Is this okay? (y/N) y


sec  ed25519/7963A4CD00C947CE
     created: 2023-07-04  expires: never       usage: SC
     card-no: FFFE 5E0E868D
     trust: ultimate      validity: ultimate
ssb  ed25519/34E35A6897DFABFD
     created: 2023-07-04  expires: never       usage: A
     card-no: FFFE 5E0E868D
ssb  cv25519/D75708BAF0CD49C8
     created: 2023-07-04  expires: never       usage: E
     card-no: FFFE 5E0E868D
ssb  cv25519/C9310F81D77519BC
     created: 2023-07-04  revoked: 2023-07-04  usage: R
[ultimate] (1). Main Key <main@example.com>

gpg> save

Distribuez maintenant la clé publique mise à jour.

Note

La révocation ne sera effective que lorsque l’expéditeur aura mis à jour la clé publique avec l’ADSK révoqué. Les messages déjà cryptés peuvent toujours être décryptés avec l’ADSK, même si celle-ci est révoquée.