选择适合SEAL的参数并阐明一些数学运算

时间:2018-09-03 13:32:41

标签: c++ seal

A)我无法理解这些设置之间的关系:

parms.set_poly_modulus("1x^2048 + 1");
parms.set_coeff_modulus(coeff_modulus_128(2048));
parms.set_plain_modulus(1 << 8);

SEAL manual中的该表。

enter image description here

我对数字54以及对parms.set_poly_modulus("1x^2048 + 1")parms.set_coeff_modulus(coeff_modulus_128(2048))的数字特别感兴趣。

B)我正在尝试为我的用例找到正确的参数。 假设我在-180和+180之间有10000个小数,并且我想使用FractionalEncoder对这些数字进行编码。预先执行的操作将是:减,加,乘,平方和求幂。结果将保存在单独的Ciphertext变量中。

因此,就我的用例而言,什么是最佳参数:

  1. n, q, t in

    parms.set_poly_modulus("1x^n + 1");
    parms.set_coeff_modulus(coeff_modulus_128(q));
    parms.set_plain_modulus(t);
    
  2. a中的
  3. bseal::FractionalEncoder encoder(context.plain_modulus(), context.poly_modulus(), a, b, 2)。我正在使用 a = 512 b = 128 ,对于我的用例来说,这太高了。

如果用例发生变化,如何自己计算这些参数?

1 个答案:

答案 0 :(得分:1)

A)在您的示例中,您使用的是尺寸为2048的多项式模数,并且系数模数使用128位安全级别的默认值。要确切了解该值是什么,请查看SEAL/seal/util/globals.cpp。系数模量是SmallModulus个对象的向量,它们是表示 total 系数模量的最多60位因子的正整数。例如,对于您的参数,系数模量仅包含一个单一的质数因子0x3fffffff000001,但是您会看到,对于较大的参数,它可以具有更多的因子。

安全级别取决于多项式模数的程度(越大,安全性越高)和 total 系数模数的位长(越小,意味着高安全性)。因此,对于固定的多项式模数,应该有最大的可接受系数模数,以提供固定的安全级别。由于不容易知道系数模数的上限是多少,因此SEAL可以方便地通过coeff_modulus_128(以及coeff_modulus_192coeff_modulus_256作为默认值,以默认值的形式提供更高的安全性) )。在某些情况下,您可能希望使用比默认值小的系数模数,但是除非您真的知道自己在做什么(否则也许甚至没有),否则永远不要使用更大的系数模数。使用Martin Albrecht的LWE估算器 https://bitbucket.org/malb/lwe-estimator获得54位的位长。

B)在这种情况下确定参数的典型工作流程是首先找出足够大的plain_modulus,以使计算正确。如果您的噪声预算用尽了,只需调整coeff_modulus直至其可用。

一旦找到足够大的plain_modulus,请尝试通过将coeff_modulus设置为最小值来优化噪声,使您的噪声预算不为零。为简单起见,您可以尝试通过coeff_modulus_128获得的不同默认值。如果您真的很在意性能,则可能需要手动选择coeff_modulus质数才能真正找到可行的最小值。

下一步,选择poly_modulus足够大,以使您的总系数模量最多等于该poly_modulus度的默认值。

最后,您可能需要手动调整在线性化过程中使用的decomposition_bit_count。默认情况下,您应该使用值60,这会带来更好的计算性能,但会增加噪声。在某些情况下,您可能希望将此设置为如图30所示,如果您碰巧节省了一些额外的噪声预算,则可以切换到较小的加密参数。在大多数情况下,此级别的微调是不必要的。

最终得到的最佳参数到底是什么完全取决于您的计算,因此,如果没有非常具体的细节,就不可能在这里给出直接答案。

FractionalEncoder的参数化是另一回事。我建议尝试使用不同的值,以了解这些选择如何影响准确性。选择a = 512,b = 128有什么问题?