更新:本文介紹的PSI方法的Python版完整程式碼已在Github開源:
作者:Delta - 開箱即用的區塊鏈隱私計算框架(
https://
deltampc。com
)
在上一篇文章中,我們介紹瞭如何使用不經意傳輸(OT)來構建不經意偽隨機函式(OPRF),並使用不經意偽隨機函式來構造隱私集合求交(PSI)。
但是,上文介紹的方法,速度很慢,因為在構造不經意偽隨機函式時,需要使用
次不經意傳輸(
是輸入資料的長度),進而導致隱私集合求交需要使用
次不經意傳輸(
為集合大小)。我們知道,由於不經意傳輸使用公私鑰加密技術,所以不經意傳輸的速度是很慢的。所以,我們要對上文介紹的方法進行改進,而改進的主要目標,就是減少使用的不經意傳輸數量。
要做到這一點,我們就需要引入一個新的方法,不經意傳輸擴充套件。能夠少量(常數次)“慢速”的不經意傳輸,來實現大量“快速”的不經意傳輸。下面,我就來介紹不經意傳輸擴充套件。
不經意傳輸擴充套件(Oblivious Transfer Extension, OTE)
這裡介紹的不經意傳輸擴充套件方法,來自文章[2]
不經意傳輸擴充套件的目標,是使用少量“慢速”的基礎不經意傳輸,配合對稱加密,來實現大量“快速”的不經意傳輸。 形式化的來說,我們以符號
來表示進行
次不經意傳輸,每次傳輸
個位元,則不經意傳輸擴充套件的定義為:使用
來實現
,其中
是一個比較小的安全引數,且
。
下面,我們來介紹如何使用
來實現
。我們首先使用
來實現
,因為使用
比使用
更加簡單直觀,同時使用
可以很簡單地實現
。之後,我們再簡單地介紹如何使用
實現
。
我們使用
來表示
中的傳送者,
表示
中的接收者。
有
對輸入
,
有
個選擇位元
。
和
之間有一個統一的隨機函式
,即將長度為
的位元串隨機對映到長度為
的位元串。之後的步驟如下:
先初始化一個隨機的位元矩陣
,矩陣
的大小為
,即
行
列,矩陣的每個元素都是0或1。
隨機初始化
個選擇位元
作為傳送者,
作為接收者,執行
。對於第
次長度為
的不經意傳輸,
的輸入為
,其中
表示矩陣
的第
列,長度為
;
的輸入為
。當
時,
得到
,當
時,
得到
。將
收到的所有列組合成一個
的矩陣,稱為
現在,
作為接收者,
作為傳送者。
要執行
次傳輸,對於
,
傳送一對資料
,其中
,
,
為矩陣
的第
行
對於
,
輸出
,其中
表示矩陣
的第
行
現在,我們來證明方法的正確性,即
。
從步驟2中我們可以得知,
時,
;
時,
。我們可以將它寫成如下形式:
其中,符號
表示按位與運算。那麼,對於矩陣
中的第
列,第
行的元素
,有如下等式:
我們把
當作選擇位元,當
時,
;當
時,
。我們換一個角度,把
當作選擇位元,當
時,
;當
時,
。這一結果,對於所有
都成立,那麼我們可以得到:當
時,
;當
時,
,它可以寫成如下形式
從上式,我們可以得到
這時我們來看
。由於
,
,那麼
,將
和
帶入到公式
中,可得
,證畢。
從不經意傳輸的角度看,我們可以把
當作接收者
的選擇位元,
是傳送者
輸入的一對資料,當
時,
;
時,
,這就是了一個不經意傳輸。由於
,因此我們總共構造了
個不經意傳輸。
這種不經意傳輸所傳輸的資料
是隨機的,如果想要傳輸特定的資料,也就是
,我們可以把
當作加密函式的key,用來加密
,得到
,然後接收者
就可以使用
,解密出
對應的
。這裡的加密與解密操作是很簡單的,使用對稱加密即可,這相比公私鑰加密要快的多。
由此,我們透過
,外加
次的對稱加密,就實現了
。
的開銷是
次OT,加上
次的對稱加密,相比
的
次OT,還是要小很多的。尤其是當
時,這種差距就更加明顯。
之前還說到,我們可以進一步使用
來實現
,縮減開銷。從
到
是很簡單的,步驟如下:
傳送者
隨機初始化
對長度為
的金鑰
接收者
有
個選擇位元
,透過
,得到
個金鑰
對於
,傳送者
傳送
,其中
,
為一個偽隨機函式
對於
,接收者
得到
我們可以看到,主要的思路就是透過
傳輸長度為
的金鑰,作為對稱加密的金鑰,然後加密長度為
的資料,再進行傳輸。這樣做其實並沒有減少傳輸的資料量,因為實際上都要傳輸長度為
的資料給接收方。
更進一步
在有了不經意傳輸擴充套件之後,我們可以用它來改進之前的隱私集合求交演算法。最簡單的想法,就是將之前隱私集合求交演算法中所有的不經意傳輸,都使用不經意傳輸擴充套件來替換。這樣的確能夠提升演算法的效率,因為我們將大量“慢速”的不經意傳輸,替換為了少量的“慢速”不經意傳輸加大量的對稱加密。但是,演算法的傳輸量並沒有減少,仍然需要進行
次傳輸,每次傳輸2個長度為
的位元串。單純使用不經意傳輸擴充套件來替換不經意傳輸,只是減少了每次傳輸的計算開銷,並沒有減少傳輸上的開銷。那麼,能不能繼續減少傳輸上的開銷呢?答案是可以的。我們需要在不經意傳輸擴充套件的基礎上更進一步,繼續擴充套件。
觀察之前的不經意傳輸與不經意傳輸擴充套件,它們都是
不經意傳輸,也就是二選一。基於
不經意傳輸的正規化,對於一個長為
的輸入資料,我們需要為它的每一個位元進行一次不經意傳輸,所以傳輸量是
。不經意傳輸除了
不經意傳輸,還有
不經意傳輸,也就是n選一。如果我們使用
不經意傳輸,那麼,對於一個長為
的輸入資料,傳輸量變為了
。如果我們用
不經意傳輸來替換
不經意傳輸,很明顯,隱私集合求交演算法的傳輸量會縮減,但是漸進複雜度依然沒變,還是
,也就是說,傳輸量依然與輸入資料的長度
有關。但是,如果我們能實現
的不經意傳輸呢?那麼,隱私集合求交總體的傳輸量就會縮減到
,因為我們只需要一次
不經意傳輸,就能實現不經意偽隨機函式(OPRF),也就是隱私比較了。
那麼,如何構建
不經意傳輸呢?我們要在剛剛介紹的不經意傳輸擴充套件的基礎上,實現大量的
不經意傳輸。
由不經意傳輸擴充套件到#FormatImgID_197#不經意傳輸
現在我們回頭看不經意傳輸擴充套件,接收方
會先隨機初始化一個
的位元矩陣
,矩陣
的每一列
都會和選擇位元向量
進行異或,透過
不經意傳輸傳送給傳送方
。我們將
得到的每一列,組成一個矩陣
, 那麼
我們可以發現,
的第
行
,與
的第
行
進行異或
,得到的都是全零或全一,是零還是一取決於選擇
。現在我們假設一個編碼函式
,
,也就是將輸入的位元
重複
次,即重複編碼。那麼,我們可以得到
。現在觀察傳送者
透過不經意傳輸得到的矩陣
,我們知道
,那麼,結合編碼函式
,我們可以得到:
思考一下,如果我們改變編碼函式
,上面的等式是否會成立?很顯然,只要
或
成立,上面的等式就是成立的。那麼,我們就可以對編碼函式
進行改動。
之前的編碼函式
是重複編碼,輸入是一個位元,我們可以將它改為隨機編碼,且能接受任意長位元的輸入,即:
那麼,現在接收者
的選擇位
就不需要限制在一個位元了,可以為一個任意長度的資料,即
。 我們知道,接收者
現在有位元矩陣
,傳送者
有矩陣
,每一行
。對於傳送者
來說,它可以對任意長度的輸入
計算
,只有當
時,
才會成立。從不經意傳輸的角度來看,這就是一種
的不經意傳輸,因為接收者
只能獲得
一個輸出,傳送者
卻能對任意長的
計算
,也就是說,傳送者
能產生任意多個輸出,但是接收者
只能知道其中的一個。
實現不經意偽隨機函式(OPRF)
那麼,我們就可以使用
不經意傳輸,來實現隱私比較。讓
和
分別為
和
需要比較的資料,傳送者
輸出
,接收者
輸出
,
是一種雜湊函式。只需要比較
與
的輸出,就可以實現隱私比較。
從上一篇文章,我們可以得知,隱私比較可以看作不經意偽隨機函式(OPRF)。那麼,我們就可以透過對不經意傳輸擴充套件進行改造,構造出大量不經意偽隨機函式。形式化的描述如下:
接收者
有
個選擇字串
,
, 接收者
與傳送者
有一個共同的隨機編碼函式
,
的編碼長度為
, 有一個共同的雜湊函式
先初始化一個
隨機的位元矩陣
。
隨機初始化
個選擇位元
構建矩陣
,
,其中
與
分別表示
與
的第
行
作為傳送者,
作為接收者,執行
。對於第
次長度為
的不經意傳輸,
的輸入為
,
和
分別表示矩陣
和
的第
列;
的輸入為
。當
時,
得到
,當
時,
得到
。將
收到的所有列組合成一個
的矩陣,稱為
現在,
作為接收者,
作為傳送者,可以執行
次OPRF。對於
,
輸出
,
輸出
,
,
為
選擇的任意值。
由此,我們就透過改造不經意傳輸擴充套件,實現了大量的不經意偽隨機函式。我們只需要進行固定次數(
次)的
不經意傳輸,就能實現
次(
)不經意偽隨機函式。每次不經意偽隨機函式,只需要使用一個雜湊函式,進行一次傳輸即可完成,與輸入的長度
無關,開銷很小。
安全性
我們現在來考慮上述協議的安全性。
假設接收者
是誠實且好奇的,也就是說,
會正確地執行協議,但是同時它會盡可能地嘗試從協議的輸出中窺探傳送者
的資訊。假設
發給
的資訊是
,
,
想要去暴力碰撞
,我們可以發現:
其中,只有
對
來說是未知的。如果要保證安全,我們需要讓
的漢明重量大於
,這樣的情況下,
需要至少猜測出
中的
位,才能完成碰撞攻擊。
是一個安全引數,
的值越大,攻擊者就越難完成攻擊。一般來說,
的值需要至少大於等於128。
我們知道隨機編碼
的輸出長度是
,要使
的漢明重量大於
,就需要
。根據文章[1]的結論,只要
,就能保證
的漢明重量小於
的機率是可以忽略的。具體的證明這裡不做介紹,感興趣的讀者,可以自行檢視論文。
在隱私集合求交中的應用
回到隱私集合求交上,我們使用這種改進過的不經意偽隨機函式,可以大大提升演算法的效率。
上一篇文章中,已經介紹瞭如何使用不經意偽隨機函式來實現隱私隱私集合求交。隱私集合求交中,需要使用
,也就是
次的不經意偽隨機函式。現在,改進過的不經意偽隨機函式的開銷與輸入長度無關,是一個均攤的常數。使用改進過的不經意偽隨機函式後,隱私集合求交的漸進複雜度也就變為
了,只與需要比較的集合大小相關,與集合中元素的長度無關。
從整體上看,隱私集合求交演算法只需要進行
次
不經意傳輸,外加
次的對稱加密即可完成,其中
是個常數。我們可以將這
次不經意傳輸看作演算法的初始化階段,後續階段稱為線上階段,初始化階段的執行時間基本是固定的,線上階段的時間會隨著集合大小的增大而增大。 根據文章[1]中的試驗結果,當集合大小為
時,在內網環境下(延時0。2ms),使用改進過的不經意偽隨機函式的隱私集合求交,線上階段只需要不到4s時間,離線階段只需要600ms。與樸素的雜湊方法相比,樸素雜湊方法的執行時間在700ms左右。可以看出,這種方法的速度是很快的。
結論
綜上所述,我們使用固定次數的
不經意傳輸,外加對稱加密,就可以實現隱私求交演算法了。這樣實現的隱私求交演算法,速度是很快的,即使和樸素的雜湊方法相比,也不會很慢。演算法的傳輸量是
,
是傳送者的集合大小,因此更加適合參與雙方進行比較的集合大小相差不大的情況。
本文只介紹了演算法的大致思路,如果需要詳細的瞭解,推薦閱讀原文章[1]。同時,原文章還有對應的開原始碼,可以作為參考:
https://github.com/osu-crypto/BaRK-OPRF
參考文獻:
[1] Kolesnikov V, Kumaresan R, Rosulek M, et al。 Efficient batched oblivious PRF with applications to private set intersection[C]//Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security。 2016: 818-829。
[2] Ishai Y, Kilian J, Nissim K, et al。 Extending oblivious transfers efficiently[C]//Annual International Cryptology Conference。 Springer, Berlin, Heidelberg, 2003: 145-161。
本文經「原本」原創認證,作者一個洋蔥,點選“閱讀原文”或訪問yuanben。io查詢【3GTCHEIO】獲取授權