本篇文章翻譯於CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION,主要介紹CKKS方案的加密和解密。
介紹
在上一篇 CKKS Part2: CKKS的編碼和解碼 中,我們看到了如何實現CKKS的編碼器和解碼器,這使我們能夠將向量轉換為多項式,反之亦然。這一步是必要的,因為我們將看到,與直接使用向量相比,使用多項式構建同態加密方案要高效得多。
在本文中,我們將看到如何使用困難問題,例如LWE或RLWE來構建近似同態加密方案。CKKS使用近似演算法而不是精確演算法,這意味著一旦我們完成計算,我們可能會得到與直接計算略有不同的結果。這意味著,如果你加密2和3,將其密文相加,然後解密,你可能會得到4.99或5.01,但不是5。其他方案,如BFV是精確的,這意味著他們將產生正好5。
那為什麼要用CKKS呢?CKKS更適用於實數運算,我們可以得到近似但接近的結果,而BFV更適用於整數運算。
在本文中,我們將看到如何使用LWE和RLWE實現近似算術同態加密方案的加密和解密。
LWE
CKKS是一種公鑰加密方案,其中生成一個私鑰和一個公鑰。公鑰用於加密,可以共享,私鑰用於解密,必須保密。
CKKS的基礎和許多其它同態加密方案,是在論文 On lattices, learning with errors, random linear codes, and cryptography 中引入的誤差學習(LWE)問題,它最初是在格上、誤差學習、隨機線性碼和密碼學中引入的。LWE問題是區分形式為\((a_i,b_i)=(a_i,<a_i,s>+e_i)\)的噪聲對和隨機選取的(a_i,b_i)。這是\(a_{i},s\in Z_{q}^{n}\),ai是隨機取樣,s是我們的私鑰,\(e_i∈ℤ^q\)是噪聲,通常是高斯噪聲,用來使問題變得更難。如果我們不引入e,這個問題會更容易解決,因為我們可以使用高斯消去法來解線性方程組。
眾所周知,LWE問題和最壞情況下的格上問題一樣困難,後者目前可以抵禦量子計算機的攻擊。因此,我們可以利用這樣一個事實,即從成對的\((a_i,<a_i,s>+e_i)\)中找到一個祕密s是困難的,並在此基礎上構建一個密碼系統。
假設我們已經生成了一個私鑰s∈ℤ,,併發布n對型別\((a_i,<a_i,s>+e_i)\),可以用矩陣形式寫成(A,A.s+e)和\(A∈ℤ^{n×n}_q\),\(e∈ℤ^n_q\)。正如LWE問題所述,很難從這對資訊中恢復私鑰,因此我們可以使用它來建立公鑰。
實際上,我們將使用p=(−A.s+e,A)作為我們的公鑰,可以公開使用,因為金鑰很難從中提取。我們選擇了儲存−A.s.而不是A.s.是為了方便,我們將在後面看到,但這並不能改變問題。
然後對訊息\(m∈ℤ^n_q\)使用公鑰和私鑰進行加密和解密,我們可以使用以下方案:
使用p對m進行加密:輸出\(c=\left( \mu ,0 \right)+p=\left( \mu -A.s+e,A \right)=\left( c_{0,}c_{1} \right)\)。
使用s對c進行解密,輸出\(u'=c_{0}+c_{1}.s=\mu -A.s+e+A.s=\mu +e 約等於u\)
所以在加密階段,我們使用公鑰來遮蔽我們的訊息。因此,訊息隱藏在密文的第一個元素中,並帶有掩碼−A.s。請記住,A是均勻取樣的,因此它確實可以有效地遮蔽μ。要刪除它,我們可以使用c的第二個座標,它只儲存A,並將其與金鑰s結合,以獲得μ+e的解密。注意這裡我們並沒有得到原始資訊μ,而是μ加上一些噪聲e,這就是為什麼我們說我們有一個近似的算術方案。如果e足夠小,那麼解密將接近原始μ。
因此,我們在這裡看到了如何使用LWE問題來構建一個公鑰密碼方案,該方案可以抵禦量子攻擊。上述實現的問題在於,私鑰大小\(\Theta \left( n \right)\) ,則公鑰大小由於矩陣A和計算操作為\(\Theta \left( n^{2} \right)\)。由於n將決定我們方案的安全性,如果我們使用LWE來構造我們的方案,它在實踐中效率太低,金鑰的大小\(\Theta \left( n^{2} \right)\)和複雜性會使其變得太不切實際。
RLWE
這就是為什麼我們會考慮在理想格上引入誤差問題的環學習和環上誤差的學習,這是LWE的一個變種,但在環上。即所有的運算不是向量\(\Zeta _{q}^{n}\)之間的運算,而不是在環上\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\),N是2的次冪。現在a,s,e從\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\)上取樣,其中a仍然均勻取樣,s是一個小祕密多項式,e是一個小噪聲多項式。切換到RLWE有兩個主要優點:
金鑰大小不再是二次的,而是線性的,因為我們現在輸出公鑰p=(−a.s+e,a),其中a.s表示a與s的多項式乘積。因為所有操作都是在多項式之間完成的,所以私鑰和公鑰的大小都是一樣的\(\Theta \left( n \right)\) 。
乘法是在多項式上進行的,因此它的複雜性為\(\Theta \left( n\log \left( n \right) \right)\)使用Discrete Fourier Transform for polynomial multiplication,離散傅立葉變換進行多項式乘法,而不是\(\Theta \left( n^{2} \right)\)因為我們必須做矩陣向量乘法。
因此,通過使用RLWE而不是LWE,我們將獲得更小的金鑰,運算速度將更快,因此前面的方案變得更加實用。此外,RLWE仍然是一個難題,並提供了強大的安全保障,因此使用RLWE仍然提供了一個安全方案。
我們知道為什麼使用多項式很重要,因為它們為高效安全的方案提供了基礎。所以你現在可以理解為什麼我們要費盡心機把向量轉換成多項式\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\),反之亦然,因為我們現在可以利用多項式環的代數結構。
同態計算
現在,我們已經明白了為什麼我們要研究\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\),以及如何基於此獲得加密方案,讓我們看看如何在密文上定義加法和乘法,從而獲得同態加密方案。
所以我們說我們有一個私鑰s和一個公鑰p=(b,a)=(−a.s+e,a)。要加密訊息μ,我們只需輸出c=(μ+b,a),要用s解密它,我們計算c0+c1.s將大致給出原始資訊。
加法
現在假設我們有兩條訊息μ和μ′,我們將它們加密為\(c=(c_0,c_1)\)和\(c′=(c′_0,c′_1)\)。那麼\(c_{add}=c+c′=(c_0+c′_0,c_1+c′_1)\)是μ+μ′的正確加密,也就是說,當我們用s解密它時,我們得到(近似地)μ+μ′。
事實上,\(c_{add}\)的解密機制產生了$$c_{add,0}+c_{add,1}.s=c_{0}+c_{0}'+\left( c_{1}+c_{1}' \right).s=c_{0}+c_{1}.s+c_{0}'+c_{1}'.s=u+u'+2e約等於u+u'$$因為我們說過e可以忽略不計。
這意味著,如果你將密文相加,然後解密,你將得到明文的相加!這意味著,通過這個簡單的方案,您可以允許某人對加密資料執行加法操作,使用者仍然可以解密資料並獲得正確的結果。這是我們走向同態加密方案的第一步。
乘法
儘管如此,我們仍然需要定義密文上的乘法,這更復雜。實際上,我們的目標是找到一個密文結果\(c_{mult}\),這樣當我們用私鑰s解密它時,我們就得到了明文的乘積。
因為兩個密文相乘更復雜,我們現在將首先關注密文與明文相乘,並在後面的文章中瞭解如何在密文之間進行相乘。
下面介紹的是明文乘密文
假設我們有一個明文μ,加密成密文\(c=(c_0,c_1)\)和一個明文μ′。然後,為了獲得乘法的密文,我們只需要輸出\(c_{mult}=(μ′.c_0,μ′.c_1)\)。
事實上,當我們解密\(c_{mult}\)時$$u'.c_{0}+u'.c_{1}.s=u'.\left( c_{0}+c_{1}.s \right)=u'.\left( u+e \right)=u'.u+u'.e約等於u'.u$$
因此,通過這加密資料和明文進行加法和乘法的實現,一旦我們對其進行解密,我們就會得到與對明文資料執行相同操作的結果。
因為我們還有一些操作需要解決,比如密文乘法、重新線性化和重縮放,所以我們現在還不介紹程式碼實現。一旦我們擁有了所有的構建塊,我們將把所有東西放在一起,形成一個端到端的近似同態加密方案,類似於CKKS!
所以我希望你們理解了如何使用RLWE構建同態加密方案,下一站,密文到密文的乘法!