我試圖了解驗證分離的 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 檔案中的內容。文件格式的描述是RFC 4880(OpenPGP 標準)。
簽章不直接包含哈希值。它包含允許驗證雜湊值和發送者的信息:有一個簽名驗證演算法,它將哈希值和公鑰作為輸入,並返回是的或者不;演算法返回是的如果簽名是由與具有給定私鑰的訊息中的給定公鑰相對應的私鑰進行的,則返回不在所有其他情況下(不同雜湊的簽章、不同金鑰產生的簽章或一堆根本不能成為簽章的位元組)。在下面DSA演算法,我認為如果沒有私鑰,則無法從簽名中提取哈希值。
簽名檔案包含簽署者的身分以及簽名值。為了驗證簽名,gpg 從金鑰環讀取簽署者的公鑰,計算資料的雜湊值,並應用簽名驗證演算法。
答案2
$ gpg --list-packets myfile.asc
[...]
digest algo 10, begin of digest 77 dd
這顯示了使用了哪種摘要演算法。不幸的是,手冊頁也沒有gpg --version
告訴我們哪種演算法分配給哪個 ID。我們需要深入研究資料包格式的 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
是的,數位簽章通常是安全雜湊值,由簽署者的金鑰進行簽署。
對整個訊息進行簽名會慢很多,而且不會更安全。此外,演算法應該考慮區塊的長度、填充(以不洩露太多資訊的方式)等。
注意:同樣在非對稱加密上,出於速度原因,只有臨時對稱密鑰是不對稱加密的,其餘訊息只是對稱加密的。