Допълнителни подключове за декриптиране (ADSK) с GnuPG

Additional Decryption Subkeys (ADSK) може да се използва за автоматично добавяне на получатели при криптиране на съобщение с GnuPG. Типичните случаи на използване включват

  • наличие на един-единствен ключ за криптиране за група, без да е необходимо частният ключ да се споделя между членовете на групата,

  • добавяне на резервен ключ към ключа за криптиране и

  • създаване на главен ключ, който може да декриптира съобщения за други ключове.

Note

За да конфигурирате ADSK, се нуждаете от GnuPG 2.4.1 или по-нова версия. За да криптирате съобщение за ключ с ADSK, се нуждаете от GnuPG 2.2.42 или по-нова версия.

Преглед

Това ръководство обяснява как да добавите резервен ключ (ID на потребител backup@example.com) като ADSK към основен ключ (ID на потребител main@example.com). И двата ключа се съхраняват в Nitrokey. Същите стъпки могат да се използват за добавяне на няколко ADSK към един ключ или за добавяне на един и същ ключ като ADSK към няколко други ключа.

Подготовка на ключовете

Следвайте едно от тези ръководства, за да генерирате двата ключа:

Уверете се, че можете да изброите и двата ключа с gpg --list-keys, например:

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

Добавяне на ADSK

Първо определете пръстовия отпечатък на подключването за криптиране на резервния ключ:

$ 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

Потърсете ред, започващ с sub, който съдържа буквата E, указваща подключ с възможност за криптиране. Пръстовият отпечатък на този подключ е посочен в следващия ред. В този случай пръстовият отпечатък е C1735CB29890EEDEABCF1D0DC9310F81D77519BC.

След това определете пръстовия отпечатък на главния ключ:

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

Можете да го намерите в следващия ред след pub, в този случай 55BC284C1D30D97638DA4A2C7963A4CD00C947CE.

Сега можете да добавите ADSK, като използвате флага --quick-add-adsk:

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

Първият аргумент е пръстовият отпечатък на главния ключ. Вторият аргумент е пръстовият отпечатък на криптиращия подключ на резервния ключ.

Можете да проверите дали 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

Подключването с възможност R (ограничена) е ADSK. Той има същия пръстов отпечатък като подключ за криптиране на резервния ключ.

Сега можете да разпространявате публичния ключ с ADSK.

Използване на ADSK

При криптиране на съобщение за основния ключ резервният ключ вече се добавя автоматично като получател. Единствените изисквания за това са:

  • Изпращачът на съобщението има актуален публичен ключ, който включва ADSK.

  • Изпращачът на съобщението използва GnuPG 2.2.42 или по-нова версия.

Ако добавите флага --verbose, можете да проверите ключовете, с които е криптирано съобщението:

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

Можете също така да използвате опцията --list-packets, за да проверите криптирано съобщение:

$ 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

Всеки ред pubkey enc packet представлява един ключ, който може да декриптира съобщението.

Отмяна на ADSK

Ако оттеглите ADSK, той вече няма да бъде добавян като получател при криптиране на съобщение. За да извършите отнемане, отворете ключа с 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>

Изберете подключ, който да отмените, с key N. Избраният подключ е маркиран със звездичка:

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>

Отнемете подключването с revkey и след това запазете промените с 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

Сега разпространете актуализирания публичен ключ.

Note

Оттеглянето влиза в сила едва след като изпращачът актуализира публичния ключ с оттегления ADSK. Съобщенията, които вече са били криптирани, могат да бъдат декриптирани с ADSK, дори ако той е оттеглен.