“我知道這是二分之一的機(jī)會”——1/2不經(jīng)意傳輸協(xié)議介紹
介紹一個密碼學(xué)中的概念:“不經(jīng)意傳輸”(Oblivious Transfer,OT)。“不經(jīng)意”一詞是英語“oblivious”的翻譯,字典里給這個詞的解釋是“遺忘的、不知道”的,其實這個意思更接近這個概念的本質(zhì)。
“不經(jīng)意傳輸”要解決這類問題:你需要給對方多條信息,但是你又必須確保對方只獲得其中一條,但是對方又希望能夠確保你不知道他看到哪一條信息。
設(shè)計一個具體場景:你給你的哥們介紹相親女朋友,你有兩個可供介紹的單身女性,但是你不想同時將兩人的情況和聯(lián)系方式給對方。但你也無法抉擇到底給哪個,所以你想讓他隨機(jī)抽簽選擇一個。但與此同時,你的哥們也不想讓你知道,他最終抽到了誰。這個問題怎么解決?現(xiàn)實中,有個解決方法是這樣的:
你把兩位女性朋友的資料放進(jìn)兩個一樣的信封里,封好口。確保外觀上兩個信封是一樣的。然后你就和你的哥們當(dāng)場讓他選一個信封,剩下一個信封立即燒掉,選中的信封讓他帶回去慢慢拆開看。

