Encryption Parameters
SEAL v2:3:0中的所有内容都是从构造一个容器实例开始的,该容器实例包含加密参数(EncryptionParameters)。这些参数是:
- Poly_modulus:多项式z^n + 1,n一个2的次幂;
- coeff_modulus:一个整数模q,由多个不同素数的乘积构成;
- Plain_modulus:整数模t;
- noise_standard_deviation:标准偏差σ;
- random_generator:随机源。
在大多数情况下,用户只需要设置poly_modulus, coeff_modulus和plain_modulus参数。random_generator和noise_standard_deviation都有很好的默认值,在大多数情况下不需要显式设置。
加密参数的选择显著影响加密方案的性能、能力和安全性。一些参数可能是不安全的,性能很差,生成的密文不能与任何同态操作一起工作,或者是所有这些操作的组合。
Setting Parameters
创建EncryptionParameters对象后,需要设置参数。这可以使用函数EncryptionParameters::set_coeff_modulus来实现。一旦设置了所有关键参数,用户需要创建一个SEALContext类的实例,它将自动评估参数的有效性和属性,并对它们执行一系列的预计算。参数的属性存储在EncryptionParameterQualifiers结构体的实例中。
Hash Block
当更改任何加密参数(除了random_generator)时,SEAL v2.3.0计算并更新参数的内部存储的SHA-3散列(散列块)。每个密文和给定参数下创建的所有密钥材料都会自动存储散列值,用于快速的输入有效性和兼容性检查。正常情况下,用户不能手动修改哈希块,也不能直接修改密文/密钥数据。但是,我们可以编译SEAL,使散列块和密文/密钥数据都可以自由地改变,这在某些高级用例中是很重要的(请参见SEAL /util/defines.h)。
Default Values
如果用户没有指定o (noise_standard_deviation),加密参数的构造函数会将其设置为默认值3.19≈8/√2π。如果没有提供随机源(random_generator), SEAL将自动使用std::random_device。
用户必须通过将多项式模(EncryptionParameters::set_poly_modulus)设置为形式为n +1的多项式来选择n,其中n是2的幂。对于某些现实的n选择,SEAL v2.3.0包含128位和192位安全级别的q (coeff_modulus)的预定值,根据[13]中的估计。这些默认值如表3所示,可以通过coeff_modulus_128和coeff_modulus_192函数访问。这些估算假定o为默认值,并忽略了攻击的内存开销等问题。在第9节中,我们将更详细地讨论SEAL v2.3.0的安全属性。
Polynomial Modulus
多项式模(poly_modulus)必须是形式为X^n +1的多项式,其中n是2的幂。这既是出于安全性,也是出于性能考虑。使用更大的n允许使用更大的q,而不降低安全级别,这反过来增加了噪声上限,从而允许使用更大的t,这对整数编码的工作通常很重要。增加n将显著降低性能,但另一方面,在使用PolyCRTBuilder时,它将允许更多的Zt元素被批处理成一个明文。
Coefficient Modulus and Plaintext Modulus
假设多项式模是固定的。然后系数模q的选择影响两件事:新加密密文中的噪声预算和安全级别。
原则上,我们可以将q取为任何整数,只要它不是太大而导致安全问题。在SEAL v2.3.0中,系数模q由多个小素数q1 ×…×qk。采用一种通用算法对这些小素数进行模运算。因此,将这些小素数作为特殊形式并不会带来任何性能提升。用户可以根据自己的需求任意选择一组素数,只要长度不超过60位,且对于i∈{1,2,…k}。对于NTT,我们使用David Harvey的算法[26]。
在某些情况下,用户可能想使用某个特定的n,但默认的n的模系数太大了。在这些情况下,从性能的角度来看,简单地使用较小的自定义q可能是有益的。请注意,这总是安全的:在所有其他参数保持固定的情况下,降低q只会增加安全级别。这在v2.3.0中非常容易,因为用户可以通过函数small_mods_60bit、small_mods_50bit、small_mods_40bit和small_mods_30bit访问足够多的各种位长和适当形式的硬编码素数qi。
SEAL v2.3.0中的明文模t由于性能原因被定义为SmallModulus,因此,它可以是任意正整数,长度至少为2位,最多为60位。注意,在使用批处理时,t需要是一个质数,使t = 1 (mod 2n)。
Encryption Parameter Qualifiers
设置加密参数后,将EncryptionParameters的实例作为输入提供给SEALContext的构造函数,以评估其有效性。如果参数对同态加密有效,则随后将SEALContext的实例提供给Encryptor和Decryptor等工具的构造者。参数的各种属性存储在SEALContext实例中的一个名为EncryptionParameterQualifiers的结构中。
在生成SEALContext后,用户可以调用SEALContext:: qualifiers来返回限定符的副本。请注意,更改限定符的唯一方法是更改加密参数本身以支持特定的特性,并构建一个新的SEALContext。在SEAL v2.3.0中,EncryptionParameterQualifiers包含5个限定符,如表4所示。
到目前为止,最重要的限定符是parameters_set。事实上,如果这是true,那么enable_fft和enable_ntt也必须为true。这些限定符主要用于内部检查给定的参数是否与特定的操作和优化兼容。
Automatic Parameter Selection
为了帮助用户选择特定计算的参数,SEAL v2.3.0提供了一个自动参数选择模块。它由两部分组成:一个模拟器组件,使用表2的估计来模拟同态操作中的噪声增长;一个选择组件,估计底层明文多项式中系数的增长,并使用模拟器来模拟噪声增长。Chooser还提供了计算优化参数集的工具,一旦它知道用户希望执行哪种计算。
Simulator 模拟器由两个部分组成。模拟器是密文中不变噪声|K|的模型。SimulationEvaluator是一个工具,它在模拟上执行所有常见的同态操作,而不是在密文上执行,生成新的模拟,根据表2将噪声值设置为启发式上界估计。模拟器在SEAL v2:3:0中由Simulation和SimulationEvaluator类实现。
Chooser Chooser由三个组件组成。
ChooserPoly对明文多项式进行建模,可以将其视为加密或未加密。具体来说,它会记录两个量:明文中最大的系数(系数界限),明文中非零系数的数量(长度界限)。它还存储了明文的操作历史(可能涉及加密),以及任意数量的其他ChooserPoly对象作为输入的任意数量的同态操作。ChooserPoly还提供了一个工具,用于估计执行其操作历史中存储的操作时可能产生的噪声(它使用模拟器),以及一个工具,用于测试给定的一组加密参数是否支持其操作历史中的计算。
ChooserEvaluator可以对ChooserPoly对象(而不是密文)执行所有常见的同态操作,并根据所讨论的操作和输入生成具有系数界和长度界估计的新ChooserPoly对象。此外,ChooserEvaluator还提供了一个寻找优化参数集的工具,我们将在下面讨论。
ChooserEncoder创建一个ChooserPoly对象,它对一个未加密的明文(空的操作历史记录)进行建模,使用整数编码器编码。ChooserEncryptor将具有空操作历史(建模未加密的明文)的ChooserPoly对象转换为仅包含加密操作历史的对象。这些工具都在SEAL v2.3.0中通过ChooserPoly、ChooserEvaluator、ChooserEncoder和ChooserEncryptor类实现。
Parameter Selection Chooser中最重要的工具之一是SelectParameters功能。它以ChooserPoly对象组成的向量、一组ParameterOptions对(n,q)、一个σ值作为输入,并试图从ParameterOptions中找到一个最优的选项对(n_opt, q_opt),以及一个最优值t_opt,使得参数的大小刚好足以支持所有给定的ChooserPoly对象所指定的计算。如果找到合适的参数,则返回true,并用(x^{n_opt} + 1,q_opt,t_opt)填充EncryptionParameters的给定实例。SelectParameters在SEAL v2.3.0中通过函数ChooserEvaluator::select_parameters实现。
SEAL v2.3.0有一个易于访问(也易于修改)的默认对集(n,q),以及σ的默认值。函数ChooserEvaluator::select_parameters的基本版本使用了这些参数,但另一个重载版本使用了自定义值。当调用ChooserEvaluator::select_parameters时,这两个重载都要求用户给出噪声间隙g(以比特为单位)。选择这些参数是为了在计算之后(非常有可能)至少还剩下g比特的噪声预算。为了确保正确性,可以将噪声间隙设置为0。
函数ChooserEvaluator::select_parameters的工作方式如下。首先,它查看给定的ChooserPoly输入,并选择一个足够大的t,以确保所有的计算都可以在不对t取模的情况下在明文多项式中进行。接下来,循环遍历每个(n,q)按给定的顺序可用的一对,并每次运行ChooserPoly::test_parameters函数,直到找到一组为噪声提供足够空间的参数。
如果最终找到了一个好的参数集,ChooserEvaluator::select_parameters将填充给它的EncryptionParameters实例,并返回true。否则返回false。该库包含一个演示自动参数选择工具的示例。
——《Simple Encrypted Arithmetic Library v2:3:0》