假设我计算了2个Ciphertexts加法乘法,并将结果保存在第三个中。如果我要对结果Ciphertext(目标Chipertext)执行其他数学运算,是否建议在此之前对它使用evaluator.relinearize()?因为如果我理解正确,对Ciphertext进行的某些操作会导致结果Ciphertext的大小大于2。如果是,那么这将是使一个Ciphertext重新线性化的好方法吗?

  • EvaluationKeys ev_keys;
  • int size = result.size();
  • keygen.generate_evaluation_keys(size - 2, ev_keys); // We need size - 2 ev_keys for performing this relinearization.
  • evaluator.relinearize(result, ev_keys);
  • 最佳答案

    Evaluator::multiply会增加密文的大小。每个密文的大小至少为2(新加密的大小为2),大小a和b的密文相乘会导致大小为a + b-1的密文。因此,将两个大小为2的密文相乘,最终将得到大小为3的密文。在几乎所有情况下,都需要重新线性化以将大小减小为2,因为对大小3密文的进一步操作可以大大增加了计算成本。

    此规则有一些异常(exception):例如,您要计算许多乘积之和。在这种情况下,您可能只想重新线性化最终和而不是单个求和,因为计算大小为3的密文之和仍然非常快。

    为了使线性化成为可能,生成密钥的一方还需要生成评估密钥,如下所示:

    EvaluationKeys ev_keys;
    keygen.generate_evaluation_keys(60, ev_keys);
    

    稍后,评估方可以将其用作:
    evaluator.relinearize(result, ev_keys);
    

    在这里,我使用60作为decomposition_bit_count中的generate_evaluation_keys,这是最快也是最常见的最佳选择。您可能永远都不要在int count中使用不同于1(默认值)的generate_evaluation_keys参数。这适用于用例,在这种情况下,您让密文的大小增长到3以上,并需要将其从例如大小4或5减小到2。

    关于c++ - 在SEAL中重新线性化一个密文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52152129/

    10-12 17:29