Subclaves de descifrado adicionales (ADSK) con GnuPG

Additional Decryption Subkeys (ADSK) se puede utilizar para añadir automáticamente destinatarios al cifrar un mensaje con GnuPG. Los casos de uso típicos incluyen

  • disponer de una única clave de cifrado para un grupo sin necesidad de compartir la clave privada entre los miembros del grupo,

  • añadir una clave de seguridad a una clave de cifrado, y

  • establecer una clave maestra que pueda descifrar mensajes para otras claves.

Nota

Para configurar un ADSK, necesita GnuPG 2.4.1 o posterior. Para cifrar un mensaje para una clave con un ADSK, necesitas GnuPG 2.2.42 o posterior.

Resumen

Esta guía explica cómo añadir una clave de seguridad (ID de usuario backup@example.com) como ADSK a una clave principal (ID de usuario main@example.com). Ambas claves se almacenan en una Nitrokey. Se pueden seguir los mismos pasos para añadir varias ADSK a una llave, o para añadir la misma llave como ADSK a otras llaves.

Preparación de las llaves

Siga una de estas guías para generar las dos claves:

Asegúrese de que puede listar ambas claves con gpg --list-keys, por ejemplo:

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

Añadir un ADSK

En primer lugar, determine la huella digital de la subclave de cifrado para la clave de copia de seguridad:

$ 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

Busque la línea que comienza con sub que contiene la letra E, lo que indica una subclave con la capacidad de cifrado. La huella digital de esta subclave aparece en la línea siguiente. En este caso, la huella es C1735CB29890EEDEABCF1D0DC9310F81D77519BC.

A continuación, determinar la huella digital de la clave principal:

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

Puede encontrarlo en la línea siguiente a pub, en este caso 55BC284C1D30D97638DA4A2C7963A4CD00C947CE.

Ahora puedes añadir el ADSK usando la bandera --quick-add-adsk:

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

El primer argumento es la huella digital de la clave principal. El segundo argumento es la huella digital de la subclave de cifrado de la clave de respaldo.

Puede comprobar que se ha creado el ADSK:

$ 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 subclave con la capacidad R (restringida) es la ADSK. Tiene la misma huella digital que la subclave de cifrado de la clave de seguridad.

Ahora puedes distribuir la clave pública con el ADSK.

Utilización de un ADSK

Al cifrar un mensaje para la clave principal, la clave de reserva se añade ahora automáticamente como destinatario. Los únicos requisitos para ello son:

  • El remitente del mensaje tiene una clave pública actualizada que incluye la ADSK.

  • El remitente del mensaje utiliza GnuPG 2.2.42 o posterior.

Si añades la bandera --verbose, puedes comprobar las claves con las que se cifra el mensaje:

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

También puede utilizar la opción --list-packets para comprobar un mensaje cifrado:

$ 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

Cada línea de pubkey enc packet representa una clave que puede descifrar el mensaje.

Revocar una ADSK

Si revocas una ADSK, dejará de añadirse como destinatario al cifrar un mensaje. Para realizar una revocación, abra la clave con 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>

Seleccione la subclave que desea revocar con key N. La subclave seleccionada se marca con un asterisco:

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>

Revoca la subclave con revkey y luego guarda los cambios con 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

Ahora distribuye la clave pública actualizada.

Nota

La revocación sólo será efectiva una vez que el remitente haya actualizado la clave pública con la ADSK revocada. Los mensajes que ya hayan sido cifrados podrán seguir siendo descifrados con la ADSK aunque ésta haya sido revocada.