現(xiàn)在我們需要把以上的流程移植到網(wǎng)絡(luò)上,你和你的哥們不在一處,能否通過電話、微信等手段,安全可靠實現(xiàn)以上的信息傳輸效果?答案是可以的,這就是今天要介紹的“1/2不經(jīng)意傳輸協(xié)議”。
而這個“1/2不經(jīng)意傳輸協(xié)議”,顧名思義,發(fā)送方其實是發(fā)送了兩條信息,但其中只有一條能被正確讀取,被接收方收到,而具體是哪一條,但發(fā)送方并不知道,也無法決定。這個協(xié)議的具體標(biāo)準(zhǔn)一共三條:
第一:如果發(fā)送方正確執(zhí)行協(xié)議,并且發(fā)送兩條消息給接收方,那么接收方只能恰好從兩條信息收到一條,獲知其中一條的內(nèi)容。并且按照原版規(guī)則,接收方并不能選擇接收哪一條(雖然可以做一些改變,使得接收方可以決定收哪條消息)。
第二:對發(fā)送方來說,接收方獲得兩條消息中的任何一條的后驗概率都是1/2。它的意思就是,重復(fù)不斷玩這個游戲,接收方不能使自己看到某條消息的概率升高。不能出現(xiàn)這種情況:在玩了一百次游戲之后,接收方可以90%的概率來接收某一條消息了??梢钥闯?,這條是與第一條有關(guān)聯(lián)的,第一條規(guī)定了接收方是沒有辦法選擇接收哪條消息的。
第三條,也是最后一條規(guī)則是:如果發(fā)送方試圖欺詐,使得接收方接收某一條消息的概率高于50%,那么接收方可以發(fā)現(xiàn)、識破這種企圖。這是三條規(guī)則中最嚴(yán)格和難以實現(xiàn)的一條。它不讓發(fā)送方有操縱接收方接收某一條消息概率的可能。兩條消息獲得的幾率必須是一半對一半。發(fā)送方如果試圖欺詐,就會被接收方識破。
當(dāng)然,如果發(fā)送方根本沒有發(fā)送兩條不同消息,而是發(fā)送兩條一模一樣的消息,那當(dāng)然接收方只能收到那條消息。但這種情況不在技術(shù)討論范圍內(nèi)了,我們只考慮正常發(fā)送不同消息的情況下,如何防止發(fā)送方的欺詐。
另外,規(guī)則里并沒有說,接收方欺詐,比如同時嘗試讀取兩條消息時,發(fā)送方是否能夠識破。但看過具體實現(xiàn)后,你會發(fā)現(xiàn),接收方?jīng)]法欺詐。接收方欺詐的后果只可能是一條消息都看不見。
以上就是“1/2不經(jīng)意傳輸協(xié)議”的游戲規(guī)則,聽上去是有點難的。那我們來想想看如何來實現(xiàn)。
首先,為了簡化問題,假設(shè)你已經(jīng)把兩位姑娘的資料放到某個網(wǎng)盤上,都設(shè)置了一個提取密碼?,F(xiàn)在問題就變?yōu)?,你需要把兩個密碼發(fā)送給你的朋友,但是你必須確信他只能拿到其中一個的密碼,而你的朋友需要確信你不能知道他最終看到哪個密碼。
如果說用視頻方式重復(fù)文章開始時的那個燒信封的流程,你把兩個密碼放進(jìn)兩個信封,讓對方視頻里挑一個,然后把信封里的密碼給對方看。這樣的話,你沒法證明你沒看到具體的密碼。
如果讓對方先你一個密碼,然后你隨機(jī)的給某個網(wǎng)盤的提取密碼設(shè)置成對方給你的密碼。但這樣的話,這樣你就會知道對方最終的選擇。
所以,這里能看出,需要實現(xiàn)一種機(jī)制,接收方有最終選擇權(quán)。但是,你需要在不知情的情況下,獲得對方的這種選擇結(jié)果。
這里,要實現(xiàn)這種機(jī)制,我們需要用一點密碼學(xué)里的一個基本知識,就是“非對稱”加密體系。關(guān)于非對稱加密體系,我已經(jīng)多次提到過,這里再簡單介紹下。加密體系分為對稱和非對稱兩種,“對稱”就是加密、解密用同一把秘鑰,就像你的word文件打開密碼。非對稱加密體系,就是加密用一個秘鑰,解密用另一個秘鑰。加密秘鑰稱為“公鑰”,是可以公開的;解密秘鑰,稱為“私鑰”,是需要嚴(yán)格保密的。
但這里要注意的是,無論是是對稱還是非對稱秘鑰,當(dāng)你用“不正確”的秘鑰去解密的時,所發(fā)生的情況并不是像你平時輸錯密碼時,被拒絕操作。實際情況是,程序仍然去默默的“解密”。只是解密結(jié)果像是亂碼,除此以外與你用正確秘鑰解密發(fā)生的情況是一樣的。所以,“秘鑰”正確與否,全看解密后的輸出。
使用對稱秘鑰加解密的例子:
用des-ecb加密算法,'C0FEE'為秘鑰(對openssl,秘鑰需要以16進(jìn)制數(shù)字輸入),將字符串“大老李聊數(shù)學(xué)”加密為base64編碼的字符串:“7qEvJ9wvjTNffHd4Brcm4m2u0AtLS7O+”
openssl?enc?-des-ecb?-base64?-in?<(echo?"大老李聊數(shù)學(xué)")?-K?C0FEE
7qEvJ9wvjTNffHd4Brcm4m2u0AtLS7O+
用'C0FEE'可以正常解密:
openssl?enc?-d?-des-ecb?-base64?-in?<(echo?"7qEvJ9wvjTNffHd4Brcm4m2u0AtLS7O+")?-K?C0FEE
大老李聊數(shù)學(xué)
用'BEEF'也可以“解密”,只是結(jié)果無意義:
openssl?enc?-d?-des-ecb?-base64?-in?<(echo?"7qEvJ9wvjTNffHd4Brcm4m2u0AtLS7O+")?-K?BEEF?-nopad
??^V"?SMS??.?5??x?????I
那么這里有意思的一個情況出現(xiàn)了,如果原始信息本身就是一個隨機(jī)數(shù)呢?那用任何秘鑰解密出來看,也是一個隨機(jī)數(shù)。這時,如果事先不知道這個數(shù)字的話,是無法判斷解密結(jié)果是否“正確”的。這是一個很重要的特性,是后面需要用的。
那現(xiàn)在我們可以這樣來操作:
發(fā)送方隨機(jī)產(chǎn)生兩套非對稱加密秘鑰,然后把這兩套秘鑰的公鑰,通過任何方式發(fā)送給接收方。
接收方收到兩個公鑰后,首先產(chǎn)生一個隨機(jī)數(shù),然后可以作出選擇。其選擇就是從收到的兩個公鑰之中,選擇一個,對自己的隨機(jī)數(shù)加密,把結(jié)果返回給發(fā)送方。
發(fā)送方收到這個加密結(jié)果后,情況有意思了。發(fā)送方當(dāng)然可以用兩個私鑰對這個結(jié)果進(jìn)行解密,得到兩個數(shù)字。發(fā)送方只知道其中必然有一個是對方生成的隨機(jī)數(shù),但是并不確定具體是哪一個。那么能做的就是,把得到的兩個數(shù)字作為提取密碼,分別設(shè)置到兩個網(wǎng)盤上。再通知對方可以去提取文件了。
接收方用自己的產(chǎn)生的隨機(jī)數(shù),作為密碼去網(wǎng)盤提取文件。接收方應(yīng)該發(fā)現(xiàn),其中只有一個位置可以提取。那么整個協(xié)議完成!
簡單分析一下以上步驟,是否符合“1/2不經(jīng)意傳輸協(xié)議”的三條規(guī)則。
第一是:兩條信息,接收方只能收到一條,且發(fā)送方不知道。那是肯定的,因為接收方?jīng)]有全部2個私鑰,所以他不能知道另一個私鑰解密后產(chǎn)生的數(shù)字。
第二條是:對發(fā)送方來說,獲得兩條消息中的任何一條的后驗概率都是1/2。這也是對的,因為發(fā)送方用兩個秘鑰解密,得到的都是兩個像隨機(jī)數(shù)的數(shù)字,對發(fā)送方來說是無法區(qū)分。但這里要注意的是,這里對接收方產(chǎn)生的隨機(jī)數(shù)有所要求的,不能使用明顯有規(guī)律的數(shù)字,比如說“12346”等等。
因為此后當(dāng)發(fā)送方解密時,他發(fā)現(xiàn)其中一個數(shù)字太有規(guī)律了,就能覺察到這是接收方設(shè)置的數(shù)字,所以這個數(shù)字必須是與用任何私鑰解密后的格式很像的才行。另外,我之前介紹的步驟其實是稍微簡化后的“1/2不經(jīng)意傳輸協(xié)議”,原版的協(xié)議略微復(fù)雜些,但沒有這個缺陷了。
原版“1/2不經(jīng)意傳輸協(xié)議”的實現(xiàn):


第三條規(guī)則是:如果發(fā)送方試圖欺詐,那么接收方可以發(fā)現(xiàn)、識破這種企圖。那么以上過程中,發(fā)送方?jīng)]有任何欺詐機(jī)會。同樣接收方也沒有任何機(jī)會,使得自己能看到兩條信息。
那么以上就是1985年,由三位計算機(jī)科學(xué)家共同提出的“1/2不經(jīng)意傳輸協(xié)議”,那這個協(xié)議思路很巧妙,那么它有沒有用呢?真有的,其實這三位科學(xué)家在這個協(xié)議的基礎(chǔ)上,開發(fā)了一種“遠(yuǎn)程合同簽署”協(xié)議。它可以讓不在同一個地方的兩個人,安全可靠的簽署合同。不會出現(xiàn)一方簽署,另一方不簽的情況。這個協(xié)議下一期介紹,敬請期待。
參考鏈接:
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.98.7448&rep=rep1&type=pdf