Я пытаюсь понять, что происходит при проверке отсоединенной подписи gpg.
Вот пример из gnupgруководство:
blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun 4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <[email protected]>"
Как gpg определяет, что подпись хорошая? Содержит ли подпись хэш файла, который был подписан? Если да, то как извлечь этот хэш из самой подписи?
Я пробовал gpg --list-packets <signature>
, но, похоже, отображается не вся информация.
решение1
Вы можете использовать --list-packets
опцию, чтобы получить дамп того, что находится в файле gpg. Описание формата файла:RFC4880(Стандарт OpenPGP).
Подпись не содержит непосредственно хэш. Она содержит информацию, которая позволяет проверить как хэш, так и отправителя: естьалгоритм проверки подписи, который принимает в качестве входных данных хэш-значение и открытый ключ и возвращаетдаилинет; алгоритм возвращаетдаесли подпись была сделана закрытым ключом, соответствующим данному открытому ключу из сообщения с данным закрытым ключом, и возвращаетнетво всех других случаях (подпись другого хеша, подпись, сделанная другим ключом, или набор байтов, которые вообще не могут быть подписью). ПодДСАалгоритм, я думаю, что невозможно извлечь хеш из подписи, если у вас нет закрытого ключа.
Файл подписи содержит идентификационные данные подписчика, а также значение подписи. Для проверки подписи gpg считывает открытый ключ подписчика из вашего набора ключей, вычисляет хэш данных и применяет алгоритм проверки подписи.
решение2
$ gpg --list-packets myfile.asc
[...]
digest algo 10, begin of digest 77 dd
Это показывает, какой алгоритм дайджеста использовался. К сожалению, ни man-страница, ни gpg --version
информирует нас о том, какой алгоритм назначен какому идентификатору. Нам нужно погрузиться в RFC формата пакета, чтобы найти эту информацию:https://www.rfc-editor.org/rfc/rfc4880#section-9.4
ID Algorithm Text Name
-- --------- ---------
1 - MD5 [HAC] "MD5"
2 - SHA-1 [FIPS180] "SHA1"
3 - RIPE-MD/160 [HAC] "RIPEMD160"
4 - Reserved
5 - Reserved
6 - Reserved
7 - Reserved
8 - SHA256 [FIPS180] "SHA256"
9 - SHA384 [FIPS180] "SHA384"
10 - SHA512 [FIPS180] "SHA512"
11 - SHA224 [FIPS180] "SHA224"
100 to 110 - Private/Experimental algorithm
решение3
Да, цифровые подписи обычно представляют собой защищенные хэши, которые подписаны секретным ключом подписавшего.
Подписание всего сообщения намного медленнее и не более безопасно. Кроме того, алгоритм должен заботиться о длине блоков, заполнении (таким образом, чтобы не раскрывать слишком много информации) и т. д.
Примечание: также при асимметричном шифровании, в целях повышения скорости, асимметрично шифруется только эфемерный симметричный ключ, а остальная часть сообщения шифруется только симметрично.