關於遠端拋硬幣問題的問題
我決定在這裡問這個問題,因為雖然這個問題是數學問題,但我對它在這裡的應用很感興趣。在我在 wikipedia 上閱讀的版本中,他們建議 Alice 和 Bob 採用以下方法就遠處的硬幣翻轉結果達成一致:
1)愛麗絲給鮑勃一個承諾(一個盒子),其中包含她的“電話”,但鮑勃不知道它是什麼。
- Bob 執行翻轉並將結果報告給 Alice。
3)愛麗絲告訴鮑勃“鑰匙”,鮑勃現在知道了她的“電話”。如果呼叫與報告匹配,則 Alice 獲勝,否則 Bob 獲勝。
首先,我想知道這個“盒子”是如何在相關的加密系統中實際實現的。根據“盒子”的實際定義方式,Alice 總是可以通過以下方式獲勝:(我們假設“盒子”是一個安全文件,其內容對 Bob 來說是絕對未知的。將此文件命名為 F)
1)愛麗絲給鮑勃一個“盒子”,其中包含可能的硬幣翻轉的“尾巴”和“正面”(但顯然鮑勃不知道上面使用的定義的內容)。
2)鮑勃執行翻轉並將結果報告給愛麗絲(讓它成為正面)。
3)Alice 提供相應的密鑰 $ k_h $ 給鮑勃,這樣: $ k_h(F) = ‘heads’ $ ,而愛麗絲不可避免地會贏。(如果鮑勃報告了反面,她會提供 $ k_t $ 這樣 $ k_t(F) = ’tails’ $ )
基本上,這裡的文件是一個 2 鍵容器,它根據使用的鍵返回不同的結果。我給的“盒子”的定義是錯誤的嗎?正確的定義是什麼?
我給的“盒子”的定義是錯誤的嗎?正確的定義是什麼?
這是不正確的。
承諾方案的類似描述是它是一個只包含一個選擇(例如,“正面”或“反面”)的盒子,Alice 可以放置其中任何一個,而 Bob 無法分辨(通過查看盒子)這是其中。
稍後,愛麗絲可以打開盒子;然後 Bob 可以說出裡面有什麼,並且(這裡是關鍵點)Alice 不能改變主意盒子裡有什麼。
有了這個定義,這是一個安全的硬幣翻轉協議(除了當 Alice 知道 Bob 的選擇時,她可以在不打開盒子的情況下走開;這需要以某種方式處理)。
實現承諾方案的最簡單方法是使用加密雜湊函式;Alice 選擇了她投入到承諾中的秘密值和一個長的隨機隨機數,她將它們一起散列:
$$ Commitment = Hash( Secret || Nonce ) $$ 然後她將雜湊發送給 Bob。Bob 通過查看雜湊,無法恢復承諾(因為隨機數)。然後,Alice 通過透露秘密和隨機數來打開承諾;Bob 通過將揭示的秘密和隨機數散列在一起以重新計算原始承諾來驗證秘密。如果使用的 Hash 是抗衝突的(也就是說,我們找不到兩個不同的值雜湊到相同的值),那麼 Alice 就不能有一個可以打開兩個不同值的承諾(因為這意味著兩個不同的值) $ Secret || Nonce $ 散列到同一事物的值,我們假設 Alice 找不到這樣的一對)。