BabaSSL:支持半同態加密算法 EC-ElGamal

圖片

文|王祖熙(花名:金九 )

螞蟻集團開發工程師
負責螞蟻 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/BabaSSL/blob/master/crypto/ec/ec_elgamal.c

具體的使用方法和案例,可以點擊查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章