文|王祖熙(花名:金九 )
螞蟻集團開發工程師\
負責螞蟻 Kubernetes 叢集容器交付專注於叢集交付能力、交付效能及交付 Trace 等相關領域
本文 3063 字 閱讀 5 分鐘
—— 資料不出域、可用不可見
01 背 景
隨著大資料與人工智慧的快速發展,個人隱私資料洩露和濫用時有發生,隱私安全問題也越來越被重視。
國家於 2020 年施行密碼法、2021 年施行個人資訊保護法,對個人隱私資料和資料安全加密有更高的要求。
因此,隱私計算也不斷地被提及和關注,源於其有優秀的資料保護作用,使得『資料不出域、可用不可見』,限定了資料的使用場景,防止了資料的洩露,而引起了業界的熱捧。
隱私計算是指在保護資料本身不對外洩露的前提下,實現資料共享和計算的技術集合,共享資料價值,而非源資料本身,實現資料可用不可見。
- 隱私計算對於個人使用者來說,有助於保障個人資訊保安;
- 對於企業來說,隱私計算是資料協作過程中履行資料保護義務的關鍵路徑;
- 對於政府來說,隱私計算實現資料價值最大化的重要支撐。
隱私計算目前在金融、醫療、電信、政務等領域均在開展應用試驗,比如:
- 銀行和金融機構
在不洩露各方原始資料的前提下,進行分散式模型訓練,可以有效降低信貸、欺詐等風險;
- 醫療機構
無需共享原始資料便可進行聯合建模和資料分析,資料使用方在不侵犯使用者隱私的情況下,可以使用建模運算結果資料,有效推動醫療行業資料高效利用。
隱私計算的相關技術有多方安全計算 (MPC) 、可信執行環境 (TEE) 、聯邦學習 (FL) 、同態加密 (HE) 、差分隱私 (DP) 、零知識證明 (ZKP) 、區塊鏈 (BC) 等等。
這些技術各有優缺點,隱私計算的產品或者平臺也是由這些技術來搭建。
其中與密碼學明顯相關的是同態加密,目前同態加密演算法的開源專案各有千秋,使用者使用比較複雜。BabaSSL 作為基礎密碼庫,應該提供一套簡單易用和高效的同態加密演算法實現和介面,讓上層應用更方便簡單地使用同態加密演算法。
此外,隨著隱私計算技術的興起,螞蟻集團推出了開箱即用、軟硬體結合的隱私計算基礎設施,一站式解決方案,即可信原生一體機。
BabaSSL 作為螞蟻可信原生一體機中的核心基礎軟體密碼庫,將同態加密等隱私計算所需的相關密碼學能力整合其中,為可信原生一體機的使用者帶來更加便捷高效的使用體驗。
02 同態加密
同態加密 (Homomorphic Encryption, HE) 是指滿足密文同態運算性質的加密演算法,按性質分為加法同態和乘法同態:
- 加法同態
- 乘法同態
同態加密後得到密文資料,對密文資料進行同態加法或者乘法得到密文結果,將密文結果同態解密後可以得到原始資料直接加法或者乘法的計算結果。
如下圖:
根據滿足加法和乘法的運算次數又分為:全同態加密和半同態加密。
- 全同態加密
( Fully Homomorphic Encryption, FHE )
1.支援任意次的加法和乘法運算
2.難實現、效能差 (金鑰過大,執行效率低,密文過大)
3.主流演算法:Gentry、BFV、BGV、CKKS
4.需要實現的介面
- 半同態加密
(Partially Homomorphic Encryption, PHE)
1.只支援加法或乘法中的一種運算,或者可同時支援有限次數的加法和乘法運算
2.原理簡單、易實現、效能好
3.主流演算法:RSA、ElGamal、Paillier
4.需要實現的介面:
(1)KeyGen(): 金鑰生成演算法,用於產生加密資料的公鑰 PK( Public Key)和私鑰 SK(Secret Key),以及一些公共引數 PP(Public Parameter)。\
(2)Encrypt(): 加密演算法,使用 PK 對使用者資料 Data 進行加密,得到密文 CT(Ciphertext)。
(3)Decrypt(): 解密演算法,使用 SK 對密文 CT 解密得到資料原文 PT(Plaintext)。
(4)Add(): 密文同態加法,輸入兩個 CT 進行同態加運算。
(5)Sub(): 密文同態減法,輸入兩個 CT 進行同態減法算。
(6)ScalaMul() 或者 Mul() :密文同態標量乘法,輸入一個 CT 和一個標量 PT,計算 CT 的標量乘結果。
EC-ElGamal 原理
ElGamal 加密演算法是基於 Diffie-Hellman 金鑰交換的非對稱加密演算法,EC-ElGamal 是 ECC 的一種,是把 ElGamal 移植到橢圓曲線上來的實現,主要計算有:橢圓曲線點加、點減、點乘、模逆和離散對數。
以下是 EC-ElGamal 的演算法原理:
- 公共引數
1.G:橢圓曲線基點\
2.SK:私鑰,SK=d
(d 是 0 到橢圓曲線的階 q 之間的隨機數)
3.PK:公鑰,PK=dG
- 加密
1.明文 m,隨機數 r
2.計算密文 C:
(3)明文 m 的取值範圍為模 order(G) 的模空間,但實際使用時 m 需限制為較小的數 (例如 32 位元長度) ,否則橢圓曲線離散對數問題 (ECDLP) 無法求解。
-解密\
1.計算 rPK:\
2.計算 mG:\
3.計算 mG 的 ECDLP,獲得明文 m。\
- 密文加法、密文減法
1.兩個密文:
2 .密文加:
對 2 個密文的 2 個 ECC 點分別做點加,共 2 個點加,公式如下:\
3.密文減:
對 2 個密文的 2 個 ECC 點分別做點減,共 2 個點減,公式如下:\
- 密文標量乘法
1.密文
2.對密文的 2 個 ECC 點分別用 ?_2 做點乘,共 2 個點乘,公式如下:
3.如上公式與明文m2m1的同態加密結果一致:
這裡 r=m2r1
03 演算法實現
介面定義
- 物件相關介面
1.上下文物件:EC_ELGAMAL_CTX,該物件用來儲存公私鑰以及一些其他內部用到的資訊,是 EC-ElGamal 演算法其他介面的第一個引數。
介面如下:
//建立 EC_ELGAMAL_CTX 物件,key 為 ECC 公鑰或者私鑰的 EC_KEY 物件
2.解密表物件:
EC_ELGAMAL_DECRYPT_TABLE,該物件用來儲存解密表的內部資訊。橢圓曲線離散對數問題(ECDLP)只有爆力破解的方法可求解,而爆力破解的速度比較慢,通常的做法是使用小步大步演算法(Baby-Step,Giant-Step,BSGS)。總體思想是提前將所有可能的明文結果提前運算後,儲存到 hash 表中,下次只需要進行少量的運算和 hash 表查詢就可以得到結果,大大提高 ECDLP 的解密效率,但解密表的初始化可能比較慢,而且解密表的實現事關解密速度,後面考慮可以開放介面的實現給上層應用,所以這裡先定義了一個解密表的物件和預設實現。
介面如下:
//建立 EC_ELGAMAL_DECRYPT_TABLE 物件
//decrypt_negative 為 1 時表示該解密表可以解密負數,初始化解密表時將可能的負數運算後插入到 hash 中。
EC_ELGAMAL_DECRYPT_TABLE *EC_ELGAMAL_DECRYPT_TABLE_new(EC_ELGAMAL_CTX *ctx,
int32_t decrypt_negative);
//釋放 EC_ELGAMAL_DECRYPT_TABLE 物件
void EC_ELGAMAL_DECRYPT_TABLE_free(EC_ELGAMAL_DECRYPT_TABLE *table);
//設定 EC_ELGAMAL_DECRYPT_TABLE 物件到上下文物件中
//解密時如果存在解密表則使用解密表進行求解,否則直接爆力破解,速度會很慢
void EC_ELGAMAL_CTX_set_decrypt_table(EC_ELGAMAL_CTX *ctx,
EC_ELGAMAL_DECRYPT_TABLE *table);
3.密文物件:
EC_ELGAMAL_CIPHERTEXT,由上面原理可知,加密之後得到的結果是兩個點,該物件是用來儲存加密後的密文資訊(兩個點),加密/解密和。
介面如下:
//建立 EC_ELGAMAL_CIPHERTEXT 物件
EC_ELGAMAL_CIPHERTEXT *EC_ELGAMAL_CIPHERTEXT_new(EC_ELGAMAL_CTX *ctx);
//釋放 EC_ELGAMAL_CIPHERTEXT 物件
void EC_ELGAMAL_CIPHERTEXT_free(EC_ELGAMAL_CIPHERTEXT *ciphertext);
4.加密/解密介面
//加密,將明文 plaintext 進行加密,結果儲存到 EC_ELGAMAL_CIPHERTEXT 物件指標 r 中
int EC_ELGAMAL_encrypt(EC_ELGAMAL_CTX *ctx, EC_ELGAMAL_CIPHERTEXT *r, int32_t plaintext);
//解密,將密文 ciphertext 進行解密,結果儲存到 int32_t 指標 r 中
int EC_ELGAMAL_decrypt(EC_ELGAMAL_CTX *ctx, int32_t *r, EC_ELGAMAL_CIPHERTEXT *ciphertext);
5.密文加/減/標量乘運算介面
//密文加,r = c1 + c2
int EC_ELGAMAL_add(EC_ELGAMAL_CTX *ctx, EC_ELGAMAL_CIPHERTEXT *r,
EC_ELGAMAL_CIPHERTEXT *c1, EC_ELGAMAL_CIPHERTEXT *c2);
//密文減,r = c1 - c2
int EC_ELGAMAL_sub(EC_ELGAMAL_CTX *ctx, EC_ELGAMAL_CIPHERTEXT *r,
EC_ELGAMAL_CIPHERTEXT *c1, EC_ELGAMAL_CIPHERTEXT *c2);
//標量密文乘,r = m * c
int EC_ELGAMAL_mul(EC_ELGAMAL_CTX *ctx, EC_ELGAMAL_CIPHERTEXT *r,
EC_ELGAMAL_CIPHERTEXT *c, int32_t m);
6.編碼/解碼介面
同態加密涉及到多方參與,可能會需要網路傳輸,這就將密文物件 EC_ELGAMAL_CIPHERTEXT 編碼後才能傳遞給對方,對方也需要解碼得到 EC_ELGAMAL_CIPHERTEXT 物件後才能呼叫其他介面進行運算。
介面如下:
//編碼,將密文 ciphertext 編碼後儲存到 out 指標中,out 指標的記憶體需要提前分配好;
//如果 out 為 NULL,則返回編碼所需的記憶體大小;
//compressed 為是否採用壓縮方式編碼,1 為壓縮編碼(編碼結果長度較小),0 為正常編碼(編碼結果長度較大)
size_t EC_ELGAMAL_CIPHERTEXT_encode(EC_ELGAMAL_CTX *ctx, unsigned char *out,
size_t size, EC_ELGAMAL_CIPHERTEXT *ciphertext,
int compressed);
//解碼,將長度為 size 的記憶體資料 in 解碼後儲存到密文物件 r 中
int EC_ELGAMAL_CIPHERTEXT_decode(EC_ELGAMAL_CTX *ctx, EC_ELGAMAL_CIPHERTEXT *r,
unsigned char *in, size_t size);
核心實現
BabaSSL 是 OpenSSL 的衍生版,內部支援了很多橢圓曲線演算法的實現。
比如,已支援國際 (prime256v1、secp384r1 等) 和國密 (SM2) 的大部分橢圓曲線,天生實現了橢圓曲線點運算、公私鑰生成等基礎演算法,所以在 BabaSSL 實現 EC-ElGamal 演算法的核心實現主要是 EC-ElGamal 原理的實現和 ECDLP 求解演算法的實現。
由於程式碼過長,檢視程式碼辛苦移步 GitHub:
https://github.com/BabaSSL/Ba...
具體的使用方法和案例,可以點選檢視