“我有幾個(gè)小秘密,成雙成對(duì)告訴你”——異地可靠合同簽署協(xié)議
上一篇文章介紹了“1/2不經(jīng)意傳輸協(xié)議”。這個(gè)協(xié)議能達(dá)到的效果是,一個(gè)人可以發(fā)送兩條信息給位于另一地的某個(gè)接收方,并且可以確信接收方只能獲取其中一條信息,而接收方也可以確信,發(fā)送方不知道他獲取的是哪一條信息。
這個(gè)協(xié)議解決的需求有點(diǎn)奇怪,它有什么實(shí)用價(jià)值嗎?還真有,這個(gè)協(xié)議的發(fā)明者基于“1/2不經(jīng)意傳輸協(xié)議”,開(kāi)發(fā)了一個(gè)“遠(yuǎn)程合同簽署協(xié)議”。但其中還有一個(gè)中間協(xié)議:交換部分秘密協(xié)議(Partial Secrect Exchange)。
這個(gè)中間協(xié)議,顧名思義,就是要解決異地安全可靠的交換一個(gè)秘密(后面會(huì)看到,實(shí)際上可靠交換的只是部分秘密,而非全部),這個(gè)協(xié)議是非常有用的,所以先解釋一下這個(gè)協(xié)議。
生活中經(jīng)常有這種場(chǎng)景,你需要與別人交換一個(gè)秘密。這個(gè)秘密可以是任何你認(rèn)為有價(jià)值的信息,某人的工資、年齡,一張老照片,一段文字等等。正好你持有某個(gè)秘密,是某人想知道的。某人也持有某個(gè)秘密,是你想知道的,所以你們想交換秘密。
那么就會(huì)產(chǎn)生一個(gè)誰(shuí)先給出秘密的問(wèn)題。特別是當(dāng)兩個(gè)人不在同一地點(diǎn),這個(gè)“誰(shuí)先給”的問(wèn)題就尤其棘手,因?yàn)檎l(shuí)都不能承受我的秘密給出去了,對(duì)方卻沒(méi)有把他的秘密給我的結(jié)局。這種場(chǎng)景里影視劇里看得太多了。

(上圖:如何安全交換情報(bào),一直是特工人員必須謹(jǐn)慎對(duì)付的問(wèn)題,取自電視劇“潛伏”劇照)
現(xiàn)實(shí)中,有個(gè)常用的解決方法就是分部分交換秘密。比如,如果是錢(qián)貨交易的話(huà),那可以分批次給錢(qián),對(duì)方分批次給貨。這樣,如果交易過(guò)程中一旦發(fā)現(xiàn)對(duì)方有欺詐行為,那么交易馬上終止,及時(shí)止損。
對(duì)數(shù)字化的秘密信息來(lái)說(shuō),分部分交易就更合適了。理論上,對(duì)數(shù)字化的秘密,最小可以拆成1比特的長(zhǎng)度進(jìn)行交換,我給你一比特,你給我一比特交換,這下夠安全了吧?一方如果欺詐,他也最多比對(duì)方多得到1比特的有用信息,這是幾乎可以忽略不計(jì)的一個(gè)優(yōu)勢(shì)(或者對(duì)另一方的損失)。
這個(gè)思路很好,但是這樣不能防范另一種形式的欺詐。有很多數(shù)字化的文件需要完整的文件才能打開(kāi)查看。那么當(dāng)你與對(duì)方按1比特的速率互相交換秘密的時(shí)候,你若無(wú)法在交換過(guò)程中對(duì)文件內(nèi)容檢查,而只能在對(duì)方聲稱(chēng)完成信息交換后才能檢查,若此時(shí)打開(kāi)對(duì)方的文件,發(fā)現(xiàn)不是需要的信息,那你就要跳腳了。
所以,這里需要引入一個(gè)“可識(shí)別秘密”的概念,即有辦法將這個(gè)秘密與其他無(wú)關(guān)或者你不在意的信息區(qū)分出來(lái)。簡(jiǎn)單來(lái)說(shuō),你知道,別人不知道,但是別人可以檢查驗(yàn)證的信息,就是“可識(shí)別秘密”。比如“我媽媽的身份證號(hào)碼”,就是一個(gè)“可識(shí)別秘密”。我知道我媽媽的身份證號(hào)碼,他人不知道,并且別人可以拿著這個(gè)號(hào)碼去身份驗(yàn)證系統(tǒng)上去檢查。
數(shù)學(xué)上的一種可識(shí)別秘密是這樣的:你自己生成兩個(gè)大質(zhì)數(shù),然后兩個(gè)數(shù)字乘積告訴對(duì)方。那么你手上的兩個(gè)質(zhì)數(shù)就是可識(shí)別秘密。因?yàn)閷?duì)方知道這個(gè)乘積,但是以目前數(shù)學(xué)知識(shí),分解大質(zhì)數(shù)是很困難的。但是如果你把這個(gè)質(zhì)數(shù)發(fā)給對(duì)方,對(duì)方很容易驗(yàn)證這兩個(gè)質(zhì)數(shù)乘積是否等于那個(gè)大數(shù)字。所以這也是一種“可識(shí)別秘密”。
那么,就有人設(shè)計(jì)了這樣一種交換可識(shí)別秘密協(xié)議,前提是交換偶數(shù)個(gè)可識(shí)別協(xié)議,數(shù)字越大越安全。那我們先看看這個(gè)協(xié)議的過(guò)程,其中會(huì)用到上一期介紹的“1/2不經(jīng)意傳輸”。然后分析一下為什么說(shuō)它是安全的,安全到什么程度。
假設(shè)甲乙雙方各持有相同數(shù)量的偶數(shù)個(gè)“可識(shí)別秘密”,并且每個(gè)秘密的長(zhǎng)度是相同的,需要互相交換。我就以身份證號(hào)碼為例,假設(shè)雙方要交換10個(gè)身份證號(hào)碼,身份證號(hào)碼是可識(shí)別秘密,并且長(zhǎng)度相同。

