使用S.E.A.L.对产品执行加法图书馆

时间:2018-12-26 18:33:26

标签: c++ encryption seal

我正在尝试执行以下形式的运算:(A * B)+C。乘法运算可以正常工作,因为此时所有数字的标度相同,但是A * B的乘积为标度与C不同。乘法会改变标度是有意义的,但是我想知道是否有一种方法可以使用SEAL库执行这样的操作。

环境信息:

  1. 语言:C ++
  2. 加密方案:CKKS
  3. 小的编码双打(例如0.4531)
  4. 用于编码的比例:pow(2.0,60)如示例

在此先感谢您,如果需要进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

有多种方法可以使它起作用。例如,假设密文A,B,C都具有相同的标度Z。那么A * B将具有标度Z ^ 2。此时,除非您有充分的理由不这样做,否则还应该重新线性化A *B。

例如,要计算A * B + C,您可以:

  • 使用标度Z ^ 2重新编码C(如果您具有纯文本),并改用它;
  • 使用multiply_plain将C与标度为Z的标量1.0纯文本相乘,以将标度增加到Z ^ 2,但保持相同的值(CKKSEncoder::encode会有重载); < / li>
  • 首先重新缩放A * B,使其具有缩放比例Z ^ 2 / q_k,其中q_k是coeff_modulus中的最后一个质数。现在,您可以重新编码C以使其缩放比例精确地为Z ^ 2 / q_k(如果您具有纯文本),或者将C与标量1.0纯文本相乘,如上所述,以将缩放比例精确地更改为Z ^ 2 / q_k;
  • 如果Z接近q_k,从而Z ^ 2 / q_k〜Z,那么在重新缩放后,您可能仅能使用double &Ciphertext::scale()将A * B的比例精确设置为C.scale()一个小的乘法误差的代价〜Z / q_k。例如,可以使用static_cast<double>(parms.coeff_modulus().back())来代替A,B,C的小数位数2 ^ 60。然后Z ^ 2 / q_k = Z(正好),加法立即生效而无需任何比例转换。当然,在第二次乘法+缩放之后,此操作不再有效,因为倒数第二个素数不再等于Z(coeff_modulus中的所有素数必须是不同的)。