Protocol-Design

為什麼我們必須在 PGP 進行任何壓縮之前生成簽名?

  • August 16, 2015

我對 PGP 進行了一些研究,發現在進行任何壓縮之前必須生成簽名有兩個原因。然而,我不確定我是否真的了解他們兩個。

一個原因是必須先壓縮消息然後再簽名,因為如果我們需要進行任何未來驗證,我們只需要儲存簽名 - 但我認為如果我們先進行簽名然後壓縮,我們還需要儲存簽名和壓縮值。所以它和我們先做簽名,然後是壓縮一樣。無論哪種方式,我們還需要儲存簽名和壓縮值以供將來驗證。

然後還有第二個原因……我完全不明白:

即使願意動態生成重新壓縮的消息以進行驗證,PGP 的壓縮算法也存在困難。該算法不是確定性的;該算法的各種實現在執行速度與壓縮比方面實現了不同的折衷,因此產生了不同的壓縮形式。但是,這些不同的壓縮算法是可互操作的,因為任何版本的算法都可以正確解壓縮任何其他版本的輸出。在壓縮後應用散列函式和簽名會將所有 PGP 實現限制為相同版本的壓縮算法

(第二個原因來自 William Stalling 的書“密碼學和網路安全”,第 4 版。)

誰能幫我理解這兩個原因(尤其是後者),和/或你能向我解釋為什麼 PGP 期望我們在壓縮之前生成簽名嗎?

至於第一個原因:將來你可能需要解壓形式的消息。您對壓縮消息無能為力。但是 PGP 是應用程序級別的;您可能需要隨時驗證該消息。現在,您可能想要驗證解壓縮數據的簽名,而無需先對其進行壓縮。例如,允許通過網路進行壓縮然後將未壓縮的消息儲存在磁碟上是一個很好的案例。

至於第二個原因:壓縮與啟發式和壓縮級別一起工作。這些級別暗示系統需要投入多少工作(主要是 CPU 週期)來壓縮數據。不同的實現可能會做出不同的選擇。壓縮格式本身將指示壓縮是如何發生的 - 否則您當然無法解壓縮。因此,如果您在系統 2 上解壓縮(使用系統 1 的儲存方法)並再次壓縮(使用系統 2 的啟發式方法),您可能會得到不同的結果。不同的輸出會導致不同的簽名,因此對未壓縮的明文進行簽名更有意義。

從語義上講,它也更有意義;你想在消息上簽名,對吧?不是它的一些特殊壓縮表示。

顯然,壓縮應該是完全無損的。結果消息中有一點錯誤或明文的順序不同,簽名將無法驗證。

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