Public-Key

只能由一個特定的人驗證的數字簽名

  • June 15, 2019

我想對一條消息進行數字簽名,這樣簽名只能由一個特定的人驗證。簡單地加密簽名是行不通的,因為那個人可以解密並發布簽名,其他人都可以驗證它。

有誰知道實現這一目標的計劃?或者有什麼其他建議?

在我的情況下,驗證簽名的人有動機不公開他們的私鑰。

您似乎正在尋找的是可否認的身份驗證

這實際上是一個比你所要求的更強大的屬性:它保證接收者(讓我們稱他為 Bob)不能以加密方式說服其他任何人相信發送者(讓我們稱她為 Alice)簽署了消息,即使他披露了他的所有資訊。私鑰,僅僅是因為協議保證知道 Bob(和/或 Alice)的私鑰對於驗證簽名是必要的,並且足以偽造它。因此,鮑勃看到一條帶有有效簽名的消息並知道它不是他自己創建的,可以確信一定是愛麗絲發送了它——但他不能使用簽名來說服其他人,因為他本可以以及自己創建的簽名。


在兩方之間實現這種經過身份驗證但可否認的通信的最簡單方法是使用對稱密鑰身份驗證加密方案(或者,如果出於某種原因不需要或不需要消息隱私,則只需使用普通MAC)。通過這些方案,Alice 和 Bob 知道用於驗證消息和驗證其真實性的相同密鑰。因此,很簡單,Alice 可以做的任何事情(例如創建一個聲稱是從 Alice 到 Bob 的有效認證消息)Bob——或任何其他知道密鑰的人——也可以做。

這種對稱密鑰方案的主要缺點是,它們需要為每對通信方提供單獨的密鑰(如果可能有很多這樣的通信方,這可能會變得很麻煩),並且必須以某種方式在每對通信方之間安全地共享密鑰。派對。如果我們在每一方之間都有一個加密和經過身份驗證的安全通道,這將很容易,但由於這正是我們在這裡試圖設置的,這就產生了一種先有雞還是先有蛋的問題。


解決這些問題的一種方法是使用公鑰加密來共享密鑰。特別是,我們可以使用Diffie-Hellman 密鑰交換在任何兩方之間建立共享秘密,只要他們知道彼此的公鑰(當然,他們自己對應的私鑰)。

Diffie-Hellman 密鑰交換通常被描述為一個互動式協議,但實際上它需要的唯一互動是每一方將他們的公鑰發送給另一方(他們可以提前這樣做,例如通過在一些半可信的中央密鑰伺服器)。之後,任何時候一方(比如 Alice)想要向另一方(比如 Bob)發送消息,她可以將她的私鑰與 Bob 的公鑰結合起來,以獲得只有她和 Bob 知道的秘密值,然後使用這個秘密(可能在通過合適的KDF饋送它之後)作為如上所述的經過身份驗證的加密方案的對稱密鑰。


無論如何,為了實際使用,您實際上不需要自己實現任何這些,因為此類方案的現有實現很多。例如,NaCl庫(及其各種衍生品,例如libsodium)提供了crypto_secretbox對稱密鑰認證加密crypto_box功能和可否認認證公鑰加密功能。如果您不是特別需要推出自己的加密方案,我會鼓勵您使用那些,或其他類似的已建立且經過充分研究的實現。

(您可能想要這樣做的一個可能原因是為了防止 nonce 誤用。上述 NaCl 功能要求您為每條消息分配一個唯一的nonce ,如果您曾經為兩條不同的消息重用相同的 nonce ,它的安全性可能會受到嚴重損害使用相同的密鑰加密。有一些基於SIV 結構的經過身份驗證的加密方案更能抵抗這種隨機數濫用,例如AES-SIVAES-GCM-SIV甚至HS1-SIV,但 NaClcrypto_box目前不支持如果你願意,你可以重新實現crypto_box使用的“散列的 Diffie-Hellman”部分crypto_scalarmult並將生成的密鑰與一些 SIV 風格的對稱加密方案一起使用,但這比僅僅使用它需要更多的努力和小心crypto_box。)


附言。稍微切線,請注意僅 Diffie-Hellman 並不能完全解決密鑰分發問題,因為它仍然依賴於各方能夠共享他們的公鑰而沒有任何人篡改它們。特別是,如果 Alice 和 Bob 試圖通過中間人 Mallory 控制的通道交換公鑰,他可以用自己的公鑰替換 Alice 和 Bob 的公鑰,然後攔截任何用這些密鑰加密的消息,解密並重新- 在傳遞每條消息之前對其進行加密。

(當然,如果 Mallory停止這樣做,Alice 和 Bob 將發現自己無法通信,除非他們重新交換公鑰。但對 Alice 和 Bob 來說,這看起來好像有人剛剛開始通過攔截他們的通信來攻擊他們的通信。消息並用無效的偽造品替換它們。如果沒有其他通信渠道,Alice 或 Bob 就無法知道攻擊是剛剛開始還是剛剛停止。即使他們以某種方式弄清楚了,也可能為時已晚。 )

嘗試解決此問題的一種方法是建立某種公鑰基礎設施,第三方可以在其中籤署 Alice 和 Bob 的公鑰,以保證他們的正確性。但是建立一個可靠的 PKI 絕非易事,因為在某些時候你仍然需要信任某人

假設愛麗絲想向鮑勃發送一條敏感消息,她想向鮑勃證明它來自她,但她不希望鮑勃能夠向其他任何人證明這一點。

MAC是一個很好的方法。如果 Alice 和 Bob 共享一個 MAC 密鑰(並且只有他們擁有它),那麼 Bob 將知道任何使用該 MAC 密鑰進行身份驗證的消息都來自 Alice,因為他知道他沒有成功,而她是唯一可以擁有的人.

但是,第三方無法區分來自 Alice 的消息和來自 Bob 的偽造消息,因為 Bob 和 Alice 一樣能夠創建 MAC。

環形簽名也可以工作,並且不需要他們分享秘密。在這裡,愛麗絲會做一個簽名,證明該消息來自愛麗絲或鮑勃。Bob 知道他沒有簽名,但他很難說服第三方相信這一點。

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