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