Public-Key

簽署 GPG 公鑰

  • July 16, 2020

我正在嘗試手動創建 GPG 公鑰(請參閱此處)。我能夠生成具有正確雜湊的 GPG 公鑰,但未能以 GPG CLI 接受的方式對該雜湊進行 RSA 簽名。對於我創建的 GPG 公鑰,請參見此處

要對雜湊進行簽名,我在 PKCS#11 HSM 上使用私鑰。HSM 支持各種簽名機制。我曾嘗試使用 RSA-PKCS-PSS(使用雜湊算法 SHA512 和遮罩生成函式 MGF1-SHA512)、SHA512-RSA-PKCS 和 SHA512-RSA-PKCS-PSS 進行簽名,但都不會生成導入命令的簽名GPG CLI 接受。我想 GPG CLI 需要不同的填充。

不幸的是,RFC 4880並未明確涵蓋 GPG 公鑰簽名填充,而僅指定 EME-PKCS1-v1_5 和 EMSA-PKCS1-v1_5 函式用於 PKCS#1 編碼。對 GPG 原始碼的快速搜尋表明,PKCS#1 v1.5 和 PSS 在某些時候都被使用。

有人知道 GPG CLI 的導入命令到底支持什麼填充嗎?

你找錯樹了。

為了回答上述問題,OpenPGP 不支持或使用 RSA-PSS,至少目前不支持。對於 RSA 簽名,來自 PKCS1 的 EMSA-PKCS1-v1_5 被引用為 rfc3447(它重新發布了 PKCS1v2.1)並為了您的方便而實際複製到 rfc4880 13.1.3(儘管沒有預先計算的 DigestInfo 編碼),雜湊填充在一起。其他 PGP 簽名算法不使用填充(或只是微不足道)。不僅僅是 CLI;PGP 協議和格式對於 GPG 的所有模式都是相同的。

但是你的填充很好;這是錯誤的雜湊。在您發布的消息和解碼中,給定的簽名是 SHA512 散列的有效 v1_5 簽名 89 6e e3 83 f0 24 e7 ba 4e 12 87 36 bd dd 55 fb 1d 8e 20 b0 f2 72 c6 3c e3 53 29 23 47 41 28 c9 b7 f4 51 ea 39 cd 1c ae ee 29 c2 e4 d4 13 fb 05 dd 89 bd 6b f7 20 76 63 95 f5 f8 b7 79 b2 d1 1b ——或者準確地說,由於 v1_5 簽名方案包括散列,它是具有該 SHA512 散列的數據的簽名。但是,如您之前的問答中所示,此公鑰的正確雜湊是2f 9b ad fd 89 90 e9 34 f3 15 c6 9c c5 8e 45 12 47 29 fe ab e6 18 a2 e2 71 fb bf e1 9e 20 10 8a 86 ea d9 dd 5b 87 58 87 45 85 98 2a 68 14 e9 e2 ef 9e b6 07 12 1d 9b 7c 15 8f 58 79 c2 92 c5 e9. 前者的值實際上是後者的 SHA512 散列,也就是散列的散列。可能您已將雜湊值作為數據提供給簽名機制,該機制既對其輸入進行雜湊處理並對其輸入進行簽名——正如 v1_5 簽名實現通常所做的那樣,因此它們可以確保將相同的雜湊應用於在 DigestInfo 中編碼的數據。特別是一個名為 ‘SHA512-RSA-PKCS’ 的機制幾乎可以肯定地應用雜湊 (SHA512) 並填充和 modexps 結果。

要解決您的實際問題,您應該將數據而不是雜湊作為簽名機制的輸入,並且不要以任何方式更改與填充相關的任何內容。

引用自:https://crypto.stackexchange.com/questions/81924