如今,標準(非同態(tài))加密的安全性已經(jīng)被很好的理解。通常有兩種形式:加密方案只能抵御被動攻擊者(可以查看加密數(shù)據(jù)但不能操縱它),或者也可以抵御主動攻擊者可以操縱加密的數(shù)據(jù),然后觀察如何解密。
較弱(被動)概念的加密術(shù)語是“CPA-security”,而較強的概念稱為“CCA-security”。(這些首字母縮寫分別代表“選擇明文攻擊”和“選擇密文攻擊”。)
眾所周知,要保護靜態(tài)或傳輸中的數(shù)據(jù),必須使用CCA安全加密。如果將加密功能作為較大系統(tǒng)中的一個組件,而該系統(tǒng)中的其他組件則提供了針對活動攻擊者的保護,則CPA安全性就足夠了。
對于同態(tài)加密(HE)方案,眾所周知,它們本質(zhì)上不能CCA安全。其非CCA安全性的后果之一是,系統(tǒng)必須確保永遠不要將解密應(yīng)用于無效的密。
實際上,對于目前的全同態(tài)加密方案,允許攻擊者提交要解密的無效密文通常會導致密鑰泄露。因此,全同態(tài)加密方案通常會采用CPA安全性,并依靠周圍的系統(tǒng)來提供可能需要的額外保護。
Li和Micciancio最近觀察到,對于近似全同態(tài)加密方案,CPA安全性的通用概念可能甚至不足以應(yīng)對被動攻擊者。
關(guān)鍵區(qū)別在于,由于該方案本身會增加一些錯誤,如果攻擊者知道解密結(jié)果應(yīng)該是什么,攻擊者也可以從解密結(jié)果中學到一些東西。具體來說,它能夠?qū)W習錯誤,這可能會泄漏有關(guān)密鑰的信息。
Li和Micciancio描述了對CKKS近似全同態(tài)加密方案的簡單攻擊,該攻擊在看到少量解密結(jié)果(有時只有一次解密)后可以破解密鑰。
如何減輕Li-Micciancio襲擊
針對此觀察,HElib現(xiàn)在包括減輕這種風險的對策。特別是,對CKKS的HElib解密函數(shù)進行了修改,以添加一些與密鑰無關(guān)的噪聲,從而掩蓋了與密鑰有關(guān)的噪聲,并使Li-Micciancio攻擊更難以奏效。
但是,這種額外的噪聲降低了解密結(jié)果的準確性。默認情況下,選擇與密鑰無關(guān)的噪聲的大小在HElib為解密密文而保留的噪聲范圍之內(nèi),但是該范圍可能過于保守,因此添加的噪聲有時可能會導致準確性顯著降低。因此,HElib為應(yīng)用程序提供了指定解密所需精度的方法,然后將在此精度約束下添加最大數(shù)量的噪聲。
使用CKKS的應(yīng)用程序需要找到一條能平衡安全性,準確性和性能的方法。下面,我們在考慮這些方面的同時,描述了一個用于開發(fā)基于CCKS的應(yīng)用程序的框架。粗略地,我們建議應(yīng)用程序嘗試對錯誤進行嚴格估算,然后使用該估算值代替HElib計算的噪聲范圍。
1.首先確定應(yīng)用程序需要應(yīng)用于數(shù)據(jù)的(類別)流程;
2.從處理結(jié)果中確定所需的精度;
3.在測試數(shù)據(jù)上的HElib中運行這些過程,以確定要使用的參數(shù),大致如下:
i.找到一些參數(shù)設(shè)置,其中context.securityLevel()返回足夠高的安全性,并且?guī)觳粓蟾娼饷苠e誤;
ii.當使用步驟2中的精度參數(shù)調(diào)用時,通過實驗找到解密結(jié)果的噪聲大小的一個相當緊密的邊界。這可以通過多次運行HElib處理來實現(xiàn),并將解密的結(jié)果與對明文數(shù)據(jù)進行相同處理時得到的結(jié)果進行比較;
iii.比較從上面3.2步得到的噪聲邊界和HElib在解密之前計算的估計誤差,后者可以通過ctxt.errorBound()訪問。如果實驗噪聲明顯小于ctx.errorbound()返回的噪聲,那么在解密之前使用ctx.bumpnoisebound()來強制HElib使用更嚴格的誤差估計。
iv.重復步驟3.1-3.3,增加參數(shù),直到解密不再發(fā)出有關(guān)所添加噪聲太小的警告。
現(xiàn)在,我們將詳細介紹每個步驟。
步驟1-2過程和所需的精度
與全同態(tài)加密的任何應(yīng)用程序一樣,起點是確保足夠的功能。因此,開發(fā)人員必須確定要計算的運算和所需的輸出精度。一些應(yīng)用程序只需要計算一個功能,而其他應(yīng)用程序則需要處理更廣泛的功能,但是至少開發(fā)人員應(yīng)該確定所支持電路的最大深度和所需的最大精度。
在HElib中,應(yīng)用程序可以指定用于加密明文數(shù)據(jù)的輸入精度,并且電路中的每個級別都將精度降低一位(或最多1.5位),即,每個級別的誤差大約翻倍。例如,使用輔助類PtxtArray可以調(diào)用ptxt.encrypt(ctxt,ptxtMagnitude,precision),這將導致給定輸入明文的加密,并且錯誤以2精度為邊界。在計算了一個三層深度的電路(例如)之后,誤差將增加到超過23個精度。在計算深度d電路之后,需要p位輸出精度的應(yīng)用程序應(yīng)以p+d到p+3d/2之間的輸入精度進行加密。
步驟3查找匹配參數(shù)
在確定了所需的深度d和輸出精度p之后,應(yīng)用程序開發(fā)人員需要找到一些在確保安全性的前提下產(chǎn)生該輸出精度的參數(shù)。這通常涉及迭代的反復試驗過程,如下所示:
1.從對參數(shù)的一些粗略估計開始:深度d電路所需的模數(shù)的總位長通常約為,使用該模數(shù)獲得128位安全性所需的環(huán)尺寸約為(取整為2的冪,因為目前的CKKS支持在HElib只測試了2的冪次環(huán))
用m表示大于的2的下一個冪,然后可以使用ContextBuilder類在HElib中設(shè)置這些初始參數(shù),設(shè)置
Context context=ContextBuilder<CKKS>().m(m).bits(16*(d+1)).precision(p+d).c(3).build();
注意,上面指定的位數(shù)僅為而不是,并且存在一個神秘的附加參數(shù)c=3,它滿足。是對深度d電路所需的估計,而HElib中的總模數(shù)位數(shù)按大致獲得。(請參閱HElib文檔中有關(guān)密文與特殊素數(shù)的討論,第5.1節(jié)。)
通過將c參數(shù)從其默認值c=3增加,可以使相同功能的總位大小略小,但是密鑰大小和運行時間會增加與c幾乎成線性關(guān)系。
設(shè)置完這些參數(shù)后,運行HElib處理并檢查庫是否出現(xiàn)可能的解密錯誤,并使用這些實驗增加或減少位和m參數(shù)。您還應(yīng)該使用接口context.securityLevel()來檢查參數(shù)m,bits,precision和c的組合是否產(chǎn)生可接受的安全級別。
2.檢查這些參數(shù)確實產(chǎn)生所需的輸出精度。即運行HElib處理的幾個實驗,使用可選的控制精度的參數(shù)(例如,使用ptxtArray類的接口ptxt.rawDecrypt(ctxt,secretKey))解密結(jié)果,并將結(jié)果與明文處理結(jié)果進行比較。(這時,您應(yīng)忽略HEib的任何有關(guān)增加的噪聲過小的警告。)重新檢查上述步驟1中的參數(shù),直到安全性和輸出精度均可接受為止。
3.接下來,檢查在解密之前HElib通過ctxt.errorBound()報告的錯誤界限,與上一步中觀察到的實際錯誤(大概不超過)有關(guān)。如果HElib估算值明顯大于實際噪聲,則在解密之前使用ctxt.bumpNoiseBound()強制HElib使用“正確估算值”。
4.此時,您需要切換到使用ptxt.decrypt(ctxt,secretKey,p)并檢查HElib在解密時不再發(fā)出警告消息,說明添加的噪聲太小。如果仍然看到該警告,則需要重新訪問參數(shù)設(shè)置,增加bits參數(shù)(以及保持安全性和精度所需的其他參數(shù)),直到不再顯示此警告為止。
最后指出,此過程僅適用于威脅模型包括僅獲得少數(shù)解密結(jié)果的對手的情況。如果對手可獲得的有關(guān)解密查詢的信息總量大得多,則應(yīng)用程序需要從上方增加bits參數(shù)。特別是,為了抵御可以訪問D密文解密結(jié)果的攻擊,應(yīng)該將bits參數(shù)粗略地增加D倍,并且將輸入精度參數(shù)類似地增加到D(p+d)。
在HElib中,如果密文是使用庫的加密和計算例程生成的,則密文是有效的,并且不會包含太多噪聲。特別是,使用解密不應(yīng)發(fā)出有關(guān)“太多噪聲解密”的警告。
ptxtMagnitude和precision參數(shù)是可選的,默認值取決于上下文和要加密的實際明文。重要的是,精度(如果指定)表示的是絕對數(shù)字,而不是明文大小的一小部分。例如,調(diào)用precision=3將產(chǎn)生1/8大小的錯誤,無論調(diào)用ptxtMagnitude=16,還是ptxtMagnitude=1。最后請注意,精度參數(shù)也可以是負值,表示誤差幅度大于1。