CKKS加密方案


本文內容來自“Protecting Privacy throughHomomorphic Encryption”,主要學習里面的CKKS部分。

CKKS是一種同態加密方案,其安全性依賴於RLWE問題。明文是實數向量,表示為定點類型計算方式(實數表示方法:浮點計算和定點計算)。該方案很支持以SIMD方式在這些向量之間進行定點運算。

CKKS方案涉及幾個參數,這些參數決定了該方案支持的安全級別、功能和精度。這些參數是:
1、與計算精度相對應的小數位數f;
2、(最大的)密文模數q;
3、密文維數n

我們假設每一個明文值都表示為一個二進制定點數,它在小數點后有f個小數位。密文的f值可以在使用重縮放后進行調整,這是CKKS的一個顯著特征。

這里介紹實數的表示方法:
對實數的計算有兩種表示形式
例如:
(有效位:6位;縮減因子:2^-5)
(這里一個實數(浮點數),可以分成兩部分表示,整數部分叫做“有效位”,小數部分叫做“縮減因子”)
1、浮點計算
(有效位:6位;縮減因子:2^-4。有效位不變,縮減因子變)
2、定點計算
(有效位:7位;縮減因子:2^-5。有效位變,縮減因子不變)
在加密解密中,定點計算更合適,因為計算消耗更小(省去了約減縮減因子的計算)

