SSH 密鑰對是零知識證明的一個例子嗎?
引用source,使用 SSH 密鑰對的身份驗證是這樣的:
- 客戶端首先向伺服器發送它想要驗證的密鑰對的 ID。
2)伺服器檢查客戶端嘗試登錄的帳戶的authorized_keys文件以獲取密鑰ID。
如果在文件中找到與ID匹配的公鑰,則伺服器生成一個隨機數,並使用該公鑰對該數字進行加密。
伺服器向客戶端發送此加密消息。
如果客戶端確實有相關的私鑰,它將能夠使用該密鑰解密消息,從而顯示原始號碼。
客戶端將解密後的數字與用於加密通信的共享會話密鑰相結合,併計算該值的 MD5 雜湊值。
客戶端然後將此 MD5 散列發送回伺服器,作為對加密數字消息的回答。
伺服器使用相同的共享會話密鑰和它發送給客戶端的原始數字自行計算MD5值。它將自己的計算與客戶端發回的計算進行比較。如果這兩個值匹配,則證明客戶端擁有私鑰並且客戶端已通過身份驗證。
這似乎滿足了零知識證明的所有必要要求。它是完整的、健全的,並且伺服器不會學習到使用者私鑰的新知識。
我發現這個問題起初似乎相關。
但是,此問題中的 OP 要求驗證器發送文本,讓證明者使用其私鑰對其進行加密,然後驗證器使用公鑰對其進行驗證。因此,一些知識被洩露(即私鑰密文及其相應的挑戰)。但是,使用 SSH 密鑰對協議,只有公鑰密文被通信,這已經是公開的知識。由於沒有新的知識被傳播,SSH 滿足零知識證明的要求,對吧?
在步驟 3-4) 中,伺服器可以使用該協議來解密使用客戶端的公鑰加密的任何消息。伺服器無法單獨解密,因為它不知道客戶端的密鑰,因此該協議不是完美的零知識。此外,該協議不是知識證明,因為您無法建構有效的知識提取器(請參閱“有效性”)。充其量,該協議證明客戶端的公鑰是“格式良好的”。
“不學習新知識”被形式化為模擬器算法的存在,它足夠快地產生無法區分的成績單。換句話說:必須存在模擬器才能將其命名為零知識。
戈德賴希、米卡利、威格德森。只產生有效性的證明..連結。
更新:模擬器(由伺服器/驗證程序執行)將
1:隨機選擇一個,與步驟3中的伺服器完全相同,產生密文;
2:產生一個共享密鑰,將它與第 1 步中的隨機數結合,產生與第 6 步中客戶端完全相同的雜湊值。
模擬腳本是生成的兩條消息,根據在步驟 1 中選擇的隨機機率分佈進行分佈。這意味著,模擬腳本和會話腳本無法區分。
在這種情況下,任何人都可以 (a) 選擇一個隨機數並生成一個據稱由客戶端解密的密文,以及 (b) 生成一個共享密鑰以與上一步中的隨機數相結合。