CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION

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?,sZqn? 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?,yZq?}

其中 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 sZqn?,并發布了 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} AZqn×n? e ∈ Z q n e \in \mathbb{Z}_q^n eZqn?。正如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有兩個主要優勢:

  1. 密鑰大小不再是二次的,而是線性的,因為我們現在輸出公鑰 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)
  2. 乘法是在多項式上進行的,因此可以使用離散傅立葉變換進行多項式乘法,復雜度為 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是我們的模量。我們希望生成一個公鑰和一個私鑰來加密和解密消息。

  1. 密鑰生成:

    • 我們首先隨機選擇一個小的秘密多項式 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. 加密:

    假設我們有一個消息 μ = 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)

  3. 解密:

    使用私鑰 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構建同態加密方案,并且下一步是密文-密文乘法!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715592.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715592.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

笨辦法學 Python3 第五版(預覽)(三)

原文:Learn Python the Hard Way, 5th Edition (Early Release) 譯者:飛龍 協議:CC BY-NC-SA 4.0 練習 30:假如 這是你將要輸入的下一個 Python 腳本,它向你介紹了if語句。輸入這個代碼,確保它能夠完美運行…

怎么快速編輯視頻

背景:怎么簡單快速編輯視頻 利用FFmpeg功能,簡單快速編輯視頻,如按9:16提前剪切視頻、替換背景音樂。 下載FFmpeg:https://ffmpeg.org/download.html 將FFmpeg的路徑添加到環境變量中: Windows:在系統的環…

Home-credit海外貸款信貸產品源碼/線上貸款產品大全/貸款平臺軟件源碼/海外借貸平臺

測試環境:Linux系統CentOS7.6、寶塔、PHP7.3、MySQL5.6,根目錄public,偽靜態laravel5,開啟ssl證書 語言:中文簡體、英文 laravel框架的程序有點多,這個團隊估計主要就是搞laravel開發的,基本上…

前端架構: 腳手架通用框架封裝之腳手架注冊和命令注冊開發(教程二)

腳手架注冊和命令注冊 1 )腳手架的注冊 接上文,仍舊在 abc-cli 項目中參考:https://blog.csdn.net/Tyro_java/article/details/136381086之前初始化的時候,使用的是 yargs, 現在我們想要使用 commander在cli包中安裝 commander $…

2024 最新版 Compose material3 下拉刷新

2024 最新版 Compose material3 下拉刷新,版本 > 1.2.0 的 compose material3 已經更新了下拉刷新組件的 Api 見 https://developer.android.com/jetpack/androidx/releases/compose-material3?hlzh-cn#1.2.0 使用方法:https://developer.android.…

YOLOv9獨家原創改進|增加SPD-Conv無卷積步長或池化:用于低分辨率圖像和小物體的新 CNN 模塊

專欄介紹:YOLOv9改進系列 | 包含深度學習最新創新,主力高效漲點!!! 一、文章摘要 卷積神經網絡(CNNs)在計算即使覺任務中如圖像分類和目標檢測等取得了顯著的成功。然而,當圖像分辨率較低或物體較小時&…

可以用來測試的接口

實際開發過程中,我們可以通過postman工具來測試接口 get請求 https://api.github.com/events?id1&nameuser post請求 http://httpbin.org/post 參數1:key1value1 參數2:key2value2

(C語言)回調函數

回調函數是什么? 回調函數就是?個通過函數指針調?的函數。 如果你把函數的指針(地址)作為參數傳遞給另?個函數,當這個指針被?來調?其所指向的函數 時,被調?的函數就是回調函數。回調函數不是由該函數的實現?…

技術閱讀周刊第十四期:常用的 Git 配置

技術閱讀周刊,每周更新。 歷史更新 20231122:第十一期20231129:第十二期20240105:第十三期:一些提高生產力的終端命令20240112:第十四期:Golang 作者 Rob Pike 在 GopherConAU 上的分享 How I w…

探索Manticore Search:開源全文搜索引擎的強大功能

在當今信息爆炸的時代,數據的快速檢索變得至關重要。無論是在電子商務網站、新聞門戶還是企業內部文檔,高效的搜索引擎都是確保用戶滿意度和工作效率的關鍵因素之一。而在搜索引擎領域,Manticore Search 作為一款開源的全文搜索引擎&#xff…