密文模數q是決定方案加密計算能力的主要參數。CKKS方案的密文由2n個模q的整數組成(比如:\((c_1,c_2),c_1和c_2都是n維的向量(或者說是一個n次項的多項式)\)。參數q越大,對密文執行的操作越多,精度越高。對於給定的q值,密文維數n決定了方案的安全級別,n越大表示安全性越高。讀者可以參考《參數選擇》那部分了解更多細節。

如上所述,CKKS允許我們加密多個定點數字在一個密文中(可以理解為,多個明文數字打包到一個明文多項式,然后加密成一個密文)。密文維數n還決定了明文多項式的大小,即n/2。

同態計算

所有涉及至少一個加密輸入的計算都會產生加密輸出。主要計算包括:

兩個參數

1、密文 加 密文
2、密文 加 明文
3、密文 乘 密文
4、密文 乘 明文
5、密文 減 密文
6、密文 減 明文

密文-密文和密文-明文的乘法返回一個密文,其縮減因子是輸入值的縮減因子的乘積。

密文-密文和密文-明文加法需要輸入的縮減因子匹配(意思就是,縮減因子要一致)。

單個參數

1、求逆
2、旋轉
3、重縮放

重縮放是在乘法運算之后進行,它是將輸入密文的縮放因子除以特定因子的一元運算。它控制同態計算期間縮放因子的大小。密碼模數在重新縮放操作后減小,如果密文模數太小,則不允許進一步乘法。

參數選擇

小數位數和加密方案支持的深度是需要考慮的主要參數。如果電路深度不超過由參數確定的界限,則可以對電路進行加密評估(意思就是可以繼續執行密文計算)。

精度損失和溢出是定點算法的兩個主要問題。CKKS中的密文在加密和計算后會產生錯誤,這是由參數f控制的。f越大意味着結果越准確,但計算成本會隨着f的增加而增加。同時,密文的大小必須充分小於密文模數q,以確保計算期間不會發生溢出。

最大密文模數q主要由待評估電路的乘法深度(意思就是可以執行多少次乘法計算)和精度參數f決定;更高的深度和更高的精度需要更大的密文模數,並且通常較慢。因此,一種常見的優化技術是將計算任務表示為深度最小的電路。例如,計算四個加密數字A、B、C和D的乘積最好是(A∗ B)∗ (C∗ D) 而不是A∗ (B∗ (C∗ D)),因為前者具有較低的乘法深度,因此需要較小的密文模數。
更具體的以下面的圖為例:

一旦確定了q,現在就可以使用“全同態加密標准 ”中的表來確定密文維度n的下限,以達到所需的安全級別。建議應用程序開發人員使用實現“全同態加密標准 ”標准的庫,並自動選擇正確的表,因為選擇正確的表需要了解實現的某些細節,例如密鑰分發。

CKKS的小例子

//
// Created by Pam on 2022/2/7.
//

// 首先定義參數f:小數位數,q:密文最大模數,n:密文維數
f=2;
q=65537;
n=8;

// 使用f=2的小數位的十進制表示

// 注意這里的設置並不安全!
// 要獲得q=65537的方案安全性,我們至少需要n=512
// 使用這些參數,明文向量的大小為4(這里注意,明文維數:n/2)

// 用這些參數生成密鑰
myPublicKey,mySecretKey=generateCKKSkey(n,q);

// 加密數據時,每個明文是由4個元素組成的向量
encrypted_a = encrypt(myPublicKey, [1.53, -11.53, 0.02, -3.32]);
encrypted_b = encrypt(myPublicKey, [12.29, 7.52, -14.47, 11.01]);
excrypted_c = encrypt(myPublicKey, [2.64, 10.78, -15.30, 13.34]);
// 現在得到了三個密文

// 現在將encrypted_a + encrypted_b
// 幸運的是,可以使用了同態加密,所以實際上可以這樣做
encrypted_d = addCiphertexts(myPublicKey,encrypted_a, encrypted_b);
// 得到密文向量  [13.82, -4.01, -14.45, 7.69]

// 現在將encrypted_a * encrypted_b * excrypted_c
encrypted_e = multiplyCiphertexts(myPublicKey, encrypted_c,encrypted_d);
// 得到密文向量   [36.48, -43.23, 221.09, 102.58]

// 然后向右旋轉2
// CKKS中的旋轉大多就是進行對於矩陣的旋轉,通俗一點講就是,對於矩陣來說,旋轉列可能就是將一列元素進行向左或者是向右進行平移。旋轉行可能就是將矩陣的每兩行進行對調,從而實現旋轉的操作。
encrypted_f = rotateBy2(myPublicKey, encrypted_e);

// 解密,使用私鑰
decrypted = decrypt(mySecretKey, encrypted_f);
print(decrypted);
// 輸出: [221.09, 102.58, 36.48, -43.23]

更多

數據編碼

在使用CKKS方案加密數據之前,需要對明文進行單獨的編碼操作。CKKS編碼會導致精度損失,因此必須首先將明文向量乘以縮減因子(由方案參數確定),以確保編碼后保持足夠的精度。然后,將縮放后向量轉換為方案的明文形式。密文中隱藏的縮減因子可能發生變化正在同態計算過程中。解密后,需要進行相應的解碼操作。

密文模數(q)決定了編碼后的底層明文上限(q/2),以保證其正確解密。例如,將密文模數設置為q=1024意味着縮放因子為32,加密12.34的密文可以正確解密,但使用縮放因子為256,加密相同的值將導致溢出。

這里不太理解: the underlying encoded plaintext,是什么意思,好幾次見到了,希望大佬解惑?

其他操作

CKKS方案還使用了一些操作,這些操作不會改變底層明文(除了一些可能的精度損失之外),但出於實現原因,仍然需要這些操作。
1、密文-密文乘法和循環向量旋轉的副作用是,解密結果所需的密鑰與操作前所需的密鑰不同。因此,這些操作之后是密鑰轉換操作,以將密鑰轉換回原始密鑰。密文-密文乘法的密鑰切換操作也稱為重線性化。

重線性化:在CKKS中是縮減密文的維數,保證密文的大小。
密鑰轉換:改變密文對應的密鑰,重新生成一個新的密文,所對應的密鑰也不同!
重線性化濕密鑰轉換的一個實例!

2、Bootstrapping可以“刷新”密文並提高密文模數,以支持更多的計算。這種操作成本很高,因此不經常使用(有時甚至沒有實現)。

重縮放:CKKS中的rescaling是為了保證縮放因子不變,同時降低噪音,但會造成密文模數減少,所以只能構成有限級全同態方案,這里的bootstarpping能后提升密文模數,所以使用bootstrapping技術可以構造全同態!

計算密鑰

密鑰切換操作要求計算者能夠有一個公開的特殊計算密鑰。計算密鑰的生成必須由私鑰所有者完成。在密文-密文乘法中,這些密鑰通常被稱為重線性化密鑰;在密文旋轉中,它們有時被稱為旋轉密鑰或伽羅瓦密鑰(Galois keys)。bootstarpping過程也需要這樣的計算密鑰。

CKKS的參考

CKKS加密方案最早是在[Homomorphic Encryption for Arithmetic of Approximate Numbers]中提出的。出於與BFV方案相同的原因,需要在RNS中表示大整數。已經提出並實施了CKKS方案的幾個RNS變體,包括[A Full RNS Variant of the Approximate Homomorphic Encryption,Optimized Homomorphic Encryption Solution for Secure Genome-Wide Association Studies,Semi-Parallel Logistic Regression for GWAS on Encrypted Data]和[Better Bootstrapping for Approximate Homomorphic Encryption]。現在的HE庫通常實現這些RNS變體的組合,並經常添加自己的優化/可用性改進。[Bootstrapping for Approximate Homomorphic Encryption,Improved Bootstrapping for Approximate Homomorphic Encryption,Better Bootstrapping for Approximate Homomorphic Encryption]中描述了CKKS的bootstrapping。

接下來搞明白RNS是什么?

實現

以下開源庫具有CKKS的開源實現:
• HEAAN/RNS-HEAAN
• HElib
• Lattigo
• Microsoft SEAL
• PALISADE


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM