使用 GnuPG 清签名文本时,签名消息中会有一个哈希部分。例如:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
abc
-----BEGIN PGP SIGNATURE-----
iQEzBAEBCAAdFiEEZZvqE5j3koIxs9Xim0+E4a5Vo2cFAlkRdvQACgkQm0+E4a5V
o2ew2QgAzHuvZ7Hlb6+3qRLjc9Yhdi+6tBmNWXbWpKoAQxpzx6jKQp/FSpQeGWuj
RxcYnqU3pk4ycMLtaCFcfnHEW5N0B95eXGcurgMGz7A6xhy0hy25x8WBdeKVAQ+2
PLA2ytJLUn2L1S3ueqJWcdVUBRaiczOOsYvvO
...
...
-----END PGP SIGNATURE-----
但是不同的密钥(或服务器)的哈希算法是不同的,有时是SHA1,有时是SHA256,SHA512。
是什么决定了这一点,密钥还是 GnuPG 客户端?我找不到这方面的信息,当您使用gpg
创建新密钥时,没有选项可以指定哈希算法。
更新:为了澄清我的问题,我在下面添加了更多信息。用于生成上述示例输出的命令是:
gpg --clearsign
(我的系统上的 gpg 版本是 gpg2。)
然后,我输入了一些随机文本,结果如上。我想知道如何生成具有特定“Hash:”值的输出?比如 SHA1?
答案1
答案2
我想知道如何生成具有特定“Hash:”值的输出?比如 SHA1?
要回答您的问题,请使用该--digest-algo SHA1
选项。
例如,这是使用 SHA-256 的独立签名。我不使用--clearsign
,所以我不会尝试将其拼凑起来:
gpg -a -u 1F8E37BD --digest-algo SHA256 --output test.txt.sig --detach-sig test.txt
-a
生成 ASCII 装甲输出。-u
从不同的密钥中选择签名密钥。--digest-algo
选择哈希值。--output
是输出文件名。输入文件名必须是最后一个选项。
哈希列表及其值可在RFC 4880,第 9.4 节。SHA-1为2,SHA-256为8。
您可以使用以下方式审核签名:
$ cat test.txt.sig | gpg --list-packets | grep "digest algo"
digest algo 8, begin of digest 05 94
答案3
在这种情况下,应该发生的事情是,您为消息生成一个哈希值,并使用密钥对其进行加密。另一方使用相反的密钥解密哈希值,构建消息的哈希值并将其与您附加的哈希值进行比较。
让对方知道您使用了哪种哈希非常重要,但是密钥和哈希之间没有直接关联。