CKKS加密方案

2022-09-20 10:24:13 字數 4148 閱讀 6593

本文內容來自「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。有效位變,縮減因子不變)

在加密解密中,定點計算更合適,因為計算消耗更小(省去了約減縮減因子的計算)

如上所述,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的下限,以達到所需的安全級別。建議應用程式開發人員使用實現「全同態加密標準 」標準的庫,並自動選擇正確的表,因為選擇正確的表需要了解實現的某些細節,例如金鑰分發。

//

// 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中是縮減密文的維數,保證密文的大小。

金鑰轉換:改變密文對應的金鑰,重新生成乙個新的密文,所對應的金鑰也不同!

重線性化溼金鑰轉換的乙個例項!

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

接下來搞明白rns是什麼?

以下開源庫具有ckks的開源實現:

• heaan/rns-heaan

• helib

• lattigo

• microsoft seal

• palisade

CKKS Part3 CKKS的加密和解密

本篇文章翻譯於ckks explained,part 3 encryption and decryption,主要介紹ckks方案的加密和解密。在本文中,我們將看到如何使用困難問題,例如lwe或rlwe來構建近似同態加密方案。ckks使用近似演算法而不是精確演算法,這意味著一旦我們完成計算,我們可能...

檔案加密方案

使用者輸入密碼,軟體驗證密碼是否正確。傳統的對稱加密演算法,給出密文,隨意給出乙個金鑰,使之來解密。演算法都是可以繼續的,即使解密出來的資訊是亂的。如何驗證使用者的密碼是否正確?最差的解決方案 把使用者的檔案先加密,然後將使用者的密碼儲存到檔案末尾。解密時,驗證使用者輸入的金鑰是否和檔案末尾相同,如...

資料加密方案

資料加密又稱密碼學,它是一門歷史悠久的技術,指通過加密演算法和加密金鑰將明文轉變為密文,而解密則是通過解密演算法和解密金鑰將密文恢復為明文。資料加密目前仍是計算機系統對資訊進行保護的一種最可靠的辦法。它利用密碼技術對資訊進行加密,實現資訊隱蔽,從而起到保護資訊的安全的作用。資料加密技術要求只有在指定...