Допълнителни подключове за декриптиране (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, дори ако той е оттеглен.