非對稱加密演算法
RSA
RSA 演算法基礎
- 尤拉函式:任意給定正整數 n,在小於等於 n 的正整數中,有多少個數與 n 構成互質關係?計算這些值的方法叫做尤拉函式,以 \(\varphi(n)\) 表示。
- 尤拉定理:如果兩個正整數 a 和 n 互質,則 n 的尤拉函式可以讓下面的等式成立:
也就是說,a 的 \(\varphi(n)\) 次方被 n 除的餘數為 1,或者說,a 的 \(\varphi(n)\) 次方減去 1,可以被 n 整除。
- 費馬小定理:是尤拉定理的一個特殊情況,假設正整數 a 和質數 n 互質,因為質數 n 的 \(\varphi(n)\) 等於 n-1,則尤拉定理可以寫成下面的公式:
- 尤拉函式之積:如果 n 可以分解成兩個互質的整數之積,即 \(n = p_1 \times p_2\),則積的尤拉函式等於各個因子的尤拉函式之積
- 模反元素:如果兩個正整數 a 和 n 互質,那麼一定可以找到整數 b(a 的模反元素),使得 \(ab-1\) 被 n 整除:
顯然,模反元素不止一個,而尤拉定理可以用來證明模反元素必然存在:
\(\begin{equation} a^{\varphi(n)}=a \times a^{\varphi(n)-1} \equiv 1(\bmod n) \end{equation}\)
金鑰生成
RSA 演算法的安全性基於兩個大素數的乘積難以分解回原來的素數!
- 隨機選擇兩個不相等的質數 p 和 q,比如 61 和 53,實際應用中,這兩個質數越大,就越難破解
- 計算 p 和 q 的乘積 n
- 計算 n 的尤拉函式 \(\varphi(n)\):\(\varphi(n)=\varphi(p \times q)=\varphi(p) \times \varphi(q) = (p-1) \times (q-1)\)
- 隨機選擇一個整數 e,選擇條件是 \(1 < e < \varphi(n)\),且 e 和 \(\varphi(n)\) 互質
- 計算 e 對於 \(\varphi(n)\) 的模反元素 d: \(ed \equiv 1(\bmod \varphi(n))\),這個式子等價於 \(ed - 1= k \times \varphi(n)\) (可以將 d 和 k 視為 x 和 y)
- 將 n 和 e 封裝成公鑰,n 和 d 封裝成私鑰
注意,公鑰中包含 n,如果攻擊者能夠根據 n 反推出 p 和 q,就能計算出私鑰,可以看出,RSA 的安全性是基於大整數因素分解及其困難這一假設。目前,大整數因數分解除了暴力破解,沒有很好的解決方案。
加密與解密
- 加密:生成公私鑰之後,我們就可以進行加密計算了,加密計算公式為:\(m^e \equiv c(\bmod n)\),其中 m 就是要加密的資訊,c 就是計算生成的密文。
- 解密:解密使用計算公式:\(c^d \equiv m(\bmod n)\)
為什麼用私鑰解密就一定可以得到 m 呢?根據加密公式可知:\(c = m^e - kn\),將 c 代入解密公式可得 \(\left(m^e-k n\right)^d \equiv m(\bmod n)\),等同於求證 \(m^{e d}{\equiv m}(\bmod n)\),證明過程有點複雜,這裡先略過。
基於 RSA 演算法的盲簽名
盲簽名是一種在不讓簽名者獲取所簽署訊息具體內容的情況下進行數字簽名的技術。盲簽名允許擁有訊息的一方先將訊息盲化,而後讓簽名者對盲化的訊息進行簽名,最後訊息擁有者對簽字除去盲因子,得到簽名者關於原訊息的簽名。
盲簽名的一個通俗的解釋是:Alice 想讓 Bob 在一張信件上簽名,但是不想讓 Bob 看到信件上面所寫的字。於是,Alice 在信件上面放了一張複寫紙,然後將信件和複寫紙放到了信封中交給 Bob。Bob 在拿到信封之後直接在信封上面簽字,這樣字跡就透過複寫紙寫到了信件上。Alice 拿到信封之後就可以得到 Bob 簽過字的信件。
基於 RSA 演算法可以實現盲簽名,假設 Alice 要讓 Bob 對訊息 \(m\) 進行盲簽名,Bob 擁有私鑰對 \((n, d)\) ,並共享了公鑰對 \((n, e)\) ,其具體實現步驟如下:
- Alice 選取與 \(n\) 互質的盲因子 \(k\),然後計算 \(t=m k^e(\bmod n)\) ,並把 \(t\) 傳送給 Bob。
- Bob 對 \(t\) 進行簽名,即計算 \(t^d \equiv\left(m k^e\right)^d(\bmod n)\),並把計算結果傳送給 Alice。
- Alice 計算盲因子 \(k\) 的逆元 \(k^{-1}\) ,並計算 \(s \equiv k^{-1} t^d(\bmod n)\),根據費馬小定理,可得 \(t^d \equiv\left(m k^e\right)^d \equiv m^d k^{e d-1} k \equiv m^d k(\bmod n)\) ,進而可得 \(s \equiv k^{-1} m^d k \equiv m^d(\bmod n)\) 。
最終 Alice 獲得了 Bob 的簽名,但 Bob 並不知曉所簽名的訊息 \(m\) 的具體內容,即 Alice 獲得了 Bob 的盲簽名。
不經意傳輸(Oblivious Transfer)
公鑰密碼系統主要依賴三大數學難題:大整數因子分解難題、離散對數難題、橢圓曲線上的離散對數難題
詳見 公鑰金鑰系統依賴的三大數學難題
也稱茫然傳輸,提出了一種在資料傳輸與互動過程中保護隱私的思路。在不經意傳輸協議中,資料傳送方同時傳送多個訊息,而接收方僅獲取其中之一。 傳送方無法判斷接收方獲取了具體哪個訊息,接收方也對其他訊息的內容一無所知。
二選一不經意傳輸:Alice 每次傳送兩條資訊 \((m_1, m_2)\) 給 Bob,Bob 提供一個輸入,並根據輸入獲得輸出資訊,並根據輸出獲得輸出資訊,在協議結束後,Bob 得到了自己想要的那條資訊,而 Ailce 並不知道 Bob 最終得到的是哪條。
基於 RSA 加密演算法:大數因數分解難題
大數因數分解難題涉及將一個大的合數分解為其素數因子。
下面來看一種基於 RSA 加密演算法的不經意傳輸協議的實現方式:
假設傳送者 Alice 有 N 個電話號碼 \(m_1, ..., m_N\),接受者 Bob 只能從中選取一個,但又不想讓 Alice 知道他拿了哪一個號碼。
- 傳送者 Alice 生成一對 RSA 公私鑰,並將公鑰 (n, e) 傳送給接受者 Bob
- Alice 方生成 N 個隨機數 \(X_1, ..., X_N\),將它們傳送給接收者 Bob
- Bob 方生成一個隨機數 k 以及一個編號標識 b(也就是 Bob 選擇了第 b 個電話號碼),b 是 Bob 需要保密的資訊
- Bob 方用接受到的公鑰加密 k,同時用自己選中的 \(X_b\) 盲化後傳送給 Alice:\(v = X_b+\left(k^e\right) \bmod n\)
- Alice 方並不知道 Bob 方究竟選擇了哪個,她將 \(X_0, ..., X_N\) 中每個資料都拿去解密,獲得了 \(k_0, ..., k_N\) 個解密結果:\(k_t=\left(v-X_t\right)^d \bmod n\)。顯然,這 N 個結果中只有 \(k_b = k\)
- Alice 方對 N 個解密結果分別加上真實要傳送的資訊後傳送給 Bob:\(m_t^{\prime}=m_t+k_t\),$m_t $ 是 Alice 需要保密的資訊
- Bob 方根據自己選中的訊息編號,只需要對第 b 個訊息解密就可以獲得自己選中的電話號碼。對於其他訊息,Bob 即使去解密也只能獲得一個沒有意義的隨機值,而 Alice 方始終無法獲知 Bob 究竟拿到了哪一個號碼:\(m_b=m_b{ }^{\prime}-k\)
為便於理解,第四步和第五步的公式也可寫為:
第四步:\(v = X_b+ \text{Encryption}(k)\)
第五步:\(k_t=\text{Decryption}(v-X_t)\),其中 \(k_b=\text{Decryption}(X_b+ \text{Encryption}(k)-X_b)= k\)
另一種類似的方式如下:將 Alice 方生成的 N 個隨機數換成 N 對 RSA 公私鑰
上圖中同時使用 RSA 和 AES 對資料進行加解密,兩者的區別如下:
RSA | AES | |
---|---|---|
型別 | 一種非對稱加密演算法,公鑰用於加密,私鑰用於解密 | 一種對稱加密演算法,使用相同的金鑰來進行加密和解密 |
用途 | RSA 常用於加密小塊資料,如數字簽名、金鑰交換等。由於非對稱加密的計算開銷較大,因此 RSA 一般用於加密小資料或者加密對稱加密演算法(如 AES)中的金鑰 | AES 通常用於加密大量資料,如檔案、通訊資料等。對稱加密演算法具有較高的加密和解密速度,因此適合處理大量資料的加密工作 |
加密速度 | RSA 基於大整數的運算,其加密和解密過程較為耗時 | AES 的加解密過程基於固定長度的資料塊和金鑰,因此可以使用高度最佳化的演算法和硬體實現 |
金鑰長度 | RSA 的安全性依賴於大整數的因數分解問題,因此需要較長的金鑰長度來保證足夠的安全性。通常,RSA 金鑰長度為 1024 位或更長 | AES 的安全性主要依賴於金鑰長度,一般使用 128 位、192 位或 256 位的金鑰。較長的金鑰長度通常提供更高的安全性,但也增加了加密和解密的計算開銷。 |
基於有限域的公鑰運算:有限域的離散對數難題(DLP 問題)
大數離散對數難題涉及在一個大的有限群中找到離散對數的難度。
基於離散對數實現 2 選 1 的 OT 協議執行過程如下圖所示:
基於離散對數實現 n 選 1 的 OT 協議執行過程如下圖所示:https://blog.nsfocus.net/ot-1/
基於橢圓曲線的公鑰運算:橢圓曲線的離散對數難題(ECDLP)
關於橢圓曲線密碼學的知識點,請參考:公鑰密碼學依賴的三大數學難題
序號 | Sender | Share | Receiver |
---|---|---|---|
目標 | 輸入:\((m_0, m1)\) 輸出:\(Non\) | 輸入:選擇位元 b輸出:\(m_b\) | |
1 | 生成隨機的 ECC 金鑰對 \((s\_sk, s\_pk)\)\(s\_pk\) 由 \(s\_sk\) 和基點 G 相乘得到 | Sender 將 \(s\_pk\) 傳送給 Receiver \(\to\) |
接收 \(s\_pk\), 從 \(s\_pk\) 中提取橢圓曲線資訊,生成新的 ECC 金鑰對 \((r\_sk, r\_pk)\) |
2 | \(ck_0 = new\_pk * s\_sk \\ ck_1 = (new\_pk-s\_pk) * s\_sk\) | Receiver 將 \(new\_pk\) 傳送給 Sender \(\leftarrow\) |
$if b=0, new_pk = r_pk\ if b=1, new_pk = r_pk + s_pk $ |
3 | \(cipher\_m_0 = Enc(ck_0, m_0)\\ cipher\_m_1 = Enc(ck_1, m_1)\) | Sender 將加密後的 \((m_0, m1)\) 傳送給 Receiver \(\to\) |
計算 \(ck = s\_pk * r\_sk\)\(Dec(ck, cipher\_m_b)\),即 \(m_b\) |
證明過程如下:在第二步中
因此有:\(ck_b = r\_pk * s\_sk\),由 ECDH 金鑰交換協議知:\(ck_b = r\_pk * s\_sk = s\_pk * r\_sk = ck\)
布隆過濾器(Bloom Filter)
布隆過濾器是由一個固定大小的二進位制向量或者點陣圖(Bitmap)和一系列對映函式組成的。在初始狀態時,對於長度為 m 的位陣列,它的所有位都被置為 0,如下圖所示:
當有變數被加入集合時,透過 k 個對映函式將這個變數對映成點陣圖中的 k 個點,把它們置為 1。
查詢某個資料的時候,只要看這些點是不是都是 1 就可以大機率知道集合中是否包含該資料了:如果這些點中有任何一個是 0,被查詢變數一定不在,如果都是 1,被查詢變數很可能存在。
為什麼是可能存在,而不是一定存在呢?因為對映函式本身就是雜湊函式,雜湊函式會有碰撞。
可以看出,布隆過濾器在空間和時間方面都有巨大的優勢:
- 布隆過濾器儲存空間和插入、查詢時間都是常數
- 雜湊函式相互之間沒有關係,方便並行實現
- 布隆過濾器不需要儲存元素本身,在某些對保密要求非常嚴格的場合有優勢
混淆電路(Grable Circuit)
“百萬富翁”問題:加密學問題
假設有兩個百萬富翁,他們都想知道誰更富有,但他們都想保護好自己的隱私,都不願意讓對方或者任何第三方知道自己真正擁有多少財富。那麼,如何在保護好雙方隱私的情況下,計算出誰更有錢呢?
使用一個更加專業的說法:一組互不信任的參與方在需要保護隱私資訊以及沒有可信第三方的前提下進行協同計算的問題。
混淆電路(GC):一種將計算任務轉化為布林電路並對真值表進行加密打亂等混淆操作以保護輸入隱私的思路。利用計算機程式設計將目標函式轉化為布林電路後,對每一個輸出的真值進行加密,參與方之間在互相不掌握對方私有資料的情況下共同完成計算。
可計算問題可以轉換為一個個電路,CPU 就是由加法電路、比較電路和乘法電路等組合而成的。一個電路由一個個邏輯閘組成,比如與門、非門、或門、與非門等。每個邏輯閘都有輸入端和輸出端。
在經典的混淆電路中,加密和擾亂是以門為單位的,每個門都有一張真值表,下圖展示了與門的真值表:
不妨認為倆個富翁 Alice 和 Bob 的財富是用二進位制表示的一個整數:
- Alice 方的財富值用 a 表示:\(a=a_4 a_3 a_2 a_1 a_0=01101\)
- Bob 方的財富用 b 表示:\(b=b_4 b_3 b_2 b_1 b_0=10100\)
下面以與門為例來說明混淆電路的工作原理,介紹如何使用混淆電路實現對 a 和 b 的與操作。
- Alice 方首先對與門的每根輸入線(a 和 b)生成兩個隨機的標籤來分別對應 0 和 1,其中,標籤的位元位長度是 k,其取值是演算法的安全引數,一般可以設為 128。
- Alice 方將與門真值表中的 0 和 1 替換成對應的標籤,如下表所示:
- Alice 方將真值表輸入線上的標籤作為加密金鑰對真值表輸出線標籤,並使用對稱加密演算法進行加密:
- Alice 方將真值表上的行順序打亂,這樣其他人就無法根據標籤值知曉其對應真值表上的哪一行:
- 假設 \(a=a_4 a_3 a_2 a_1 a_0=01101\),Alice 對 5 個位元位都生成混淆後的與門真值表,並將它們傳送給 Bob,下表展示了針對第 0 位位元生成的經混淆後的與門真值表,Bob 需要輸入線上的標籤值才能根據真值表進行計算,因此 Alice 方把值 a 的每個位元位對應的標籤傳送給 Bob:\(x_0^{a_4} 、 x_1^{a_3} 、x_1^{a_2}、 x_0^{a_1} 、 x_1^{a_0}\),因為標籤值是隨機生成的,因此 Bob 方無法從中獲得任何資訊。
- 真值表計算除了需要輸入線上 a 的值,還需要輸入線上 b 的值。但是,輸入線 b 對應的標籤都是由 Alice 方產生的,為此 Bob 需要從 Alice 處獲取。假設 \(b=b_4 b_3 b_2 b_1 b_0=10100\),對於第 0 個位元位 \(b_0 = 0\),Bob 使用不經意傳輸協議,就可以從 Alice 處獲取對應的標籤 \(x_0^{b_0}\)。根據不經意傳輸協議,Bob 是無法獲知 \(x_1^{b_0}\) 值的,Alice 也無法知曉 Bob 究竟獲取了哪個標籤。Bob 對每個位元位需使用不經意傳輸協議獲取對應的標籤值:\(x_1^{b_4} 、 x_0^{b_3} 、 x_1^{b_2} 、 x_0^{b_1} 、 x_0^{b_0}\)。
- 對於獲取到的標籤值,Bob 透過遍歷從 Alice 處獲得的對應的混淆後的與門真值表的每一行來嘗試解密。比如針對第 0 位,對真值表中的每一行,Bob 嘗試用 $x_1^{a_0} 、 x_0^{b_0} $ 去解密,直到解密成功,對每個位元位解密後,Bob 就可以獲得 \(x_0^{c_4} 、 x_0^{c_3} 、 x_1^{c_2} 、 x_0^{c_1} 、 x_0^{c_0}\)。
- Bob 將解密獲得的 \(x_0^{c_4} 、 x_0^{c_3} 、 x_1^{c_2} 、 x_0^{c_1} 、 x_0^{c_0}\) 傳送給 Alice,Alice 就可以根據自己生成標籤時的對應關係恢復出計算結果 00100,而這個結果正是 a 和 b 執行與操作的計算結果。
至此,Alice 與 Bob 在保護好各自資料的前提下完成了與操作。
兩個數的比較操作可以透過多個異或門和與門來實現。
我們定義變數 \(c_i\):
以及其初始值 \(c_1=0\) 。在已知 \(a_i, b_i, c_i\) 的情況下, \(c_{i+1}\) 可以做如下推導:
注意:上述的混淆電路屬於半誠實模型,電路本身還有很多最佳化空間。
秘密共享(Secret Sharing)
指將一個秘密分發給一組參與方,每個參與方只獲取這個秘密的一部分,這樣一個或少數幾個引數方無法還原出原始資料(秘密),只有滿足一定數量的參與方把各自的資料湊在一起,才能還原出真實資料。計算時,各參與方直接用它自己的本地資料進行計算,並且在適當的時候交換一些資料(交換的資料本身看起來也是隨機的,不包含原始資訊)。計算結束後,結果仍以秘密共享的方式分散在各參與方那裡,並在使用方最終需要結果時將某些資料合起來。透過這種方式,秘密共享技術保證了計算過程中各個參與方看到的都是一些隨機數,但最後仍得到了想要的結果。
秘密共享方案的三種實現技術:
- 有限域上的運算:基於超平面幾何的秘密共享,包括 Blakley 方案和 Brickell 方案;
- 有限域上的運算:基於插值多項式的秘密共享,包括經典的 Shamir 閾值秘密共享方案;
- 環上的運算:Mignotte,Asmuth & Bloom 提出的基於中國剩餘定理的秘密共享;
Shamir 門限秘密共享方案流程
- 將秘密資訊 s 拆成 n 份,每個參與方獲得一份,每一份被稱作一個 Share。每個參與者秘密地儲存好自己的 Share。
- 拆分時,預先設定至少 t (t <= n) 個參與者聚到一起才可以恢復 s。
- 需要恢復 s 時,至少有 t 個參與者聚到一起,他們拿出各自的 Share,透過計算恢復出 s。
Shamir 門限秘密共享方案原理
Shamir 門限秘密共享方案的實現原理是對於任意一個 \(t-1\) 次多項式函式,只需要獲取其多項式曲線上的 t 個點就可以透過多項式插值(比如拉格朗日插值法)確定該多項式函式。而 Blakley 的解決方案基本思想是利用多維空間中的點:將共享的秘密看成 t 維空間中的一個點,每個子秘密為包含這個點的 \(t-1\) 維超平面的方程,構造 n 個這樣的平面分發給 n 個參與方,任意 t 個 \(t-1\) 維超平面的交點剛好確定共享的秘密,而 \(t-1\) 個子秘密,即 \(t-1\) 個 \(t-1\) 維超平面僅能確定其交線,得不到共享秘密的任何資訊。
針對下面這個多項式函式,我們具體介紹一下秘密分發的過程:
p 是一個大素數,其中 \(f(0)=a_0=s\)(s 是需要保護的秘密),且 \(s < p\),具體過程如下:
- 秘密擁有者秘密隨機生成 \(t-1\) 個小於 \(p\) 的隨機數 \(a_1, a_2, \ldots, a_{t-1}\) ,並隨機選取 \(n\) 個互不相同的整數 \(x_1, x_2, \ldots, x_n\) 。
- 將 \(n\) 個整數代入多項式函式,計算得到 \(n\) 個值 \(s_1=f\left(x_1\right), s_2=f\left(x_2\right), \ldots, s_n=f\left(x_n\right)\) 。
- 將計算得到的 \(n\) 個值分別分發給 \(n\) 個參與方,即第 \(i\) 個參與方獲得 \(\left(x_i, s_i\right)\) (作為該參與方需要嚴格保守的秘密)。
- 銷燬 \(f(x)\) 。根據多項式函式的性質,少於 \(t\) 個參與方都無法恢復出這個多項式函式。而大於等於 $$ 個參與者透過其子秘密 \(s_i\) 和 \(x_i\) 透過拉格朗日插值定理可以恢復上面多項式 \(f(x)\),並且令 \(x=\) 實現秘密 s 的重構:
拉格朗日插值定理:透過給定的一組資料點,可以構造出一個多項式,該多項式透過這些點。
接下來以 \((3,4)\) -門限例項來說明 \(t\) 個參與方如何恢復秘密,這裡假設秘密 \(s=2\), \(p=23\),構造的 \(f(x)\) 如下:
根據函式可知,這裡 \(t\) 的取值為 3,另取 \(x_1=1 , x_2=2 , x_3=3 , x_4=4\),代入函式得 \(f(1)=7 , f(2)=16 , f(3)=6 , f(4)=0\) 。 隨機選取其中 3 組資料 \((1,7) 、(3,6) 、(4,0)\) ,並使用拉格朗日插值公式進行恢復 :
經過上述計算,成功恢復出秘密 \(s\) 為 2 。
參考:秘密共享 — 隱私計算和區塊鏈共識中的榫卯
透過秘密共享實現隱私計算的原理
如何利用秘密共享進行隱私計算呢?這裡以 (2, 2)-門限的加法為例,假設 Alice 和 Bob 為輸入方,Alice 擁有隱私輸入 a,Bob 擁有隱私輸入 b,Uzer 為結果使用方,設計兩個計算方 CP1 和 CP2,計算過程如下:
再以乘法為例:
$$ \begin{equation} c 1+c 2+c 3+c 4=a 1 \times b 1+a 2 \times b 2+a 1 \times b 2+a 2 \times b 1=(a 1+a 2) \times(b 1+b 2)=a \times b \end{equation} $$同態加密(Homomorphic Encryption)
HE 是一種特殊的加密方法,它允許直接對加密資料執行計算,如加法和乘法,而計算過程不會洩露原文的任何資訊。計算的結果仍然是加密的,擁有金鑰的使用者對處理過的密文資料進行解密後,得到的正好是處理後原文的結果。
根據支援的計算型別和支援程度,同態加密可以分為以下三種型別:
- 半同態加密(Partially Homomorphic Encryption, PHE):只支援加法或乘法中的一種運算。其中,只支援加法運算的又叫加法同態加密(Additive Homomorphic Encryption, AHE);
- 部分同態加密(Somewhat Homomorphic Encryption, SWHE):可同時支援加法和乘法運算,但支援的計算次數有限;
- 全同態加密(Fully Homomorphic Encryption, FHE):支援任意次的加法和乘法運算。
同態加密具有如下的特點:
- 計算複雜度小,通訊量高,通訊輪次少的特點
- 適合密文一次部署,多次計算的場景,大幅減少通訊量
差分隱私(Differential Privacy)
差分隱私旨在提供一種當從統計資料庫查詢時,在保證查詢結果一定精度的同時最大限度減少識別出某個樣本的可能性。差分隱私的目的是用來對抗差分攻擊,通常其應用場景是統計查詢。
核心思想
這裡以一個直觀的例子來說明差分隱私的原理。
假設資料集 D 包含 Alice 的記錄,而資料集 D' 中 Alice 的記錄被替換為 Bob 的記錄,其他記錄與資料集 D 完全一致。假設從 D 和 D' 兩個資料集中隨機挑選一個資料集並提取一些資訊 O 給到攻擊者,如果攻擊者無法識別這些資訊是從哪個資料集中提取出來的,那麼可以認為所釋出的資訊保護了 Alice 的隱私。差分隱私要求任何被髮布的資訊都應當與資訊 O 類似,確保攻擊者無法識別出任何具體的資料記錄。
差分隱私技術的核心思想是對於任意兩個相差一條記錄的資料集 D 和 D',以及任意輸出 O,要求新增了隨機繞動的查詢機制 M(一般是一些統計資訊的查詢,比如均值、方差)都能滿足:
其中 P 是透過查詢機制 M 獲得輸出 O 的機率,這意味著在資料集 D 中一條資料發生變化後透過 M 得到 O 的機率的變化會非常小,機率 P 的變化範圍由公式中的 \(\epsilon\) 決定,這是稱查詢機制 M 滿足 \(\epsilon\) 差分隱私。
直白一點來說,如果能設計一種演算法,讓攻擊者在查詢 100 條資訊和去掉任意一條資訊的其他 99 條資訊時,獲得相同值的機率非常接近,攻擊者就沒辦法確定第 100 條資訊了,這樣我們就說第 100 條資訊對應的個體得到了隱私保護。這樣的演算法就是差分隱私演算法。差分隱私其實是一個框架,一個用於評估保護隱私的查詢機制(演算法)的框架。
差分隱私具有如下的特點:
- 計算和通訊新能與直接明文計算幾乎無區別
- 安全性以及精度損失由加的噪聲決定
分類
根據原始資料的儲存位置劃分,差分隱私分為中心化差分隱私和本地化差分隱私:
- 中心化差分隱私:實現加入很小的噪聲保護資料集中所有使用者的隱私,但是需要所有使用者將未經處理的原始資料直接儲存在一個可信伺服器上
- 本地化差分隱私:允許使用者在本地隨機化原始資料後再傳送給伺服器,使得使用者得到了更強的隱私保護,但這一過程加入的噪聲遠大於全域性差分隱私。注意,蘋果公司在 ios 輸入法中使用的差分隱私技術就屬於此類。
經典演算法
拉普拉斯機制
差分攻擊:攻擊者透過比較多次查詢獲得的不同結果來推算出部分原始明文資料。
差分隱私是如何進行隱私資訊的保護,防止差分攻擊呢?
差分隱私通常的做法是在查詢結果中引入噪聲。
對於數值型的查詢結果,常用的方法是在查詢結果中加入服從拉普拉斯分佈的噪聲,這種方法被稱為拉普拉斯機制。
拉普拉斯分佈的機率密度函式為:\(p d f(x)=\frac{1}{2 \lambda} \mathrm{e}^{\left(-\frac{|x|}{\lambda}\right)}\)
橫軸表示隨機變數,縱軸表示相對應的機率密度,那麼對於資料庫查詢:select count(*) from D where type=“AIDS”,可以在查詢結果中加入一個服從拉普拉斯分佈的噪聲(加入噪聲後的查詢結果將具備一定的隨機性)。
根據差分隱私的理論,加入的噪聲引數滿足 \(\lambda = 1/\epsilon\),即能滿足 ε-差分隱私。
隨機化回答機制
如果要釋出的資料不是數值型,那麼需要用其他方法引入噪聲。這裡介紹一種用於資料採集的簡單機制:隨機化回答。
舉例來說,假設一個小夥想在網際網路上問一個敏感的是非題,比如“大家認為我和我的女朋友是否般配”。由於問題比較敏感,有些網友可能會不願意給出真實的答案,這對結果統計可能沒有什麼意義。為了解決這個問題,如圖 7-7 所示,我們可以讓每個人在他的答案中加入隨機噪聲。
- 假設他的真實答案是“是”,擲一次骰子,如果擲出來的是 1,就回答真實答案是;如果擲出來是 2~6,就以投硬幣的方式回答是或者否。
- 假設他的真實答案是“否”,也擲一次骰子,如果擲出來的是 1,就回答真實答案否;如果擲出來是 2~6,就以投硬幣的方式回答是或者否。由於回答存在隨機性,因此攻擊者並不能從一個回答者的答案中反推出他的真實答案。只要根據 ε 來調整隨機化的機率,即可滿足 ε-差分隱私。
如何從隨機化回答中獲得統計資訊呢?假設有 60 000 人按上面的規則進行了回覆,其中有 28 000 個是,32 000 個否。可知,每個人以 5/6 的機率給的是假回覆,即約有 50 000 人給出假回覆,其中約有 25 000 個假是和 25 000 個假否。據此可以推算出來剩下的真實回覆里約有 3000 個是和 7000 個否,即約有 70% 的人的答案為否。
零知識證明(Zero-Knowledge Proof,ZKP)
ZKP 指的是證明者能夠在不向驗證者提供任何有用資訊的情況下,使驗證者相信某個論斷是正確的,允許證明者(Prover)、驗證者(Verifier)證明某項提議的真實,卻不必洩漏除了“提議是真實的”之外的任何資訊。
互動式零知識證明
以數獨遊戲為例來展開介紹零知識證明。假設有兩個人 Vicky 和 Patty,有一天,Patty 告訴 Vicky 自己花了半天時間解出了一道極難的數獨遊戲題,而喜歡挑戰的 Vicky 自然也想嘗試一下。但他又擔心 Patty 是在拿無解的數獨題目來開玩笑,希望 Patty 能證明題目有解。顯然,如果 Patty 直接告訴 Vicky 答案,Vicky 也就無法自己獨立完成題目,從而無法享受遊戲的樂趣了。為此,兩人設計了一種證明方案,方案分為以下幾個階段。
承諾階段
首先,Patty 將寫有答案的數獨盤面按數字剪成小紙片,並按照原順序擺放在桌子上,且題目中的原有數字正面朝上,答案部分正面朝下:
挑戰階段
Vicky 可以選擇按行、列或者九宮格的方式要求 Patty 證明。比如 Vicky 選擇按列方式挑戰。
回應挑戰階段
Patty 將桌面上每一列的 9 張紙片裝入一個盒子,並且打亂紙片順序進行混淆,然後將所有盒子交給 Vicky,作為挑戰的回應。
驗證階段
Vicky 開啟盒子驗證每個盒子裡的 9 張紙片剛好是 1~9 這 9 個數字。這也意味著 Patty 在承諾階段做出的承諾滿足“每列 1~9 都出現並且只出現一次”這一要求,同時在一定程度上說明 Patty 做出的承諾很可能是題目的答案(因為在做出承諾的時候並不知道 Vicky 會選擇哪種方式進行驗證,隨意給出的數字難以透過驗證)。
重複階段
儘管一次驗證成功能在一定程度上說明 Patty 做出的承諾很可能是題目的答案。但是,Vicky 無法確信,因為存在 1/3 的機率 Patty 恰巧事先猜對了 Vicky 會選擇按列進行驗證,然後給出的承諾僅僅滿足列的要求,不滿足行的要求和九宮格的要求。因此 Vicky 可以要求再試幾次,直到自己確信為止。
非互動式零知識證明
互動式零知識證明存在種種缺陷,如要求證明者時刻線上並等待挑戰,驗證者如需驗證,需要與證明者進行多次互動。
為此,Patty 發明了一個非互動式數獨零知識證明機器。該機器可以自動地隨機選擇按列、按行或者按九宮格收取紙片到盒子。Patty 為了證明自己沒有作弊,把自己開啟機器傳送出盒子的動作拍攝成影片並放到網上。這樣,Vicky 和 Tom 都可以在網上進行觀看、驗證。當然,有可能還是有人會認為機器有後門,那麼 Patty 還需要將機器是如何製造、安裝等別人可能懷疑的地方都透過影片放到網上。這一過程就可以稱為“可信任的初始設定儀式”。
不經意偽隨機函式 (Oblivious Pseudo Random Function OPRF)
核心思想
OPRF 的定義和安全性模型:OPRF 是一種兩方協議,其中一方(傳送方)持有一個偽隨機函式(PRF)的金鑰 k,另一方(接收方)持有一個輸入 x。協議的目標是讓接收方得到 PRF 在 k 和 x 上的輸出 \(f(k, x)\),而傳送方不得到任何資訊。OPRF 的安全性要求滿足正確性、單向性、隱私性和可驗證性等屬性。
OPRF 的基本構建模組:OPRF 的構造依賴於一些密碼學原語,如偽隨機函式、雙線性對映、同態加密等。偽隨機函式是一種可以用金鑰和輸入生成隨機輸出的函式,具有不可區分性和抗碰撞性等特點。雙線性對映是一種可以在兩個群之間進行對映的函式,具有可計算性和非退化性等特點。同態加密是一種可以在密文上進行運算的加密方式,具有可加性或可乘性等特點。
OPRF 的分類:根據底層 PRF 的型別可以分為四大類
- Naor-Reingold 型 OPRF:基於雙線性對映的 PRF,可以實現單向性和可驗證性。這類 OPRF 的優點是效率高,缺點是需要大量的公共引數和儲存空間。
- Dodis-Yampolskiy 型 OPRF: 基於雜湊函式和同態加密的 PRF,可以實現單向性和可擴充套件性。這類 OPRF 的優點是不需要公共引數和儲存空間,缺點是效率低。
- Hashed Diffie-Hellman 型 OPRF:基於雜湊函式和 Diffie-Hellman 協議的 PRF,可以實現單向性和可擴充套件性。這類 OPRF 的優點是效率高且安全性強,缺點是需要雙線性對映或橢圓曲線群。
- 通用型 OPRF:這類 OPRF 基於任意的 PRF,它使用一種通用的構造方法將任意的 PRF 轉化為一個 OPRF。這類 OPRF 的優點是適用範圍廣,缺點是效率低且安全性弱。
PRF 是一個確定性的函式,記為 F。我們稱 F 是定義在 (k, X, Y)上的 PRF,其中 k 是金鑰空間,X 是輸入空間,Y 是輸出空間。
它有兩個輸入,一個是金鑰 k,另一個是資料塊 \(x \in X\),輸出 \(y = F(k, x) \in Y\) 也是一個資料塊。
對於 PRF,其安全性要求:給定一個隨機產生的金鑰 k,函式 \(F(k, .)\) 應該看上去像一個定義在 X 到 Y 上的隨機函式。
隨機函式:給定集合 X 和 Y,定義在 X 到 Y 上的對映 \(f\):X \(\to\) Y,首先把所有定義在 X 到 Y 上的對映集中 i 起來,形成一個集合。這個集合裡的每個元素都是一個類似 \(f\) 這樣的對映,記為 Func[X, Y]。現在從 Func[X, Y] 中隨機選擇一個函式,這個函式就是“隨機函式”。
注意,所謂的“隨機函式”只是強調這個函式是被隨機地選擇出來的,與函式的輸出是否隨機沒有關係。
舉個例子:假設 Alice 有一些輸入,Bob 有一個 key,OPRF 允許 Alice 將自己的輸入與 Bob 的 Key 結合經過一系列運算轉變成相應的數。在這個過程中,Alice 不能知道 Bob 的 key,Bob 也不知道最後的結果 \(f(k, x)\),每一個輸入 \(x_i\) 都可以計算出一個不同於其他輸入的數,這些數可以被看作是“偽隨機數”
OPRF 在隱私保護技術中的應用
- OPRF 在隱私保護技術中的作用:可以用來實現一些隱私保護技術,如密碼認證、密碼儲存、密碼恢復、密碼搜尋、密碼交換等,這些技術可以利用 OPRF 的單向性、可驗證性和可擴充套件性等屬性來保護使用者的密碼和資料。
- OPRF 在密碼認證中的應用:可以用來實現一種安全的密碼認證協議,這種協議可以讓使用者使用自己選擇的密碼來登入一個遠端伺服器,而不需要將密碼或者其雜湊值洩露給伺服器或者其他攻擊者。這種協議可以防止字典攻擊,中間人攻擊和離線攻擊等。
- OPRF 在密碼儲存中的應用:可以用來實現一種安全的密碼儲存方案,讓使用者將自己的密碼或其他敏感資料儲存在一個雲服務處,而不需要將明文或其雜湊值洩露給雲服務商或其其他攻擊者,
- OPRF 在密碼恢復中的應用: 可以用來實現一種安全的密碼恢復機制,讓使用者在忘記自己的密碼時,透過一個可信任的第三方來恢復自己的密碼或其他敏感資料,而不需要將明文或其雜湊值洩露給第三方或其他攻擊者。
- OPRF 在密碼搜尋中的應用:可以用來實現一種安全的密碼搜尋技術,讓使用者在一個加密的資料庫中進行關鍵字搜尋,而不需要將關鍵字或其雜湊值洩漏給資料庫提供者或其他攻擊者。
- OPRF 在密碼交換中的應用:可以用來實現一種安全的密碼交換協議,如隱私求交,讓兩個使用者交換他們各自持有的一組元素(如聯絡人、喜好、歷史記錄等),而不需要將元素或其雜湊值洩漏給對方或其他攻擊者。
布穀鳥雜湊(Cuckoo Hashing)
布穀鳥的行為:關鍵設計就是“踢出”(kicks out)這個動作
- 布穀鳥媽媽從不築巢,它將自己的鳥蛋生在其他鳥類的巢穴裡,要別的鳥給它孵蛋
- 新出生的布穀鳥會本能地將巢穴裡的其他蛋踢出(kicks out)鳥巢,借巢長大
雜湊的本質是從一個較大空間對映到一個較小的空間,因此在插入資料足夠多之後,根據鴿巢原理,一定會存在位置衝突。常見的雜湊表會透過連結串列、開放地址探測等方式來處理衝突。
單桶多函式的布穀鳥雜湊,便是開放地址法處理衝突的一種雜湊表,只不過有衝突後,不是透過線性尋找新的位置,而是透過額外雜湊函式來尋找。布穀鳥雜湊利用較少計算換取了較大空間,它具有佔用空間小、查詢迅速等特性。
核心思想
- 使用兩個雜湊函式 \(h_1(x)\) 、\(h_2(x)\) 和兩個雜湊桶 \(T_1\) 和 \(T_2\)
- 插入元素 x:
- 如果 \(T_1[h_1(x)]、T_2[h_2(x)]\) 有一個為空,則插入;兩者都空,隨便選一個插入
- 如果 \(T_1[h_1(x)]、T_2[h_2(x)]\) 都滿,則隨便選擇其中一個(設為 y),將其踢出,插入 x
- 重複上述過程,插入元素 y(就是之前被踢出的倒黴蛋)
- 如果插入時,踢出次數過多,則說明雜湊桶滿了。則進行擴容,ReHash 後,再次插入
- 查詢元素 x:
- 讀取 \(T_1[h_1(x)]、T_2[h_2(x)]\) 和 x 比對即可
變種
布穀鳥雜湊可以有很多變種,比如:
- 使用兩個雜湊函式和一個雜湊桶
- 使用兩個雜湊函式和四路雜湊桶
參考資料
- OT(Oblivious Transfer,不經意傳輸)協議詳解
- 混淆電路介紹(二)邏輯電路
- 混淆電路介紹(三)混淆電路原理
- 《深入淺出隱私計算:技術解析與應用實踐》
- 安全多方計算(5):隱私集合求交方案彙總分析
- 隱私計算關鍵技術:隱私集合求交(PSI)原理介紹
- https://github.com/delta-mpc/python-psi/blob/master/README_zh.md
- OPRF 原理
- 布穀鳥雜湊和布穀鳥過濾器