我們可以使用對稱/散列函式對消息進行簽名作為公私鑰簽名的量子證明替代嗎?
公私密鑰簽名通常是這樣工作的:
- 我宣布我的公鑰。
- 我用我的私鑰加密了一些東西。
- 如果人們設法用 (1) 解密 (2),則 (2) 來自 (1) 的所有者。
- 然後人們可以使用(1)中的公鑰加密給我的東西。
也可以使用散列或對稱密碼算法進行簽名,但驗證發生在該人發布他的舊隨機秘密時。
雜湊函式簽名:
- 我加密了一些標準消息,例如
0
,使用隨機生成的密鑰 $ k_r $ . 例如 $ c_1 = enc(\text{0
}, k_1) $ .- 我發 $ c_1 $ 在我的正常資訊旁邊的人。
- 接收者不會知道 (2) 是否是我,直到我發送另一條消息並在它旁邊我給他們 $ k_1 $ 可以解密的 $ c_1 $ 帶
0
回來。除此之外,我將發送一個新的 $ c_2 $ .不確定是否有雞和蛋的問題。例如,在人們交換他們的公私鑰的簽名方中,他們可以相反地交換他們的加密
0
消息(即 $ c_1 $ 在這個例子中)。但我不清楚的是,這樣的事情如何適用於其他情況,例如簽署付款或交易的方法。例如,想像一下比特幣地址是否是散列/對稱密碼簽名,例如 $ c_1 $ , $ c_2 $ 等,而不是公鑰。
我看到散列/對稱簽名需要額外的內務管理(例如,擁有最新的副本 $ c_i $ )。但是如果解決了這樣的家務,那它有什麼理由不能代替所有任務的公私鑰呢?
公私密鑰簽名通常是這樣工作的
不,它沒有。可以這樣查看 RSA(如果您停留在 10,000 英尺高度);但是 a) 不鼓勵使用相同的密鑰進行簽名和解密,並且 b) RSA 本質上是唯一可以以這種方式描述的簽名算法。
但是,這並不能解決您的真正問題:
雜湊函式簽名
好吧,您沒有正確描述它 - 一方面,沒有任何東西可以將消息與顯示的鍵值聯繫起來。也就是說,有人可以在飛行中修改消息,而鍵值仍然會檢出。
Lamport一般被理解為:
- 我們挑選 $ k $ 雜湊原像 $ c_1, c_2, …, c_k $ , 並對它們中的每一個進行散列,並發布每個散列的結果 $ H(c_1), H(c_2), …, H(c_k) $ 作為公鑰
- 當我們得到要簽名的消息時,我們將消息轉換為一系列值 $ b_1, b_2, …, b_n $ (每個值之間 $ 1 $ 和 $ k $ ) - 這種轉換的方式是很難找到第二條消息轉換成一系列僅由其中的值組成的位 $ b_1, b_2, …, b_n $ ).
- 簽名由顯示的原像組成 $ c_{b_1}, c_{b_2}, …, c_{b_n} $
- 驗證者可以獲取消息並將其轉換為一系列值 $ b_1, b_2, …, b_n $ ,並驗證簽名中的每個原像散列到公鑰中的值。
應該很容易看出,偽造簽名需要 a) 找到一條消息,該消息可以轉換為所有在良好簽名中顯示的值(我們認為這很難),或者 b) 找到一個原像,而不是揭示(我們也認為這很難)。
也就是說,您的問題確實是:
我看到散列/對稱簽名需要額外的內務處理
好吧,Lamport 僅在您需要使用公鑰簽署單個消息時才有用。當您查看區塊鏈時(我們假設驗證者可以看到所有簽名,並且我們可以在簽名中包含下一個公鑰(當然,要簽名的消息包括下一個公鑰),這可以工作- 正如您所指出的,它確實要求我們記住下一個公鑰(每個簽名都會改變),但它是可行的。
在許多其他情況下,這不起作用。但是,對基於雜湊的簽名進行了許多修改,沒有這些限制:
- 基於狀態雜湊的簽名(例如LMS和XMSS);這些工作類似於 Lamport,除了公鑰可以簽署大量不同的消息(我們可以使這個“大數字”大於我們將看到的消息數量)。他們確實要求籤名者跟踪狀態(隨著每個簽名而變化)
- 基於無狀態雜湊的簽名(例如Sphincs+);這消除了在簽名時跟踪任何狀態的需要,因此就像任何其他簽名算法一樣
而且,如果您假設 RSA 和基於散列的簽名是唯一的選項,那麼它們不是。還有各種基於格的方案、多變數方案、基於零知識證明的方案(野餐)——有許多不同的選擇。