世界上有几个研究小组已经为应用程序和通用用途提供了用于通用同态加密的库.如[SEAL],[HElib],[PALISADE],[cuHE],[cuFHE],[NFLlib],[HEAAN],[TFHE].大多数用于同态加密的通用库都实现了基于多项式环上带错误学习(RLWE)问题的方案,其中许多库都显示了底层环、错误分布和其他参数的常见选择。
同态加密是一项突破性的新技术,它可以实现私有云存储和云计算解决方案,并且过去几年文献中描述了许多应用。但是,在同态加密被应用于医疗、健康和金融领域以保护数据以及患者和消费者隐私之前,它必须经过标准化,很可能由多个标准化机构和政府机构进行标准化。标准化的一个重要部分是对不同参数集的安全级别达成广泛一致。尽管研究社区已经进行了广泛的研究和基准测试,为这项工作奠定了基础,但很难在一个地方找到所有信息,以及针对应用程序和部署的具体参数建议。
本文档试图获取(至少部分)关于这些方案的当前已知安全状态的集体知识,以指定方案,并推荐用于各种安全级别的同态加密的广泛参数选择。我们描述了已知的攻击及其估计的运行时间,以便提出这些参数建议。我们还描述了这些加密方案的附加特性,使它们在不同的应用程序和场景中有用。
1标准化要使用的加密方案
1.1介绍符号和定义
-ParamGen(λ, PT, K, B) → Params
参数生成算法用于实例化下面概述的HE算法中使用的各种参数。作为输入,它需要:
- 𝜆 表示方案所需的安全级别。 如,128bit安全 (𝜆 = 128) 或 256-bit安全。
-PT 表示底层明文空间。 目前该标准规定了两种类型的参数化明文空间:模整数modular integers(MI)和扩域/环 (EX). 预计,后期会引入第三种类型的近似数approximate numbers (AN).
—(MI)modular integers模整数,用待加密的明文数字的模p来参数化,即明文空间为Zp。例如,参数p=1024 表示明文空间是Z1024。消息m的每个单独元素是取自 [0, 1023]的整数。每个元素进行运算都要模p。
—(EX)EXtension fields/Rings 由上面的模p和Zp上的多项式f(x)参数化,具体的明文空间是Z[x]/(p,f(x)).也就是说,消息空间的每个元素都是一个整数多项式,其次数小于deg(f(x))且系数取自[0,p-1]上的整数。所有对单个元素的运算都要模f(x),模p.
-𝐾表示待加密向量的维数。如,𝐾=100,PT=(MI,1024)表示消息加密成向量
(
V
1
,
.
.
.
,
V
K
)
,
V
i
(V_1,...,V_K),V_i
(V1,...,VK),Vi取自[0,1023]上整数,运算是按照对应元素进行的。即加法定义为
(
V
1
,
.
.
.
,
V
k
)
+
(
V
1
′
,
.
.
.
,
V
k
′
)
=
(
V
1
+
V
1
′
,
.
.
.
,
V
k
+
V
K
′
)
(V_1,...,V_k)+(V'_1,...,V'_k)=(V_1+V'_1,...,V_k+V'_K)
(V1,...,Vk)+(V1′,...,Vk′)=(V1+V1′,...,Vk+VK′),乘法相同对应分量相乘。所有可能的
(
V
1
,
.
.
.
,
V
K
)
,
V
i
(V_1,...,V_K),V_i
(V1,...,VK),Vi向量集合称为消息空间(MS)。
-𝐵: 表示辅助参数它用来控制加密信息运行的程序/电路的复杂度。较低的参数表示“较小”,或较少表达,或较不复杂的程序/电路。 较低的参数通常意味着整个方案的较小参数。 因此,这可以转化为更小的密文和更有效的Eva运算。 较高的参数通常会增加密钥大小、密文大小和评估过程的复杂性。 当然,Eva更复杂的程序需要更高的参数。
-PubKeygen(Params) → SK, PK, EK
公钥生成算法用于生成一对私钥和公钥。任何人都可以共享和使用公钥来加密消息。密钥应该由用户保密并可用于解密消息。该算法还生成对密文执行同态操作所需的Eva密钥。它应该被赋予任何将对密文执行同态操作的实体。任何仅拥有公共密钥和评估密钥的实体都无法仅从密文中了解有关消息的任何信息。
-SecKeygen(Params) → SK, EK
密钥生成算法用于生成密钥。该方案需要此密钥对消息进行加密和解密。它应该被用户保密。该算法还生成对密文执行同态操作所需的Eva密钥。Eva密钥应该给任何将对密文执行同态操作的实体。任何仅拥有评估密钥的实体都无法仅从密文中了解有关消息的任何信息。
-PubEncrypt(PK, M) → C
公钥加密算法将方案的公钥和消息空间中的任意消息M作为输入。该算法输出一个密文c。该算法一般需要随机化(即使用随机或伪随机币)来满足安全性。
-SecEncrypt(SK, M) → C
秘密加密算法以方案的秘密密钥和消息空间中的任意消息M作为输入。该算法输出一个密文c。该算法一般需要随机化(即使用随机或伪随机币)来满足安全性。
-Decrypt(SK, C) → M
解密算法以方案的秘钥SK和密文c作为输入,从消息空间中输出消息M。如果解密不能成功恢复加密消息M,算法也可能输出特殊符号FAIL。
-EvalAdd(Params, EK, C1, C2) → C3.
EvalAdd是一种随机化算法,它以系统参数Params、评估密钥EK、两个密文C1和C2作为输入,输出一个密文C3。EvalAdd的正确性是,如果C1是明文元素M1的加密,C2是明文元素M2的加密,那么C3应该是M1+M2的加密。
-EvalAddConst(Params, EK, C1, M2) → C3.
EvalAddConst是一种随机算法,它以系统参数Params、评估密钥EK、密文C1和明文M2作为输入,输出密文C3。EvalAddConst的正确性是,如果C1是明文元素M1的加密,那么C3应该是M1+M2的加密。
-EvalMult(Params, EK, C1, C2) → C3.
EvalMult是一种随机化算法,它以系统参数Params、评估密钥EK、两个密文C1和C2作为输入,输出一个密文C3。EvalMult的正确性是,如果C1是明文元素M1的加密,C2是明文元素M2的加密,那么C3应该是M1*M2的加密。
-EvalMultConst(Params, EK, C1, M2) → C3.
EvalMultConst是一种随机化算法,它以系统参数Params、评估密钥EK、密文C1、明文M2作为输入,输出密文C3。EvalMultConst的正确性是,如果C1是明文元素M1的加密,则C3应该是M1*M2的加密。
-Refresh(Params, flag, EK, C1) → C2.
Refresh是一种随机算法,它将系统参数Params(一个多值标志)作为输入(可以是“relineearize”,“ModSwitch”或“Bootstrap”中的任何一个),评估密钥EK和密文C1,并输出密文C2。Refresh的正确性是,如果C1是明文元素M1的加密,那么C2也应该是M1的加密。Refresh算法的期望属性是,它将消息的“复杂”密文转换为“简单”的一个加密相同的消息。刷新算法的两个实例为(a) bootstrapping过程,该过程接受具有较大噪声的密文,并输出具有固定噪声量的同一消息的密文;(b)密钥交换过程,取一个密钥下的密文,输出同一消息在另一个密钥下的密文。
-ValidityCheck(Params, EK, [C], COMP) → flag.
ValidityCheck是一种算法,它输入Params,(Eva密钥)EK,一组密文[C],以及一种用直线程序COMP编码的同态计算规范,并输出一个布尔标志。
ValidityCheck的正确性是,如果ValidityCheck输出flag = 1,那么对密文向量[C]进行同态计算COMP会产生一个解密为正确答案的密文。
1.2定义同态加密的安全属性
Semantic Security or IND-CPA Security: 在高层次上,如果没有对手有优势猜测(超过50%的机会)给定的密文是否是两个同样可能的不同消息中的一个的加密,则同态加密方案被认为是安全的。这就要求对加密进行随机化处理,以便同一消息的两个不同加密看起来不一样。
假设用户运行parameters和key-generation算法来提供密钥元组。假设攻击者拥有Parameters、评估密钥EK、公钥PK(仅在公钥方案中),并且可以获得其选择的消息加密。然后给攻击者提供其选择的两个消息之一的加密,由上述加密算法计算,而不知道加密对应于哪个消息。然后,HE的安全性保证攻击者无法猜测加密对应的消息,以大于50%的显著优势可能性。则得到一个事实即在密文中没有透露有关消息的信息。
Compactness: 同态加密方案的compactness保证了对密文的同态操作不会增加密文的长度。也就是说,任何Evaluators都可以执行任意支持的求值函数调用列表,并在密文空间中获得密文(这与求值函数的复杂性无关)。
Efficient decryption: 高效解密特性是指同态加密方案始终保证解密运行时不依赖于对密文求值的函数Eva。
1.3介绍BGV和BFV方案
在本节中,我们描述了实现同态加密的两种主要方案,[BGV12]和[B12]/[FV12],这两种方案非常相似。
我们在这里重点描述BGV加密方案的基本版本。对基本方案的优化将在本节的最后讨论。
-BGV.ParamGen(λ, PT, K, B) → Params.
回想一下,λ是安全级别参数。对于BGV,明文空间PT为MI型或EX型,其整数模p > 1, K≥1为整数向量长度。
在基本的BGV方案中,辅助输入B是一个整数,它决定了同态计算的最大乘法深度。这只是执行计算所需的顺序乘法的最大数量。例如,函数
g
(
x
1
,
x
2
,
x
3
,
x
4
)
=
x
1
x
2
+
x
3
x
4
g(x_1,x_2,x_3,x_4)=x_1x_2 +x_3x_4
g(x1,x2,x3,x4)=x1x2+x3x4的乘法深度为1。
在基本的BGV方案中,参数param包括密文模数𝑞和环𝑅=𝑍[𝑥]/𝑓(𝑥)和对应的明文环𝑅/𝑝𝑅和密文环𝑅/𝑞𝑅。参数param还指定了一个“密钥分布”𝐷1和一个“错误分布”𝐷2在𝑅上,后者是基于一个具有标准偏差
σ
\sigma
σ的高斯分布根据安全指南中规定的。详见2.5.
-BGV.SecKeygen(params)→SK, EK
在基本的BGV方案中,密钥𝑆𝐾是从分布𝐷1中选择的环𝑅中的一个元素𝑠。在基本的BGV方案中,没有Eva密钥EK。
-BGV.PubKeygen(params) → SK, PK, EK.
在基本的BGV方案中,PubKeygen首先运行SecKeygen并获得
(
S
K
,
E
K
)
(SK,EK)
(SK,EK),其中𝑆𝐾是一个元素
𝑠属于环𝑅。
PubKeygen从环𝑅/𝑞𝑅选择一个随机元素并输出的公钥𝑃𝐾是一对环元素(𝑝𝑘0,𝑝𝑘1)=(−𝑎,𝑎𝑠+𝑝𝑒)其中𝑒取自误差分布𝐷2。
-BGV.SecEncrypt(SK, M) → C
在基本的BGV方案中,SecEncrypt首先将来自明文空间的消息𝑀(
Z
p
r
Z_p^ r
Zpr或
(
Z
p
[
x
]
/
f
(
x
)
)
r
(Z_p[x]/f(x))^r
(Zp[x]/f(x))r)映射变成环
R
/
p
R
R/pR
R/pR的一个元素
M
^
\hat{M}
M^。
SecEncrypt然后从环
R
/
p
R
R/pR
R/pR均匀随机取样
a
a
a并输出的一对环元素
(
c
0
,
c
1
)
=
(
−
a
,
a
s
+
p
e
+
M
)
(c_0,c_1)=(-a,as+pe+M)
(c0,c1)=(−a,as+pe+M)𝑒取自误差分布𝐷2。(关于在加密期间对消息进行编码的更一般的方法,请参阅下面的注释1和2。同样的注释也适用于使用BGV的公钥加密。)
-BGV.PubEncrypt(PK, M) → C
在基本的BGV方案中,Pub.Encrypt首先将来自明文空间
Z
p
k
Z_p^k
Zpk的消息𝑀映射到环𝑅/𝑝𝑅的元素
M
^
\hat{M}
M^。回想一下,公钥
P
K
PK
PK是一对元素
(
p
k
0
,
p
k
1
)
(pk_0,pk_1)
(pk0,pk1).
然后Pub.Encrypt取样三个元素,
u
u
u取自分布
D
1
D_1
D1,
e
1
,
e
2
e_1,e_2
e1,e2取自错误分布
D
2
D_2
D2并输出一对环元素
(
c
0
,
c
1
)
=
(
p
k
0
u
+
p
e
1
,
p
k
1
u
+
p
e
2
+
M
^
)
(c_0,c_1)=(pk_0u+pe_1,pk_1u+pe_2+\hat{M})
(c0,c1)=(pk0u+pe1,pk1u+pe2+M^).
-BGV.Decrypt(SK, C) → M
在基本的BGV方案中,Decrypt将秘钥(即环𝑅中的一个元素𝑠)和密文(即来自环𝑅/𝑞𝑅的一对元素
C
=
(
c
0
,
c
1
)
C=(c_0,c_1)
C=(c0,c1)作为输入。
我们注意到,作为加密算法的输出而产生的密文有两个元素都在𝑅/𝑞𝑅上,但在同态评估,密文可以增长到有更多的环元素。可以适当修改解密算法以处理此类密文。
Decrypt首先计算𝑅/𝑞𝑅上的环元素
c
0
s
+
c
1
c_0s+c_1
c0s+c1,并将其解释为环𝑅中的元素𝑐’。然后计算输出的𝑅/𝑝𝑅的一个元素𝑐’ (mod𝑝),即为输出。
-BGV.EvalAdd(Params, EK, C1, C2) → C3.
在基本BGV方案,EvalAdd作为输入密文 c 1 = ( c 1 , 0 , c 1 , 1 ) , c 2 = ( c 2 , 0 , c 2.1 ) c1=(c_{1,0},c_{1,1}),c2=(c_{2,0},c_{2.1}) c1=(c1,0,c1,1),c2=(c2,0,c2.1)输出 c 3 = ( c 1 , 0 + c 2 , 0 , c 1 , 1 + c 2 , 1 ) c3 =(c_{1,0}+c_{2,0},c_{1,1}+c_{2,1}) c3=(c1,0+c2,0,c1,1+c2,1),运算在环𝑅/𝑞𝑅中完成。
-BGV.EvalMult(Params, EK, C1, C2) → C3.
在基本BGV方案,EvalMult作为输入密文 c 1 = ( c 1 , 0 , c 1 , 1 ) , c 2 = ( c 2 , 0 , c 2.1 ) c1=(c_{1,0},c_{1,1}),c2=(c_{2,0},c_{2.1}) c1=(c1,0,c1,1),c2=(c2,0,c2.1)和输出𝐶3 =(𝑐1𝑐1 0𝑐2 0,0𝑐2 1 +𝑐1 1𝑐2,0,𝑐1,1𝑐2,1),在操作中完成𝑅/𝑞𝑅。
注释1:根据误差采样过程,可以将加密过程中的噪声项
p
e
+
M
^
pe+\hat{M}
pe+M^推广为从陪集
M
^
+
p
R
\hat{M}+pR
M^+pR中提取的噪声项。下面讨论的关于误差分布𝐷2的所有注意事项同样适用于这个更通用的实现中的误差抽样过程。
注释2:对于BGV加密的message还有一种等价的MSB编码,message编码为
W
M
^
+
e
W\hat{M}+e
WM^+e(
W
=
⌊
q
/
p
⌋
W=\lfloor q/p \rfloor
W=⌊q/p⌋,于如下BFV方案相同)。这两种编码方式可以无损转换,只要密文模数p和明文模数q互素。
完整的BGV方案
在基本的BGV方案中,密文由于EvalMult而增长。例如,给定两个密文,每个密文由两个环元素组成,上面描述的EvalMult结果为三个环元素。这可以进一步重复,但缺点是在对明文计算次数-𝑑多项式时,得到的密文具有𝑑+ 1个环元素。
在完整的BGV方案中,通过两个附加程序减轻了这一缺陷。第一个叫做“密钥切换(Key switching)”或“再线性化(Relinearization)”,通过调用刷新子例程(Refresh subroutine)flag="KeySwitch"实现,第二个是“模数切换(Modulus Switching)”或“模数约减(Modulus reduction)”通过调用刷新子例程(Refresh subroutine)flag="ModSwitch"实现。对密钥交换和模量交换的支持也需要增强密钥生成算法。
有关完整BGV方案实施的详细信息,请参阅[BGV12]。
属性支持:BGV方案支持第6节中描述的许多特性,包括电路的打包评估,并且可以扩展为阈值同态加密方案。在安全性方面,可以增强BGV同态评估算法,以提供评估隐私(相对于半诚实的对手)。