大模型(LLM)的量化技術Quantization原理學習

在自然語言處理領域,大型語言模型(LLM)在自然語言處理領域的應用越來越廣泛。然而,隨著模型規模的增大,計算和存儲資源的需求也急劇增加。為了降低計算和存儲開銷,同時保持模型的性能,LLM大模型…

2024最新算法:鸚鵡優化算法(Parrot optimizer,PO)求解23個基準函數(提供MATLAB代碼)

一、鸚鵡優化算法 鸚鵡優化算法(Parrot optimizer,PO)由Junbo Lian等人于2024年提出的一種高效的元啟發式算法,該算法從馴養的鸚鵡中觀察到的覓食、停留、交流和對陌生人行為的恐懼中汲取靈感。這些行為被封裝在四個不同的公式中…

c語言--qsort函數(詳解)

目錄 一、定義二、用qsort函數排序整型數據三、用qsort排序結構數據四、qsort函數的模擬實現 一、定義 二、用qsort函數排序整型數據 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…

消息隊列kafka

消息隊列解決的問題 1. 解耦&#xff0c;通過消息隊列實現應用之間解耦&#xff0c;模塊兒之間解耦 2. 跨線程/進程通信&#xff0c;通過消息隊列傳遞數據&#xff0c;實現不同線程/進程間通信 3. 提升系統穩定性&#xff0c;在高并發場景通過消息隊列緩沖&#xff0c;可以實…

哈啰Java 春招 24屆

時長 1h 3. 為什么使用分布式ID&#xff0c;解決了什么問題 4. Leaf算法了解嗎&#xff1f;講一下原理和工作流程以及優缺點 5. 有沒有可能導致id重復&#xff1f;該如何解決&#xff1f; 6. 項目中redis是如何運用的&#xff1f; 7. 項目中分布式鎖是如何實現的&#xff1f; 8…

解決在 Mac 上安裝 Adobe 軟件彈出提示:安裝包已經被損壞并且不能被打開。

問題&#xff1a; “INSTALLER” is damaged and can’t be opened. You should eject the disk image. 解決方法和步驟&#xff1a; 打開安裝包&#xff1b;將安裝包 “INSTALLER” 拖動復制到某個文件夾&#xff0c;復制后的文件路徑例如像這樣&#xff1a;/Users/michael…

LLC諧振變換器變頻移相混合控制MATLAB仿真

微?關注“電氣仔推送”獲得資料&#xff08;專享優惠&#xff09; 基本控制原理 為了實現變換器較小的電壓增益&#xff0c;同時又有較 高的效率&#xff0c;文中在變頻控制的基礎上加入移相控制&#xff0c; 在這種控制策略下&#xff0c;變換器通過調節一次側開關管 的開關…

leetcode 熱題 100_盛最多水的容器

題解一&#xff1a; 雙指針遍歷&#xff1a;容量計算公式為min(左高度&#xff0c;右高度)*底部距離&#xff0c;我們可以令底部距離逐步遞減&#xff08;左右兩邊的指針向中部移動&#xff09;。此時對于min(左高度&#xff0c;右高度)&#xff0c;假設較高的線向中部移動&…

帶你玩轉數據結構-單鏈表(適合初學者的文章,講解的很仔細哦)

前言: &#x1f388;個人主頁:&#x1f388; :???初階牛??? &#x1f43b;推薦專欄: &#x1f354;&#x1f35f;&#x1f32f; C語言進階 &#x1f511;個人信條: &#x1f335;知行合一 &#x1f349;本篇簡介:>:講解數據結構中鏈表的知識,;鏈表的分類,c語言實現單鏈…

重學Springboot3-@import注解的作用

重學Springboot3-import注解的作用 1. 引言2. Import 注解的基本用法3. 導入多個配置類4. 使用 Import 導入組件5. 使用 ImportSelector 和 ImportBeanDefinitionRegistrar6. 總結 1. 引言 在 Spring Framework 中&#xff0c;Import 注解是一個重要的元注解&#xff0c;它允許…