數字簽名

00潤物無聲00發表於2016-10-30

#簡介
假設Alice需要向Bob借100萬元,不過,Alice和Bob離得很遠,無法直接見面。通過銀行匯款,Alice可以立刻從Bob那裡收到錢,但是Alice的借條應該怎樣傳送給Bob呢?可以用掛號寄過去,不過那樣需要花上一段時間,能不能用電子郵件來傳送借條呢?比如:
“Bob,我向你借款100萬元。-----Alice"
顯然,這樣的郵件無法代替借條,Bob看到這封郵件也不會輕易相信,因為電子郵件是很容易被偽造的。Alice寫的郵件可能被篡改,也有可能是有人偽裝成Alice傳送這封郵件,或者Alice也可以事後以”我不知道這張借條“為理由進行否認。
數字簽名就是用來解決這樣的問題,即識別篡改,偽裝和防止否認。在數字簽名總有兩種行為:

  • 生成訊息簽名行為
  • 驗證訊息簽名行為

生成訊息簽名是由訊息的傳送者Alice來完成的,也稱為“對訊息簽名”,生成簽名就是根據訊息內容計算數字簽名的值,這個行為意味著“我認可該訊息的內容”。
驗證簽名這一行為是由訊息的接收者Bob來完成的,但也可以由需要驗證訊息的第三方來完成,驗證簽名就是檢查該訊息的簽名是否真的屬於Alice,驗證的結果可以是成功或者失敗,成功以為著這個簽名是屬於Alice的,失敗則意味著這個簽名不是屬於Alice的。
數字簽名對簽名金鑰和驗證金鑰進行了區分,使用驗證金鑰是無法完成簽名的,簽名金鑰只能由簽名的人持有,而驗證金鑰則是任何需要驗證簽名的人都可以持有。實際上,數字簽名和公鑰密碼有著非常緊密的聯絡,數字簽名就是通過將公鑰密碼“反過來用”而實現的。
這裡寫圖片描述
#公鑰密碼和數字簽名
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

#數字簽名例項
##直接對訊息簽名(DSA)

  • Alice用自己的私鑰對詳細簽名

用私鑰加密得到的密文就是Alice對這條訊息的簽名,由於只有Alice才持有自己的私鑰,因此除了Alice以外,其他人是無法生成相同的簽名的。

  • Alice將訊息和簽名傳送給Bob
  • Bob用Alice的公鑰對收到的簽名進行解密

如果收到的簽名確實是用Alice的私鑰進行加密得到的密文(簽名),那麼用Alice的公鑰應該能正確的解密。如果接收到的簽名不是用Alice的私鑰進行加密得到的密文,那麼就無法用Alice的公鑰正確的解密

  • Bob將簽名解密後得到的訊息與Alice直接傳送的訊息進行對比

如果兩者一致,則簽名驗證成功,如果兩者不一致,則簽名驗證失敗。
這裡寫圖片描述

##對訊息雜湊值簽名(RSA,橢圓加密)
上面我們使用直接對訊息簽名的辦法,但這種方法需要對整個訊息進行加密,非常耗時,這是因為公鑰密碼演算法非常慢。所以我們可以求出訊息的雜湊值再對雜湊值加密。無論訊息有多長,雜湊值的長度是固定的,因此對雜湊值加密要快很多。

  • Alice用單向雜湊函式計算訊息的雜湊值。

  • Alice用自己的私鑰對雜湊值進行加密,用私鑰加密雜湊值所得到的密文就是Alice對這條雜湊值的簽名,由於只有Alice才持有自己的私鑰,因此除了Alice意外,其他人是無法生成相同的簽名的。

  • Alice將訊息和簽名傳送給Bob

  • Bob用Alice的公鑰對收到的簽名進行解密。如果收到的簽名確實是用Alice的私鑰進行加密而得到的密文,那麼用Alice的公鑰應該能夠正確解密,解密的結果應該等於訊息的雜湊值。如果收到的簽名不是用Alice的私鑰經i選哪個加密而得到的密文,那麼就無法用Alice的公鑰正確解密。

  • Bob將簽名解密後得到的雜湊值與Alice直接傳送的訊息的雜湊值進行對比。如果兩者一致,則簽名成功,否則簽名失敗。
    這裡寫圖片描述

學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928

清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980
在這裡插入圖片描述

相關文章