4

Допустим, вы проверяете чью-либо подпись с помощью GPG:

$ gpg --decrypt statement.txt.sig 
"I am not a crook."
gpg: Signature made 17 Nov 1973 9:31:50 AM CDT using RSA key ID 92861D99
gpg: Good signature from "Richard Nixon <rnixon@whitehouse.gov>"
gpg:                 aka "[jpeg image of size 19022]"

Файл statement.txt.sig явно включает в себя утверждение / данные, подписанные, а также открытый ключ лица, подписавшего его. Однако в выводе включено гораздо больше информации , например, полное имя и адрес электронной почты, а также изображение в формате JPEG, которое было включено в открытый ключ подписавшего.

Откуда GPG получает эти дополнительные данные? Был ли он включен в файл statement.txt.sig , или он смотрит на ваш брелок и "заполняет" все дополнительные данные, которые у вас есть о человеке?

1 ответ1

6

Нет, информация поступает из сертификата, хранящегося в вашем кольце открытых ключей (или загруженного с сервера ключей). Подпись содержит только некоторую информацию, необходимую для поиска нужного сертификата.


Используйте gpg --list-packets или pgpdump:

$ echo Foo. > foo.txt
$ gpg --detach-sign foo.txt
$ gpg --list-packets < foo.txt.sig
:signature packet: algo 1, keyid D24F6CB2C1B52632
    version 4, created 1410762670, md5len 0, sigclass 0x00
    digest algo 10, begin of digest 25 58
    hashed subpkt 2 len 4 (sig created 2014-09-15)
    subpkt 16 len 8 (issuer key ID D24F6CB2C1B52632)
    data: [4091 bits]

Отсоединенная подпись имеет один пакет "подписи", содержащий алгоритмы, метку времени подписи и 8-байтовый идентификатор ключа подписавшего, который используется для поиска сертификата подписчика в вашей связке ключей. (Если у вас нет открытых ключей с этим keyid, GnuPG попытается найти его на открытых серверах ключей.)

(Я не знаю, почему он имеет идентификатор ключа дважды.)

GnuPG получает все о подписавшем, просматривая ключевой идентификатор - как открытый ключ для фактической проверки подписи, так и поля идентификатора пользователя (имя, адрес, фотография), используемые для описания подписавшего.


Заметьте: обратите внимание, что ваш пример имеет короткий 4-байтовый keyid, что очень плохо, поскольку было несколько сотен известных столкновений с коротким ключом, как преднамеренных, так и случайных. Использование keyid-format long в вашем ~/.gnupg/gnupg.conf заставит его отображать более длинные ключевые ключи, хотя их по-прежнему легко намеренно конфликтовать, поэтому вы всегда должны проверять отпечаток при импорте нового ключа.

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


Вернуться к подписи. Если бы вы сделали gpg --list-packets с обычной (встроенной) подписью, вы бы увидели еще несколько вещей:

:compressed packet: algo=1
:onepass_sig packet: keyid D24F6CB2C1B52632
    version 3, sigclass 0x00, digest 10, pubkey 1, last=1
:literal data packet:
    mode b (62), created 1410762587, name="",
    raw data: 5 bytes
:signature packet: algo 1, keyid D24F6CB2C1B52632
    version 4, created 1410762587, md5len 0, sigclass 0x00
    digest algo 10, begin of digest eb 31
    hashed subpkt 2 len 4 (sig created 2014-09-15)
    subpkt 16 len 8 (issuer key ID D24F6CB2C1B52632)
    data: [4095 bits]

Фактическое подписанное сообщение находится в пакете "буквальных данных", обычно сжимаемом с помощью DEFLATE (pgpdump показывает фактический используемый алгоритм).

Ему предшествует пакет "onepass_sig", единственной целью которого является предоставление идентификатора ключа без необходимости считывания до конца всего сообщения, поэтому GnuPG может начать поиск идентификатора ключа и сразу же приступить к проверке сообщения. (При чтении из трубы, например, cat|gpg , невозможно искать вперед и назад; все должно читаться за один проход.)


Если вы хотите, вы можете сделать это также с помощью ключа (сертификата) подписавшего. Просто сначала экспортируйте его в файл:

# gpg --export D24F6CB2C1B52632 | gpg --list-packets
:public key packet:
    version 4, algo 1, created 1256993643, expires 0
    pkey[0]: [4096 bits]
    pkey[1]: [17 bits]
    keyid: D24F6CB2C1B52632
:user ID packet: "Mantas Mikul\xc4\x97nas "
:signature packet: algo 1, keyid D24F6CB2C1B52632
    version 4, created 1256993643, md5len 0, sigclass 0x13
    digest algo 10, begin of digest 5a e2
[many more lines]

Сертификаты также состоят из пакетов, начиная с открытого ключа, идентификатора пользователя (текстовые метки) с собственной подписью для каждого (для защиты от того, что кто-то прикрепляет поддельные идентификаторы пользователя к публичному ключу), затем несколько пакетов открытого ключа (опять же с самоподписью). ).

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