1

Я не могу найти надежный способ gpg список (открытых) ключей, используемых для шифрования заданного файла. Одно правдоподобное решение не работает для меня - оно никогда не перечисляет мой ключ:

gpg --list-only --no-default-keyring --secret-keyring /dev/null $testfile

Другое решение, которое я извлек из этого потока, является многошаговым и, несомненно, имеет некоторый угловой случай, который покажет его хрупкость:

(gpg -vv --list-only $testfile  2>&1 | grep 'gpg: public key' | awk '{print $NF}' | xargs -L1 gpg --list-keys --with-colons) | egrep '^pub' | awk -F: '{print $5}'

После дальнейших раскопок у меня есть еще один потенциальный вариант, который включает в себя обман gpg способами, которые, несомненно, являются хрупкими с течением времени:

gpg --dry-run --pinentry-mode cancel --output /dev/null "$testfile" 2>&1

У кого-нибудь есть лучшее решение, чем у любого из них?
Кто-нибудь знает, почему очевидная --list-only не делает "правильную" вещь?

В случае, если это имеет значение, используйте gpg (GnuPG) 2.1.10 в Mac OS X и gpgv (GnuPG) 2.0.26 в Debian (Jessie).

1 ответ1

2

Вероятно, самый безопасный способ - перечислить пакеты OpenPGP. Вы можете использовать --list-packets GnuPG или отдельный инструмент pgpdump . Вы получите только подключи; первичные ключи не упоминаются в зашифрованном сообщении. Если вы хотите запросить первичные ключи, вам придется разрешать их через локальный набор ключей (или, в случае их отсутствия, сервер ключей) отдельно.

Для документа, зашифрованного на двух моих подразделах, вывод выглядит следующим образом (--list-only поэтому GnuPG не запрашивает парольную фразу, если она доступна):

$ gpg2 --list-only --list-packets < encrypted.gpg
# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid CC73B287A4388025
    data: [4090 bits]
# off=527 ctb=85 tag=1 hlen=3 plen=268
:pubkey enc packet: version 3, algo 1, keyid 5C88F5D83E2554DF
    data: [2048 bits]
# off=798 ctb=d2 tag=18 hlen=2 plen=63 new-ctb
:encrypted data packet:
    length: 63
    mdc_method: 2

Это будет список всех (известных) получателей. Если используются скрытые получатели, очевидно, что это будет невозможно:

# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
    data: [4093 bits]

Аналогичный вывод для pgpdump:

Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
    New version(3)
    Key ID - 0x0000000000000000
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(4096 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
Old: Public-Key Encrypted Session Key Packet(tag 1)(268 bytes)
    New version(3)
    Key ID - 0x5C88F5D83E2554DF
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(2047 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
    Ver 1
    Encrypted data [sym alg is specified in pub-key encrypted session key]
        (plain text + MDC SHA1(20 bytes))

К сожалению, ни у одного из них нет четко определенного, стабильного результата. Опция --with-colon GnuPG недоступна для дампа пакетов.


GnuPG печатает только ключи других пользователей , а не ваши собственные (без --list-only , он будет пытаться использовать ключ вместо этого). Независимо от того, является ли это намеренным и желательным поведением, может быть предметом споров, передачи одного -v/--verbose кажется достаточным, чтобы также перечислить ваши собственные ключи.

Проблема с первой попыткой "скрыть" ваши секретные ключи - это проблема с оператором --no-default-keyring . От man gpg2:

--no-default-keyring

Не добавляйте набор ключей по умолчанию в список ключей. Обратите внимание, что GnuPG не будет работать без каких-либо ключей, поэтому если вы используете эту опцию и не предоставляете альтернативные наборы ключей через --keyring или --secret-keyring , то GnuPG по-прежнему будет использовать открытые или секретные наборы ключей по умолчанию.

GnuPG всегда читает открытый ключ. Недостаточно просто передать нечитаемый / пустой секретный набор ключей, вместо этого достаточно только передать открытый набор ключей:

gpg2 --no-default-keyring --keyring /dev/null --list-only

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .