只知其一
考慮以下問題:
Alice 手中有兩個資訊:資訊一跟資訊二。
Alice 想讓 Bob 獲得其中一個資訊,並且
- 由 Bob 決定獲得資訊一或資訊二。
- Alice 不能知道 Bob 實際選了哪個資訊。
- Bob 不能知道沒被選到的那個資訊。
他們該怎麼做呢?
思考一下
反推的思路(不知道有沒有漏洞):
- 假設:Alice 把兩個資訊個別處理後,傳給 Bob 兩包資料(分別對應資訊一跟二),但 Bob 只有能力復原 Bob 想要的那個。
- 所以 Alice 處理兩個資訊前要跟 Bob 拿一個輸入,否則 Bob 要嘛兩個資訊都能復原要嘛兩個資訊都不能復原。
- Bob 的輸入不能直接讓 Alice 看出來 Bob 是想要哪個資訊,但要有辦法指定其中一個資訊。
- 一個想法是讓 Alice 給 Bob 兩個亂數產生器 F1, F2(或是說 one way function 比較恰當)。Bob 自己先產生一個值 K,餵給其中一個函數,再把函數的輸出 m 給 Alice。這樣 Alice 收到的就是一個看起來隨機的輸入,無法區分 Bob 實際上選了那個函數。
- 假設:Bob 復原的方式是用前面產生的值 K 解密 Alice 傳過來的兩包資料。
- 那麼 Alice 可以用公鑰加密函數來作為 F1, F2。收到 m 之後 Alice 用私鑰解密出兩個值 K1, K2,其中有一個會是 Bob 選的 K,但 Alice 無從得知哪一個才是。
- Alice 用 K1 加密資訊一,K2 加密資訊二,傳給 Bob。
- Bob 可以用 K 解密他選的那個資訊。但另一個資訊是 Alice 用 Bob 不知道的金鑰加密的,所以 Bob 無法知道另一個資訊。
照時間順序的話:
- Alice 為資訊一跟二各別生成一對加密的公私鑰 (Pub_1, Priv_1), (Pub2, Priv_2),跟 Bob 說 :「資訊一的公鑰是 Pub_1,資訊二的公鑰是 Pub_2」。
- Bob 生成一個對稱加密的金鑰 K,接著 Bob 用想要獲得的那個資訊對應的公鑰 Pub_i 加密自己的金鑰 K :
- 如果 Bob 想要獲得資訊一,則用 Pub_1 加密 K。
- 如果 Bob 想要獲得資訊二,則用 Pub_2 加密 K。
- Bob 把加密的結果 m 傳給 Alice:「我把我選的金鑰用某個公鑰加密成 m 了」。
- Alice 用兩個私鑰 Priv_1, Priv_2 嘗試解密 m,得到兩個結果 K1, K2:
- 用 Priv_1 嘗試解密 m 得到 K1。
- 用 Priv_2 嘗試解密 m 得到 K2。
- Alice 用對稱加密把資訊一跟二用前一步的結果分別加密:
- 用 K1 對稱加密資訊一得到 M1。
- 用 K2 對稱加密資訊二得到 M2。
- Alice 把 M1, M2 傳給 Bob:「資訊一加密後是 M1, 資訊二加密後是 M2」。
- Bob 用自己的私鑰 K 解密當初選擇的資訊。