第一步是“不經(jīng)意傳輸階段”,甲乙雙方各自將自己的10個(gè)號(hào)碼任意配對(duì),組合成5對(duì)。對(duì)這5對(duì)身份證號(hào),以“1/2不經(jīng)意傳輸”的方式,交替發(fā)送給對(duì)方(后面會(huì)看到,其實(shí)交替發(fā)送也是不必要的,可以全部一起發(fā)送)。那么根據(jù)之前的介紹,完成這一步驟時(shí),雙方已經(jīng)互相交換了5個(gè)身份證號(hào),但是雙方都不能確切知道對(duì)方拿到的是哪個(gè)身份證號(hào)。
只能知道,對(duì)方在每一對(duì)身份證中,已經(jīng)拿到了一個(gè)。并且交換過(guò)程中,你隨時(shí)可以檢查對(duì)方發(fā)過(guò)來(lái)的身份證號(hào),上網(wǎng)查一下,身份證號(hào)是否正確。如果你發(fā)現(xiàn)對(duì)方給的不是你要的身份證號(hào),或者不可識(shí)別,那么交換終止。此時(shí),對(duì)方最多比你多持有一個(gè)身份證號(hào)。
第二步是“按比特交換階段”。對(duì)這5對(duì)共10個(gè)號(hào)碼,同時(shí)依次按比特位交換。即對(duì)這個(gè)10個(gè)號(hào)碼,按位取1bit,一共10個(gè)bit,發(fā)送給對(duì)方,直到最后一個(gè)bit位發(fā)送完成。過(guò)程中,因?yàn)榻邮辗揭呀?jīng)持有了每一對(duì)號(hào)碼中的一個(gè),因此,當(dāng)對(duì)方發(fā)來(lái)10個(gè)號(hào)碼時(shí),可以檢查其中5個(gè)bit是否與你已經(jīng)持有的那個(gè)號(hào)碼吻合。如果不吻合,則證明對(duì)方在欺詐,馬上終止協(xié)議。此時(shí),對(duì)方最多比你在5個(gè)號(hào)碼上,多得到1個(gè)bit位。
以上就是就是這個(gè)秘密交換協(xié)議的全過(guò)程。那分析一下,它有哪些特性。對(duì)交換秘密,最不希望的就是我把我的秘密給出去了,卻沒(méi)有拿到對(duì)方的秘密。從以上過(guò)程我們可以看出,第一階段,對(duì)方最多比我多得1個(gè)號(hào)碼,看上去還是可以接受的。并且在后文有關(guān)這個(gè)協(xié)議的應(yīng)用中可以看到,該階段無(wú)需交替發(fā)送,對(duì)方比我多得5個(gè)號(hào)碼也是可以接受的。
第二階段,對(duì)方最多比我多得5個(gè)bit位,這個(gè)差距就更小了。要指出一點(diǎn)的是,以上身份證號(hào)碼并不是一個(gè)非常好的例子,因?yàn)樯矸萏?hào)碼的每一位之間有關(guān)聯(lián),很多位置上的數(shù)字是可以很容易猜測(cè)或計(jì)算的。所以,在實(shí)際應(yīng)用中,這里的“可識(shí)別信息”應(yīng)該都是長(zhǎng)的隨機(jī)數(shù),那才是最安全的。至于如何讓隨機(jī)數(shù)成為可識(shí)別秘密,后面也會(huì)提到。
你可能會(huì)問(wèn),為啥不直接開(kāi)始按比特傳輸呢?效果也差不多嘛,不也是最多對(duì)方多得一個(gè)秘密嗎?這是好問(wèn)題。答案在于,以上這個(gè)協(xié)議的目的,并不在于安全地交換所有秘密,而是在于,安全地交換至少一對(duì)秘密。這“一對(duì)秘密”是作為一個(gè)完整的信息實(shí)體,確保接收者得到的。也就是說(shuō),如果其中一方欺詐,他無(wú)法做到在自己獲得至少一對(duì)秘密的情況下,讓對(duì)方一對(duì)秘密也得不到。以下簡(jiǎn)單分析一下理由。
在第一階段,雙方對(duì)每一對(duì)秘密進(jìn)行的是“1/2不經(jīng)意傳輸”,那么每一方最多只能得到每一對(duì)秘密中的一個(gè),而不會(huì)是全部。我們知道“1/2不經(jīng)意傳輸”本身是有防止欺詐機(jī)制的,并且交換的信息都是可以識(shí)別的。每一方都可以檢查收到的身份證號(hào)是否是約定的身份證號(hào)。若不是,則結(jié)束協(xié)議。不管怎樣,任何一方都無(wú)法拿到完整一對(duì)秘密。
第二階段,假設(shè)一方想欺詐,他想設(shè)法對(duì)讓對(duì)方一對(duì)秘密也得不到,但是他會(huì)發(fā)現(xiàn)沒(méi)法簡(jiǎn)單做到。因?yàn)槠墼p方無(wú)法知道在上一輪傳輸后,對(duì)方具體收到了哪些秘密,所以他不知道可以在哪一個(gè)bit位上進(jìn)行欺騙。他在某一對(duì)秘密上欺騙的成功概率是二分之一,但是他要在全部5對(duì)秘密上猜對(duì)的概率就只有1/32了。如果覺(jué)得這還不夠安全,那么可以增加秘密的對(duì)數(shù)。秘密的對(duì)數(shù)越多,對(duì)方欺詐的成功率就越低。
這就是這個(gè)交換秘密協(xié)議的要點(diǎn),它的效果是:雙方交換n對(duì)秘密,如果雙方誠(chéng)信,則可以交換全部n對(duì)秘密。
如果一方欺詐,那么可以確保這樣一種情況:如果欺詐方得到了對(duì)方的一對(duì)或若干對(duì)秘密,那么誠(chéng)信方至少可以得到對(duì)方一對(duì)秘密,并且n越大協(xié)議越可靠。可以證明,如果欺詐方可以通過(guò)某種計(jì)算,花費(fèi)一定時(shí)間算出誠(chéng)信方的秘密,那么誠(chéng)信方最多花4倍的時(shí)間,也可以算出欺詐方的至少一對(duì)秘密。所以,雙方算力基本相等的情況,我們相信這個(gè)協(xié)議是安全的,這就是整個(gè)協(xié)議最終要達(dá)到的效果。
那這個(gè)協(xié)議有什么用呢?看上去好像不是很有用嘛?因?yàn)樵搮f(xié)議交換的只能是偶數(shù)個(gè)可識(shí)別秘密,而只能保證至少一對(duì)秘密被交換。但如果我們能把一般的交換秘密問(wèn)題轉(zhuǎn)化為交換偶數(shù)個(gè)可識(shí)別秘密的問(wèn)題,那就可以了。
所以我們來(lái)看一個(gè)以上協(xié)議的應(yīng)用:“遠(yuǎn)程合同簽署協(xié)議”。通常的合同簽署,需要雙方在一起,當(dāng)場(chǎng)簽字,互相交換簽過(guò)字的合同。但是遠(yuǎn)程的話(huà),就有一個(gè)簽字先后問(wèn)題。誰(shuí)也不想先簽字,因?yàn)榕伦约汉灹藢?duì)方不簽,或者給別人去簽,做其他壞事等等。

