本篇文章翻譯於ckks explained, part 3: encryption and decryption,主要介紹ckks方案的加密和解密。在本文中,我們將看到如何使用困難問題,例如lwe或rlwe來構建近似同態加密方案。ckks使用近似演算法而不是精確演算法,這意味著一旦我們完成計算,我們可能會得到與直接計算略有不同的結果。這意味著,如果你加密2和3,將其密文相加,然後解密,你可能會得到4.99或5.01,但不是5。其他方案,如bfv是精確的,這意味著他們將產生正好5。
那為什麼要用ckks呢?ckks更適用於實數運算,我們可以得到近似但接近的結果,而bfv更適用於整數運算。
在本文中,我們將看到如何使用lwe和rlwe實現近似算術同態加密方案的加密和解密。
ckks是一種公鑰加密方案,其中生成乙個私鑰和乙個公鑰。公鑰用於加密,可以共享,私鑰用於解密,必須保密。
ckks的基礎和許多其它同態加密方案,是在** on lattices, learning with errors, random linear codes, and cryptography 中引入的誤差學習(lwe)問題,它最初是在格上、誤差學習、隨機線性碼和密碼學中引入的。lwe問題是區分形式為\((a_i,b_i)=(a_i,+e_i)\)的雜訊對和隨機選取的(a_i,b_i)。這是\(a_,s\in z_^\),ai是隨機取樣,s是我們的私鑰,\(e_i∈ℤ^q\)是雜訊,通常是高斯雜訊,用來使問題變得更難。如果我們不引入e,這個問題會更容易解決,因為我們可以使用高斯消去法來解線性方程組。
眾所周知,lwe問題和最壞情況下的格上問題一樣困難,後者目前可以抵禦量子計算機的攻擊。因此,我們可以利用這樣乙個事實,即從成對的\((a_i,+e_i)\)中找到乙個秘密s是困難的,並在此基礎上構建乙個密碼系統。
假設我們已經生成了乙個私鑰s∈ℤ,,並發布n對型別\((a_i,+e_i)\),可以用矩陣形式寫成(a,a.s+e)和\(a∈ℤ^_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_c_ \right)\)。
使用s對c進行解密,輸出\(u'=c_+c_.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^ \right)\)。由於n將決定我們方案的安全性,如果我們使用lwe來構造我們的方案,它在實踐中效率太低,金鑰的大小\(\theta \left( n^ \right)\)和複雜性會使其變得太不切實際。
這就是為什麼我們會考慮在理想格上引入誤差問題的環學習和環上誤差的學習,這是lwe的乙個變種,但在環上。即所有的運算不是向量\(\zeta _^\)之間的運算,而不是在環上\(\zeta _\left[ x \right]/\left( x^+1 \right)\),n是2的次冪。現在a,s,e從\(\zeta _\left[ x \right]/\left( x^+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^ \right)\)因為我們必須做矩陣向量乘法。
因此,通過使用rlwe而不是lwe,我們將獲得更小的金鑰,運算速度將更快,因此前面的方案變得更加實用。此外,rlwe仍然是乙個難題,並提供了強大的安全保障,因此使用rlwe仍然提供了乙個安全方案。
我們知道為什麼使用多項式很重要,因為它們為高效安全的方案提供了基礎。所以你現在可以理解為什麼我們要費盡心機把向量轉換成多項式\(\zeta _\left[ x \right]/\left( x^+1 \right)\),反之亦然,因為我們現在可以利用多項式環的代數結構。
現在,我們已經明白了為什麼我們要研究\(\zeta _\left[ x \right]/\left( x^+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_=c+c′=(c_0+c′_0,c_1+c′_1)\)是μ+μ′的正確加密,也就是說,當我們用s解密它時,我們得到(近似地)μ+μ′。
事實上,\(c_\)的解密機制產生了$$c_+c_.s=c_+c_'+\left( c_+c_' \right).s=c_+c_.s+c_'+c_'.s=u+u'+2e約等於u+u'$$因為我們說過e可以忽略不計。
這意味著,如果你將密文相加,然後解密,你將得到明文的相加!這意味著,通過這個簡單的方案,您可以允許某人對加密資料執行加法操作,使用者仍然可以解密資料並獲得正確的結果。這是我們走向同態加密方案的第一步。
儘管如此,我們仍然需要定義密文上的乘法,這更複雜。實際上,我們的目標是找到乙個密文結果\(c_\),這樣當我們用私鑰s解密它時,我們就得到了明文的乘積。
因為兩個密文相乘更複雜,我們現在將首先關注密文與明文相乘,並在後面的文章中了解如何在密文之間進行相乘。
下面介紹的是明文乘密文假設我們有乙個明文μ,加密成密文\(c=(c_0,c_1)\)和乙個明文μ′。然後,為了獲得乘法的密文,我們只需要輸出\(c_=(μ′.c_0,μ′.c_1)\)。
事實上,當我們解密\(c_\)時$$u'.c_+u'.c_.s=u'.\left( c_+c_.s \right)=u'.\left( u+e \right)=u'.u+u'.e約等於u'.u$$
因此,通過這加密資料和明文進行加法和乘法的實現,一旦我們對其進行解密,我們就會得到與對明文資料執行相同操作的結果。
因為我們還有一些操作需要解決,比如密文乘法、重新線性化和重縮放,所以我們現在還不介紹**實現。一旦我們擁有了所有的構建塊,我們將把所有東西放在一起,形成乙個端到端的近似同態加密方案,類似於ckks!
所以我希望你們理解了如何使用rlwe構建同態加密方案,下一站,密文到密文的乘法!
10個樣式各異的CSS3 Loading載入動畫
前幾天我在園子裡分享過2款很酷的css3 loading載入動畫,今天又有10個最新的loading動畫分享給大家,這些動畫的樣式都不一樣,實現起來也並不難,你很容易把它們應用在專案中,先來看看效果圖 你也可以在這裡檢視demo演示。下面我們來挑選幾個比較典型的案例來分析一下 先來看看第乙個案例,是...
3D建模的時候怎麼在模型上加字?
3d建模時希望能在模型上寫字。建模的時候就要加字,就貼圖上去 貼圖?不可以直接寫嗎?你們的3d建模模型編輯器怎麼貼圖?直接寫,可要在thingjs用api來寫 謝謝大佬 艾琪 您是問費用?還是問文件?我們費用沒有複雜到要出文件的地步 後續地圖製作費用,能簡單說一下嗎 就是後續我們要做地圖是不是你們來...
Unity 3D 關於給APK包加廣告的流程
第一步 是先用 eclipse新建乙個安卓的應用。在androidmanifest.xml的檔案中,新增許可權如下,許可權功能不多說。廣告的sdk說明上應該說的很清楚。然後新增廣告的標籤,像這樣的 也都在廣告的sdk裡面有解釋 然後androidmanifest.xml的檔案已經完成了。第二步 匯入...