為什麼我們需要數字簽名?
首先,我想說我對密碼學完全陌生。我在crypto stackexchange上搜尋但找不到以下問題的答案。(可能是因為它很容易,但我仍然不明白)
我的問題是基於這個問題。所以簽名基本上做了以下事情:消息 $ \rightarrow $ 雜湊 $ \rightarrow $ Bob 的私鑰 $ \rightarrow $ 將簽名與消息結合起來 $ \rightarrow $ 發送給愛麗絲 $ \rightarrow $ Alice 使用 Bob 的公鑰解密簽名 $ \rightarrow $ 將簽名的雜湊值與消息中的文本進行比較:
現在真正的問題是:**為什麼不直接用 Bob 的私鑰加密整個消息,然後發送給 Alice,然後用 bob 的公鑰解密呢?**因為我們可以從 CA 獲得 Bob 的公鑰,並確保我們獲得了正確的公鑰,所以如果其他人發送消息,我們根本無法解密它。
我可能搞砸了一些概念,所以如果有不清楚的地方,請發表評論!
首先是一個重要的術語:真正的問題應該表述為“為什麼不直接用 Bob 的私鑰對整個消息進行簽名,將其發送給 Alice,然後用 Bob 的公鑰對其進行驗證? ”。簽名和加密是非常不同的事情。我們僅在目標是保密時才使用“加密”;並且加密是使用接收者的公鑰執行的,而不是使用發送者的私鑰(就像簽名的情況一樣)。
撇開這個術語問題,問題描述的是使用 RSA 簽名的粗略原理,其中加密操作可以使用私鑰而不是公鑰進行。但是,這並不能轉換為任意的非對稱密碼:它們的公鑰和私鑰通常如此不同,以至於無法使用私鑰進行加密。
此外,提議的內容存在安全問題:
如果其他人發送消息,我們根本無法解密它。
不對。如果攻擊者將消息準備為合法發件人但使用不同的密鑰,則該消息可能是可破譯的,但很可能是亂碼。所以至少我們需要一個程序來辨識來自胡言亂語的真實消息,這並不容易(如果簽名的內容已經加密,這是常見的做法,這可能是不可能的)。
此外,攻擊者不限於應用具有不同密鑰的提議協議。他/她可以更改或組合現有的密碼,這容易受到攻擊。這就是為什麼安全 RSA 加密和安全 RSA 簽名的區別不僅僅是密鑰角色的交換。
我們通常對消息的雜湊進行簽名,而不是對消息進行簽名,主要是因為我們使用的簽名方案只能直接對少量數據(幾十到幾百字節)進行簽名。散列將任意大的消息縮小為小尺寸(32 或 64 字節很常見),我們可以在單個塊上簽名。對雜湊進行簽名與對消息進行簽名一樣安全,因為(對於良好的雜湊算法)我們不知道如何使兩個不同的消息具有相同的雜湊(抗碰撞)。如果沒有這個雜湊技巧,我們仍然可以簽名,但我們需要將消息分成編號的部分,並單獨簽署每個部分。簽名往往比他們可以直接簽名的要大幾倍,並且簽名生成或驗證中的至少一項通常是計算密集型的;
對於許多簽名方案,還有另一個原因:對消息進行散列處理是安全所必需的。否則,簽名方案的某些屬性將允許偽造:也許一些消息將具有微不足道的簽名,或者消息的簽名可以從一些相關消息的簽名中導出。添加散列步驟後,無法展示允許此類攻擊的消息,因為(對於良好的散列算法)我們不知道如何製作具有特定散列值(原像抗性)或更一般地具有特殊屬性的消息.