那考慮一下用密碼學(xué)來(lái)解決以上問(wèn)題。首先,密碼學(xué)里,數(shù)字簽名技術(shù)已經(jīng)是很成熟了。數(shù)字簽名的原理還是用之前提到過(guò)的非對(duì)稱(chēng)加密體系。如果一段文本是用我的某個(gè)私鑰加密的,那么任何人都可以用我的公鑰對(duì)其解密。如果解密出來(lái)的信息是:“我要執(zhí)行某個(gè)合同……”,那么人們可以確信我是對(duì)這個(gè)合同簽名了,因?yàn)檫@個(gè)原始的加密的信息只能是持有私鑰的人才能產(chǎn)生,是無(wú)可抵賴(lài)的。所以某種意義上,數(shù)字簽名比手寫(xiě)簽名更可靠。
那么遠(yuǎn)程合同簽署協(xié)議,就變成交換各自數(shù)字簽名過(guò)的合同文本的過(guò)程。這個(gè)簽名過(guò)的文本確實(shí)是一個(gè)可識(shí)別秘密,但是我們需要把它轉(zhuǎn)化為偶數(shù)個(gè)可識(shí)別秘密,并且數(shù)量越多越好。怎么轉(zhuǎn)化呢?其實(shí)也很簡(jiǎn)單。
因?yàn)樯矸葑C信息是可識(shí)別秘密,因此,我可以先聲明并簽署這樣一段信息:
聲明:
如果對(duì)方能夠拿到以下10對(duì)身份證號(hào)中的至少一對(duì)號(hào)碼:
我爸爸,我媽媽
我哥哥,我堂弟
我表妹1,我表妹2
...
...
...
...
...
...
我初中同桌,我高中同桌
我就執(zhí)行以下合同:
......
當(dāng)然這樣太費(fèi)身份證號(hào)了。所以,我們數(shù)學(xué)一點(diǎn)的方法是:
聲明:
如果對(duì)方能夠給出以下10對(duì)合數(shù)中,至少一對(duì)合數(shù)的質(zhì)因子:
7990443202579378949,3764830991206009457
....
我就執(zhí)行以下合同:
......
將以上文字用自己的私鑰簽名,發(fā)送給對(duì)方,最好還發(fā)在網(wǎng)上,廣而告之。對(duì)方也做同樣的事情,把類(lèi)似信息發(fā)給你,同時(shí)廣而告之。收到后,雙方用對(duì)方的公鑰解密,并檢查一下對(duì)方的這段信息,確保沒(méi)有貓膩。
然后把手上的10對(duì)大合數(shù)作為可識(shí)別秘密,執(zhí)行上述交換秘密協(xié)議。如果雙方誠(chéng)信,那么雙方應(yīng)該在協(xié)議結(jié)束時(shí),得到所有20個(gè)數(shù)字的某個(gè)因子,那么合同生效。
如果對(duì)方欺詐,根據(jù)之前的分析,我們知道,如果對(duì)方得到了我的某一對(duì)合數(shù)的因子,那我也應(yīng)該可以在不長(zhǎng)的時(shí)間內(nèi),同樣計(jì)算出對(duì)方某一對(duì)合數(shù)的因子,從而確保雙方同時(shí)簽署了這個(gè)合同。
從這個(gè)過(guò)程中,也可以看出,交換秘密協(xié)議還是很有用的,因?yàn)槔碚撋现灰讶魏我粋€(gè)交換秘密問(wèn)題轉(zhuǎn)化成交換若干對(duì)可識(shí)別秘密,就可以使用上述協(xié)議。而“可識(shí)別秘密”很容易構(gòu)造的。
最后還要指出一點(diǎn)是,上文中用大數(shù)字的因子作為可識(shí)別秘密還是有一些小的缺陷,使得可以被用來(lái)欺詐,大家可以自己思考一下,怎么用來(lái)欺詐。另外,有人用以上這個(gè)秘密交換協(xié)議,實(shí)現(xiàn)了另一種遠(yuǎn)程猜硬幣協(xié)議。遠(yuǎn)程猜硬幣就是在網(wǎng)絡(luò)上玩猜硬幣,一個(gè)丟一個(gè)猜。怎么才能做到?jīng)]有欺詐和抵賴(lài)呢?曾有人用量子物理特性設(shè)計(jì)了一個(gè)“量子猜硬幣協(xié)議”,有點(diǎn)“大炮打蚊子了”。請(qǐng)你考慮下,如何使用以上交換秘密協(xié)議,實(shí)現(xiàn)一個(gè)防抵賴(lài)和欺詐的“遠(yuǎn)程猜硬幣協(xié)議”。