CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION
Introduction
在之前的文章中,CKKS解釋了第二部分:完整的編碼和解碼,我們看到了如何實現CKKS的編碼器和解碼器,這使我們能夠將向量轉換為多項式,反之亦然。這一步驟是必要的,因為我們將看到,與直接使用向量相比,使用多項式來構建同態加密方案要高效得多。
在本文中,我們將看到如何利用困難問題,如LWE或RLWE來構建一個近似同態加密方案。CKKS使用近似算術而不是精確算術,這意味著一旦我們完成計算,我們可能會得到一個略有不同于直接進行計算的結果。這意味著如果您加密了2和3,將它們的密文相加,然后解密,您可能會得到類似于4.99或5.01但不是5的結果。而其他方案,如BFV是精確的,這意味著它們將產生確切的5。
那么為什么要使用CKKS呢?CKKS更適用于實數上的算術運算,其中我們可以得到近似但接近的結果,而BFV更適用于整數上的算術運算。
在本文中,我們將看到如何利用LWE和RLWE實現近似算術同態加密方案的加密和解密過程。
Learning with Error
CKKS是一種公鑰加密方案,其中生成了一個秘鑰對,包括一個私鑰和一個公鑰。公鑰用于加密并可以共享,而私鑰用于解密并必須保密。
LWE(Learning With Error)是CKKS的基礎,也是許多其他同態加密方案的基礎之一。LWE問題最初由Regev在論文《On lattices, learning with errors, random linear codes, and cryptography》中引入。LWE問題是要區分形式為 ( a i , b i ) = ( a i , ? a i , s ? + e i ) (a_i, b_i) = (a_i, \langle a_i, s \rangle + e_i) (ai?,bi?)=(ai?,?ai?,s?+ei?) 的帶噪聲對和 Z q n × Z q \mathbb{Z}_q^n\times\mathbb{Z}_q Zqn?×Zq?中真正隨機的對。這里 a i , s ∈ Z q n a_i, s \in \mathbb{Z}_q^n ai?,s∈Zqn?, a i a_i ai? 是均勻采樣的, s s s 是我們的秘密, e i ∈ Z q e_i \in \mathbb{Z}_q ei?∈Zq? 是小的噪聲,通常是高斯分布的,用于增加問題的難度。如果不引入 e i e_i ei?,解決這個線性系統將會變得容易得多,因為我們可以使用高斯消元法來解決線性系統。
Z q n × Z q \mathbb{Z}_q^n\times\mathbb{Z}_q Zqn?×Zq? 表示一個元素由兩部分組成的集合,其中第一部分是長度為 n n n 的整數向量,每個分量都來自于模 q q q 的整數集合 Z q \mathbb{Z}_q Zq?,第二部分是一個整數,同樣來自于模 q q q 的整數集合 Z q \mathbb{Z}_q Zq?。
具體來說, Z q n × Z q \mathbb{Z}_q^n\times\mathbb{Z}_q Zqn?×Zq? 可以表示為:
Z q n × Z q = { ( x 1 , x 2 , … , x n , y ) ∣ x i ∈ Z q , y ∈ Z q } \mathbb{Z}_q^n\times\mathbb{Z}_q = \{(x_1, x_2, \ldots, x_n, y) \mid x_i \in \mathbb{Z}_q, y \in \mathbb{Z}_q\} Zqn?×Zq?={(x1?,x2?,…,xn?,y)∣xi?∈Zq?,y∈Zq?}
其中 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1?,x2?,…,xn? 是整數向量的分量,每個分量都來自于模 q q q 的整數集合 Z q \mathbb{Z}_q Zq?, y y y 是一個整數,同樣來自于模 q q q 的整數集合 Z q \mathbb{Z}_q Zq?。
LWE問題的目標是區分形式為 ( a i , b i ) = ( a i , ? a i , s ? + e i ) (a_i, b_i) = (a_i, \langle a_i, s \rangle + e_i) (ai?,bi?)=(ai?,?ai?,s?+ei?) 的帶噪聲對和 Z q n × Z q \mathbb{Z}_q^n\times\mathbb{Z}_q Zqn?×Zq?中真正隨機的對。
在LWE問題中,我們有一組帶噪聲的對 ( a i , b i ) (a_i, b_i) (ai?,bi?),其中 a i a_i ai? 是長度為 n n n 的向量, b i b_i bi? 是一個整數。這些帶噪聲的對是通過選擇秘密向量 s s s,生成矩陣 A = ( a 1 , … , a m ) A=(a_1,\ldots,a_m) A=(a1?,…,am?),并添加噪聲項 e i e_i ei? 來構造的。
對于每個帶噪聲的對 ( a i , b i ) (a_i, b_i) (ai?,bi?),其中 a i a_i ai? 是隨機選擇的向量, b i b_i bi? 是通過將 a i a_i ai? 與秘密向量 s s s 的內積加上噪聲項 e i e_i ei? 計算得到的。噪聲項 e i e_i ei? 是從特定分布中生成的隨機數,通常是一個小的擾動項。
與此相對, Z q n × Z q \mathbb{Z}_q^n\times\mathbb{Z}_q Zqn?×Zq? 表示一個集合,其中元素是由長度為 n n n 的向量和一個整數組成的對。在這個集合中,向量和整數的取值是完全獨立的,沒有任何關聯性。
LWE問題的目標是通過觀察一組帶噪聲的對 ( a i , b i ) (a_i, b_i) (ai?,bi?) 來區分它們是否是由秘密向量 s s s 生成的。換句話說,我們需要確定給定的帶噪聲對是來自于LWE構造還是來自于純隨機的對。這種區分能力是LWE問題的核心,而解決LWE問題的算法將能夠從帶噪聲的對中恢復出秘密向量 s s s 的近似。
example
假設我們有一個模數 q = 7 q = 7 q=7,向量維度 n = 3 n = 3 n=3,并且我們希望生成一個帶噪聲的對 ( a i , b i ) (a_i, b_i) (ai?,bi?),其中 a i a_i ai? 是長度為 n n n 的向量, b i b_i bi? 是一個整數。
首先,我們隨機選擇一個秘密向量 s = ( 2 , 4 , 1 ) s = (2, 4, 1) s=(2,4,1),其中每個分量都來自于模 q q q 的整數集合 Z q \mathbb{Z}_q Zq?。然后,我們生成一個噪聲項 e i e_i ei?,該項滿足特定的噪聲分布。在這個例子中,我們假設 e i e_i ei? 是從均值為0、方差為2的離散高斯分布中生成的。
現在,我們生成帶噪聲的對 ( a i , b i ) (a_i, b_i) (ai?,bi?)。對于每個 i i i,我們隨機選擇向量 a i a_i ai?,其中每個分量 a i , j a_{i,j} ai,j? 都是從模 q q q 的整數集合 Z q \mathbb{Z}_q Zq? 中隨機選擇的。然后,我們計算 b i = ? a i , s ? + e i b_i = \langle a_i, s \rangle + e_i bi?=?ai?,s?+ei?,其中 ? ? , ? ? \langle\cdot,\cdot\rangle ??,?? 表示向量的內積。
讓我們通過一個具體的例子來說明:
假設我們生成的隨機向量 a i a_i ai? 如下:
- a 1 = ( 3 , 6 , 4 ) a_1 = (3, 6, 4) a1?=(3,6,4)
- a 2 = ( 2 , 3 , 5 ) a_2 = (2, 3, 5) a2?=(2,3,5)
對于這兩個向量,我們計算相應的 b i b_i bi?:
- b 1 = ? a 1 , s ? + e 1 = ( 3 ? 2 + 6 ? 4 + 4 ? 1 ) + e 1 = 29 + e 1 b_1 = \langle a_1, s \rangle + e_1 = (3 \cdot 2 + 6 \cdot 4 + 4 \cdot 1) + e_1 = 29 + e_1 b1?=?a1?,s?+e1?=(3?2+6?4+4?1)+e1?=29+e1?
- b 2 = ? a 2 , s ? + e 2 = ( 2 ? 2 + 3 ? 4 + 5 ? 1 ) + e 2 = 23 + e 2 b_2 = \langle a_2, s \rangle + e_2 = (2 \cdot 2 + 3 \cdot 4 + 5 \cdot 1) + e_2 = 23 + e_2 b2?=?a2?,s?+e2?=(2?2+3?4+5?1)+e2?=23+e2?
在這個例子中, e 1 e_1 e1? 和 e 2 e_2 e2? 是從離散高斯分布中生成的隨機噪聲項。
這樣,我們就得到了兩個帶噪聲的對 ( a 1 , b 1 ) (a_1, b_1) (a1?,b1?) 和 ( a 2 , b 2 ) (a_2, b_2) (a2?,b2?),其中 a 1 , a 2 a_1, a_2 a1?,a2? 是長度為 3 的向量, b 1 , b 2 b_1, b_2 b1?,b2? 是整數。通過解決LWE問題,我們的目標是從這些帶噪聲的對中學習到秘密向量 s s s 的近似。
LWE問題被認為與最壞情況的格問題一樣困難,目前對來自量子計算機的攻擊是安全的。因此,我們可以利用從 ( a i , ? a i , s ? + e i ) (a_i,\langle a_i, s \rangle + e_i) (ai?,?ai?,s?+ei?) 對中找到秘密 s s s 的難度,并基于此構建一個加密系統。
假設我們已生成了一個保密的秘鑰 s ∈ Z q n s \in \mathbb{Z}_q^n s∈Zqn?,并發布了 n n n 對形式為 ( a i , ? a i , s ? + e i ) (a_i,\langle a_i, s \rangle + e_i) (ai?,?ai?,s?+ei?) 的對,可以寫成矩陣形式為 ( A , A ? s + e ) (A,A \cdot s + e) (A,A?s+e),其中 A ∈ Z q n × n A\in\mathbb{Z}_q^{n\times n} A∈Zqn×n?, e ∈ Z q n e \in \mathbb{Z}_q^n e∈Zqn?。正如LWE問題所述,從這個對中恢復秘密鑰是困難的,因此我們可以利用它來創建一個公鑰。
實際上,我們將使用 p = ( ? A ? s + e , A ) p=(-A \cdot s + e,A) p=(?A?s+e,A) 作為我們的公鑰,可以公開使用,因為很難從中提取出秘密鑰。我們選擇存儲 ? A ? s -A \cdot s ?A?s 而不是 A ? s A \cdot s A?s 是為了方便,但這并不改變問題。
然后,為了使用公鑰和私鑰加密和解密一個消息 μ ∈ Z q n \mu \in \mathbb{Z}_q^n μ∈Zqn?,我們可以使用以下方案:
- 使用公鑰 p p p對 μ \mu μ進行加密:輸出 c = ( μ , 0 ) + p = ( μ ? A ? s + e , A ) = ( c 0 , c 1 ) c = (\mu, 0) + p = (\mu - A \cdot s + e, A) = (c_0, c_1) c=(μ,0)+p=(μ?A?s+e,A)=(c0?,c1?)。
- 使用私鑰 s s s對 c c c進行解密:輸出 μ ~ = c 0 + c 1 . s = μ ? A . s + e + A . s = μ + e ≈ μ \tilde{\mu}=c_0+c_1.s=\mu-A.s+e+A.s=\mu+e\approx\mu μ~?=c0?+c1?.s=μ?A.s+e+A.s=μ+e≈μ。
因此,在加密階段,我們使用公鑰來對消息 μ \mu μ進行掩碼。因此,消息被隱藏在密文的第一個坐標中,使用了掩碼 ? A ? s -A \cdot s ?A?s。請記住, A A A是均勻采樣的,因此它確實會有效地掩蓋 μ \mu μ。要移除掩碼,我們可以使用 c c c的第二個坐標,其中僅存儲了 A A A,并將其與私鑰 s s s結合以獲得解密結果 μ + e \mu + e μ+e。注意,這里我們并沒有得到原始消息 μ \mu μ,而是 μ \mu μ加上一些噪音 e e e,這就是為什么我們說我們有一個近似算術方案。如果 e e e足夠小,那么解密結果將接近于原始的 μ \mu μ。
因此,我們已經看到如何利用 LWE 問題構建一個安全防御量子攻擊的公共加密方案。上述實現的問題在于,雖然秘密密鑰的大小為 O ( n ) \mathcal{O}(n) O(n),但由于矩陣 A A A的存在,公鑰的大小為 O ( n 2 ) \mathcal{O}(n^2) O(n2),并且計算也需要 O ( n 2 ) \mathcal{O}(n^2) O(n2)次操作。因為 n n n將決定我們方案的安全性,如果我們使用 LWE 構建我們的方案,它在實踐中將會太低效,因為密鑰的 O ( n 2 ) \mathcal{O}(n^2) O(n2)大小和復雜度將使其太不實際。
Ring Learning with Error
因此,我們將考慮《On Ideal Lattices and Learning with Errors Over Rings》中介紹的Ring Learning With Error(RLWE)問題,它是LWE在環上的一種變體。我們不再使用 Z q n \mathbb{Z}_q^n Zqn?中的向量,而是在 Z q [ X ] / ( X N + 1 ) \mathbb{Z}_q[X]/(X^N+1) Zq?[X]/(XN+1)中使用多項式進行計算(這里假設 N N N是2的冪)。現在我們從 Z q [ X ] / ( X N + 1 ) \mathbb{Z}_q[X]/(X^N+1) Zq?[X]/(XN+1)中隨機選擇多項式 a a a、 s s s和 e e e,其中 a a a仍然是均勻采樣的, s s s是一個小的秘密多項式, e e e是一個小的噪聲多項式。轉向RLWE有兩個主要優勢:
- 密鑰大小不再是二次的,而是線性的,因為我們現在輸出公鑰 p = ( ? a ? s + e , a ) p=(-a\cdot s+e,a) p=(?a?s+e,a),其中 a ? s a\cdot s a?s表示 a a a與 s s s的多項式乘積。由于所有操作都是在多項式之間進行的,私鑰和公鑰的大小都是 O ( n ) \mathcal{O}(n) O(n)。
- 乘法是在多項式上進行的,因此可以使用離散傅立葉變換進行多項式乘法,復雜度為 O ( n log ? ( n ) ) \mathcal{O}(n\log(n)) O(nlog(n)),而不是 O ( n 2 ) \mathcal{O}(n^2) O(n2),因為我們需要進行矩陣-向量乘法。
因此,通過使用RLWE而不是LWE,我們可以獲得更小的密鑰,并且操作速度更快,因此前面的方案變得更加實用。此外,RLWE仍然是一個困難問題,并提供強大的安全性保證,因此使用RLWE仍然提供了一個安全的方案。
現在我們明白了為什么使用多項式是重要的,因為它們為高效和安全的方案提供了基礎。因此,現在你可以理解為什么我們要費力地將向量轉換為 Z q [ X ] / ( X N + 1 ) \mathbb{Z}_q[X]/(X^N+1) Zq?[X]/(XN+1)中的多項式,反之亦然,因為我們現在可以利用多項式環的代數結構。
假設我們有一個RLWE方案,其中我們在環 Z q [ X ] / ( X 4 + 1 ) \mathbb{Z}_q[X]/(X^4 + 1) Zq?[X]/(X4+1)上進行計算, q q q是我們的模量。我們希望生成一個公鑰和一個私鑰來加密和解密消息。
-
密鑰生成:
-
我們首先隨機選擇一個小的秘密多項式 s = 3 X 2 + 2 X + 1 s = 3X^2 + 2X + 1 s=3X2+2X+1 和一個小的噪聲多項式 e = X 3 + X 2 + 2 X + 1 e = X^3 + X^2 + 2X + 1 e=X3+X2+2X+1。
-
然后我們隨機選擇一個多項式 a = X 3 + 2 X 2 + X + 1 a = X^3 + 2X^2 + X + 1 a=X3+2X2+X+1,這個多項式仍然是均勻采樣的。
-
我們計算公鑰 p = ( ? a ? s + e , a ) p = (-a \cdot s + e, a) p=(?a?s+e,a)。首先,計算 ? a ? s = ? ( X 3 + 2 X 2 + X + 1 ) ? ( 3 X 2 + 2 X + 1 ) -a \cdot s = -(X^3 + 2X^2 + X + 1) \cdot (3X^2 + 2X + 1) ?a?s=?(X3+2X2+X+1)?(3X2+2X+1),得到 ? a ? s = ? 3 X 5 ? 5 X 4 ? 3 X 3 ? X 2 ? 2 X ? 1 -a \cdot s = -3X^5 - 5X^4 - 3X^3 - X^2 - 2X - 1 ?a?s=?3X5?5X4?3X3?X2?2X?1,然后加上噪聲多項式 e e e,得到 ? a ? s + e = ? 3 X 5 ? 5 X 4 ? 3 X 3 ? 2 X 2 ? X -a \cdot s + e = -3X^5 - 5X^4 - 3X^3 - 2X^2 - X ?a?s+e=?3X5?5X4?3X3?2X2?X。公鑰 p p p 就是這個結果和 a a a 的組合,即 p = ( ? 3 X 5 ? 5 X 4 ? 3 X 3 ? 2 X 2 ? X , X 3 + 2 X 2 + X + 1 ) p = (-3X^5 - 5X^4 - 3X^3 - 2X^2 - X, X^3 + 2X^2 + X + 1) p=(?3X5?5X4?3X3?2X2?X,X3+2X2+X+1)。
-
-
加密:
假設我們有一個消息 μ = 2 X 2 + X + 1 \mu = 2X^2 + X + 1 μ=2X2+X+1,我們希望將其加密。我們隨機選擇一個小的噪聲多項式 e ′ = X 2 + 1 e' = X^2 + 1 e′=X2+1。
我們計算密文 c = ( μ ? a ? s + e ′ , a ) c = (\mu - a \cdot s + e', a) c=(μ?a?s+e′,a)。首先,計算 μ ? a ? s = ( 2 X 2 + X + 1 ) ? ( X 3 + 2 X 2 + X + 1 ) ? ( 3 X 2 + 2 X + 1 ) \mu - a \cdot s = (2X^2 + X + 1) - (X^3 + 2X^2 + X + 1) \cdot (3X^2 + 2X + 1) μ?a?s=(2X2+X+1)?(X3+2X2+X+1)?(3X2+2X+1),得到 μ ? a ? s = ? 3 X 6 ? 3 X 5 ? 2 X 4 ? 2 X 3 ? X 2 \mu - a \cdot s = -3X^6 - 3X^5 - 2X^4 - 2X^3 - X^2 μ?a?s=?3X6?3X5?2X4?2X3?X2,然后加上噪聲多項式 e ′ e' e′,得到 μ ? a ? s + e ′ = ? 3 X 6 ? 3 X 5 ? 2 X 4 ? X 3 ? X 2 + 1 \mu - a \cdot s + e' = -3X^6 - 3X^5 - 2X^4 - X^3 - X^2 + 1 μ?a?s+e′=?3X6?3X5?2X4?X3?X2+1。密文 c c c 就是這個結果和 a a a 的組合,即 c = ( ? 3 X 6 ? 3 X 5 ? 2 X 4 ? X 3 ? X 2 + 1 , X 3 + 2 X 2 + X + 1 ) c = (-3X^6 - 3X^5 - 2X^4 - X^3 - X^2 + 1, X^3 + 2X^2 + X + 1) c=(?3X6?3X5?2X4?X3?X2+1,X3+2X2+X+1)。
-
解密:
使用私鑰 s s s 對密文 c c c 進行解密。解密過程為 μ ′ = c 0 + c 1 ? s \mu' = c_0 + c_1 \cdot s μ′=c0?+c1??s。將 c 0 c_0 c0? 替換為 ? 3 X 6 ? 3 X 5 ? 2 X 4 ? X 3 ? X 2 + 1 -3X^6 - 3X^5 - 2X^4 - X^3 - X^2 + 1 ?3X6?3X5?2X4?X3?X2+1, c 1 c_1 c1? 替換為 X 3 + 2 X 2 + X + 1 X^3 + 2X^2 + X + 1 X3+2X2+X+1, s s s 替換為 3 X 2 + 2 X + 1 3X^2 + 2X + 1 3X2+2X+1。進行多項式乘法和加法后,得到解密結果 μ ′ = 2 X 2 + X + 1 \mu' = 2X^2 + X + 1 μ′=2X2+X+1,與原始消息 μ \mu μ 相同。
這是一個簡化的RLWE示例,演示了如何生成密鑰、加密消息和解密密文。 RLWE的優勢在于密鑰的大小更小,并且可以使用更高效的乘法操作進行計算。
Homomorphic operations
現在我們已經了解了為什么要在 Z q [ X ] / ( X N + 1 ) \mathbb{Z}_q[X]/(X^N+1) Zq?[X]/(XN+1)的多項式上工作,以及如何基于此構建加密方案,讓我們看看如何定義密文上的加法和乘法,以實現同態加密方案。
我們說過我們有一個秘密 s s s和一個公鑰 p = ( b , a ) = ( ? a ? s + e , a ) p=(b,a)=(-a\cdot s+e,a) p=(b,a)=(?a?s+e,a)。要加密一個消息 μ \mu μ,我們簡單地輸出 c = ( μ + b , a ) c=(\mu+b,a) c=(μ+b,a),而要使用 s s s解密它,我們評估 c 0 + c 1 ? s c_0+c_1\cdot s c0?+c1??s,這將近似地給出原始消息。
Addition
假設我們有兩個消息 μ \mu μ 和 μ ′ \mu' μ′,并將它們加密為 c = ( c 0 , c 1 ) c=(c_0,c_1) c=(c0?,c1?) 和 c ′ = ( c 0 ′ , c 1 ′ ) c'=(c'_0,c'_1) c′=(c0′?,c1′?)。那么 c add = c + c ′ = ( c 0 + c 0 ′ , c 1 + c 1 ′ ) c_{\text{add}}=c+c'=(c_0+c'_0,c_1+c'_1) cadd?=c+c′=(c0?+c0′?,c1?+c1′?) 就是 μ + μ ′ \mu+\mu' μ+μ′ 的正確加密結果。也就是說,當我們使用秘密 s s s 進行解密時,我們會得到(近似地) μ + μ ′ \mu+\mu' μ+μ′。
確切地說,對 c add c_{\text{add}} cadd? 的解密過程為 c add , 0 + c add , 1 ? s = c 0 + c 0 ′ + ( c 1 + c 1 ′ ) ? s = c 0 + c 1 ? s + c 0 ′ + c 1 ′ ? s = μ + μ ′ + 2 e ≈ μ + μ ′ c_{\text{add},0}+c_{\text{add},1}\cdot s=c_0+c'_0+(c_1+c'_1)\cdot s=c_0+c_1\cdot s+c'_0+c'_1\cdot s= \mu+\mu'+2e\approx\mu+\mu' cadd,0?+cadd,1??s=c0?+c0′?+(c1?+c1′?)?s=c0?+c1??s+c0′?+c1′??s=μ+μ′+2e≈μ+μ′。這里我們假設 e e e 是可以忽略的。
這意味著,如果你對密文進行加法操作,并將其解密,你將得到明文的加法結果!這意味著通過這個簡單的方案,你可以允許某人在加密的數據上進行加法操作,而用戶仍然可以解密它并得到正確的結果。這是我們朝著同態加密方案邁出的第一步。
Multiplication
然而,我們仍然需要定義密文上的乘法,這更加復雜。事實上,我們的目標是找到一個密文 c mult c_{\text{mult}} cmult?,當我們用秘密密鑰 s s s 進行解密時,我們得到明文的乘積。
由于兩個密文的乘法更加復雜,我們現在將重點放在將密文與明文相乘上,并在以后的文章中看看如何在密文之間進行乘法運算。
假設我們有一個明文 μ \mu μ,加密為密文 c = ( c 0 , c 1 ) c=(c_0,c_1) c=(c0?,c1?),以及另一個明文 μ ′ \mu' μ′。那么要獲得乘法的密文,我們只需要輸出 c mult = ( μ ′ ? c 0 , μ ′ ? c 1 ) c_{\text{mult}}=(\mu'\cdot c_0,\mu'\cdot c_1) cmult?=(μ′?c0?,μ′?c1?)。
確實,當解密 c mult c_{\text{mult}} cmult? 時,我們得到 μ ′ ? c 0 + μ ′ ? c 1 ? s = μ ′ ? ( c 0 + c 1 ? s ) = μ ′ ? ( μ + e ) = μ ′ ? μ + μ ′ ? e ≈ μ ′ ? μ \mu'\cdot c_0+\mu'\cdot c_1\cdot s=\mu'\cdot (c_0+c_1\cdot s)=\mu'\cdot (\mu+e)=\mu'\cdot \mu+\mu'\cdot e\approx\mu'\cdot \mu μ′?c0?+μ′?c1??s=μ′?(c0?+c1??s)=μ′?(μ+e)=μ′?μ+μ′?e≈μ′?μ。
因此,通過這種加法和乘法的實現,我們已經看到可以加密一些數據,對其進行操作,然后解密后得到與對明文數據進行計算相同的結果。
由于我們還有一些其他概念要解決,例如密文-密文乘法、重線性化和重新縮放,我們暫時不會涵蓋代碼實現。一旦我們掌握了所有的基本組件,我們將把一切都組合在一起,構建一個端到端的近似同態加密方案,類似于CKKS!
所以我希望你理解了如何使用RLWE構建同態加密方案,并且下一步是密文-密文乘法!