lancer1268's blog

在通訊軟體擲硬幣 (Coin flipping by telephone)

阿公在超市購物而阿嬤在健行,他們正在 LINE 上爭執晚餐的湯要喝鹹的還是淡的。

最後他們決定由阿公擲硬幣讓阿嬤猜,阿嬤猜中的話就聽阿嬤的,否則就聽阿公的。問題是,要怎麼避免作弊或是耍賴呢?

如果阿嬤說:「我猜⋯⋯數字那一面」,阿公卻說:「哈哈,猜錯了,是人頭啦」,阿嬤一定不服氣,要阿公證明他沒有作弊(聽到阿嬤猜測後才改口)。

Blum 在 1981 年的 Coin flipping by telephone 提出了一個作法。


基本思路

因此,一個可能的流程長得像這樣

  1. 擲硬幣者給出硬幣結果的部份證據。
  2. 猜測者進行猜測。
  3. 擲硬幣者給完整證據。
  4. 猜測者驗證。

套回原本的情境

  1. 阿公先幫硬幣拍照,並把照片加密後傳給阿嬤,但密碼不給阿嬤。
  2. 阿嬤說出他的猜測(人頭或數字)。
  3. 阿公把加密照片用的密碼給阿嬤。
  4. 阿嬤看到照片,確認阿公說的結果跟照片中的一樣。

或是換個場景(如果不要求遠端溝通)

  1. 阿公在紙條上寫人頭或數字,把紙條放進保險箱裡面,把保險箱給阿嬤。
  2. 阿嬤說出他的猜測(人頭或數字)。
  3. 阿公把保險箱的鑰匙給阿嬤。
  4. 阿嬤打開保險箱檢查紙條的內容。

如果你只對原本的問題有興趣而不想看技術細節的話,看到這裡就好了。


設定

為了方便接下來的討論,我們先把流程抽象成這樣

擲硬幣者私下生成亂數 x,用來產生部份證據 h(x) 以及產生硬幣結果 c(x),在猜測者給出猜測後揭露 x。

我們用 c(x)=+1 表示結果是人頭,c(x)=−1 表示結果是數字。

為了不讓擲硬幣者「作弊」, 部份證據 h(x) 的產生必須滿足:

擲硬幣者短時間(例如 100 年)內沒辦法找到另一個亂數 x′ 產生一樣的部份證據 h(x′)=h(x) 但是硬幣結果相反 c(x′)=−c(x)。

一般來說, h 會選一個單向函數 (one-way function)。


資訊洩漏

到這邊,問題看似解決了,但有個小問題:部份證據可能洩漏了硬幣結果,也就是猜測者能從部份證據判斷人頭跟數字哪一個的可能性比較高(哪怕只是 49.99% 跟 50.01% 的差異)。

為了解決這個問題,Blum 給出了一種產生部份證據 h 以及硬幣結果 c 的方式,滿足額外的限制:

  1. 保證存在其他亂數 x′ 可以產生一樣的部份證據 h(x′)=h(x),但是硬幣結果相反。
  2. 在所有對應到同一個部份證據 H 的亂數 x 中,產生「人頭」與「數字」的亂數數量一樣多。

這麼一來,在給定部份證據 H 的情況下,人頭跟數字對猜測者來說有相同的可能性。

具體公式

先選定 n=pq ,其中 p,q 都是形如 4k+3 的質數。

協定流程(簡化版)

  1. 猜測者先選定 n=pq,把 n 告訴擲硬幣者但 p,q 保密。
  2. 擲硬幣者選擇亂數 x∈ℤn*,把 h(x)=x2modn 告訴猜測者。
  3. 猜測者給出猜測。
  4. 擲硬幣者揭露 x。

簡短分析

給定 H∈ℤn* (n 按照之前的方式選取), 如果 y2≡Hmodn 有解,那這個方程式總共會有四個解,並且其中兩個的 Jacobi symbol 是 +1,另外兩個的 Jacobi symbol 是 −1。下面給出說明。

存在四個解

給定 H∈ℤn*, 如果 y2≡Hmodn 有解,那他的解一定是

{y≡±smodpy≡±rmodq

換句話說,模 n 的解有四個: ±x 跟 ±x′。

{x≡smodpx≡rmodq,{−x≡−smodp−x≡−rmodq,{x′≡−smodpx′≡rmodq,{−x′≡smodp−x′≡−rmodq,

兩種硬幣結果各半

由於 Jacobi symbol 的性質

(−1p)={+1, ifp≡1mod4−1, ifp≡3mod4

而 p,q 都是選 4k+3 的形式,因此 (−1p)=(−1q)=−1。

他們的 Jacobi symbol

(xn)=(sp)(rq)=(−1p)(sp)(−1q)(rq)=(−sp)(−rq)=(−xn)(x′n)=(−sp)(rq)=(sp)(−rq)=(−x′n)=−(xn)

因此這四個解按照 Jacobi symbol 分成兩組:一組是 x 跟 −x,另一組是 x′ 跟 −x′。 一組的 Jacobi symbol 是 +1,另一組是 −1。

無法偽造硬幣結果

擲硬幣者生成亂數 x 後只需要告知猜測者 h(x) 的值,直到對方做出猜測後才需要揭露 x。那擲硬幣者有沒有辦法在聽到猜測後,謊稱他的亂數其實是另一個值呢?

可以,他可以宣稱他當初是選 −x,並且因為 h(−x)=x2=h(x),這個謊稱的值一樣可以通過驗證。不過問題是 x 跟 −x 的 Jacobi symbol 一樣,這樣並沒有辦法改變硬幣結果。

那擲硬幣者有沒有辦法知道另一個分組的解(前面提到的 x′ )呢?很困難,如果找到 x 跟 x′ 的話就能夠分解 n :因為 x−x′≡0modq,所以 gcd(x−x′,n)=q,只要計算 x−x′ 跟 n 的最大公因數就能找到 n 的一個質因數。


Reference: