Нет, информация поступает из сертификата, хранящегося в вашем кольце открытых ключей (или загруженного с сервера ключей). Подпись содержит только некоторую информацию, необходимую для поиска нужного сертификата.
Используйте 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]
Сертификаты также состоят из пакетов, начиная с открытого ключа, идентификатора пользователя (текстовые метки) с собственной подписью для каждого (для защиты от того, что кто-то прикрепляет поддельные идентификаторы пользователя к публичному ключу), затем несколько пакетов открытого ключа (опять же с самоподписью). ).