什么是同態加密
早在1978年,Ron Rivest, Leonard Adleman, 以及Michael L. Dertouzos就以銀行為應用背景提出了同態加密(Homomorphic Encryption)這個概念。在這個概念中,允許對密文進行特定的代數運算后依然能得到加密的結果,將該結果解密以后的結果與對明文進行同樣運算的結果會保持一致。
具體的定義如下,假設存在明文m
,加密函數E
,解密函數D
,密文c
,則有
c = E(m)
m = D(c)
假設現在需要對明文m
做一些處理,處理過程可以用函數f
表示,如果存在下面關系
f(m) = D(f(c))
則稱加密算法為同態加密算法。
用途
上面的一些公式究竟有什么用?下面我們來假設一個場景。某小銀行A
有一批交易私密的數據處理,比如說要提取用戶交易信息給用戶畫像進行相應的理財產品推薦之類,定義了特征提取方法函數F
,但計算量很大,A
并不想投太多錢在基礎建設上,而是想使用廉價的云計算服務。這個業務有幾個特征:
- 需要處理的數據是私密數據
- 處理函數特別耗計算力
- 銀行
A
不是土豪,并不愿意投太多錢到機器和運維費用上。
而使用其他公司提供的云計算平臺就會存在服務不可信的問題,這時候同態加密就開始發揮威力了。
從圖中可以看到引入同態加密之后,云計算平臺拿到加密數據,處理完的數據其實也是加密數據,這樣很好地防止云計算平臺獲取到原始私密數據,同時保證在傳輸過程中就算給攔截攔截者也無法看到原始數據和處理結果。從圖中可以看到,同態計算方式流程中,由云計算平臺返回的處理結果cr
,通過解密后D(cr)
得到的結果r
與原始數據m
直接經過F(m)
得到的結果一致。
實際上這個方案有一個難點,就是選擇的同態算法是否支持任意處理函數F
。其實按支持力度算法可分成兩類,支持任意處理函數F
的同態加密算法被稱為全同態加密算法(Fully Homomorphic Encryption),而只支持特定函數F
的就是微同態加密算法(Somewhat Homomorphic Encryption)。第一個全同態算法由Craig Gentry在2009年提出,但由于復雜度太高,暫時無法商用。
所以,同態加密在這個場景中只是理論可行,畢竟不能支持任意處理函數F
能支持的應用場景比較有限。
匿名投票系統設計
實際在我們生活上,有很多場景只需要特定的處理函數F
既可,比如匿名投票系統。在介紹匿名投票系統之前,先稍微深入了解微同態加密算法。
微同態加密算法表示該算法至少滿足以下幾個條件中一個:
- 加法同態
- 乘法同態
- 減法同態
- 除法同態
比如說我們經常用到的RSA算法就是乘法同態,而在投票系統中,由于票數統計都是加法累加,只要找到具備加法同態的算法既可,比如Paillier算法,有興趣自行搜索一下,這里講一下Paillier算法的同態等式
D(E(m1,r1)*E(m2,r2) mod n^2) = m1+m2 mod n
其中m1
和m2
是原文,r1
和r2
是算法的隨機因子(主要是為了針對同樣的明文加密出來的不同密文),n
是算法所選擇出來的兩個大素數的乘積。
為了最簡要說明同態算法使用,我們簡化匿名投票系統的模型,模型定義如下
- 只兩個候選人
Bertrand
和Lynn
- 只兩個投票者
Obama
和Cliton
,兩者有算法公鑰,他們都是有身份的人,可以保證只投一票。 - 一個記票人
Satan
,他可能是個壞蛋,但需要他運行處理算法進行記票。 - 一個公布結果人
Athena
,她有算法私鑰
投票流程如下所示:
其中投票原文m1如下所示:
{
"Bertrand": 1,
"Lynn": 0
}
表示Obama
投了Bertrand
一票,投票密文cm1可能如下所示:
{
"Bertrand": 1283192381..., //一個很大的整數
"Lynn": 23432423... //也是一個很大的整數
}
Satan
拿到兩個投票密文后需要統計票數,比如說統計Bertrand
的票數,他需要把兩個投票密文Bertrand
對應的票數相乘(根據上面Paillier同態等式)來獲取票數,但實際上他并不知道Obama
是否投了Bertrand
一票。
而Athena
拿到的加密票數可能如下所示:
{
"Bertrand": 89812371293..., //一個很大的整數
"Lynn": 218308213... //也是一個很大的整數
}
使用解密算法解密后就可以得到最終結果
{
"Bertrand": 1,
"Lynn": 1
}
至于Bertrand
的那一票是誰投的,只有投票人知道了。