【问题标题】:Relinearizing one Ciphertext in SEAL在 SEAL 中重新线性化一个密文
【发布时间】:2018-09-04 04:04:02
【问题描述】:

假设我计算了 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);

【问题讨论】:

    标签: c++ seal


    【解决方案1】:

    只有Evaluator::multiply 会增加密文的大小。每个密文的大小至少为 2(新加密的大小为 2),大小 a 和 b 密文的乘积产生大小为 a+b-1 的密文。因此,将两个大小为 2 的密文相乘,您最终会得到大小为 3 的密文。在几乎所有情况下,您都希望此时重新线性化以将大小降低到 2,因为对大小为 3 密文的进一步操作可以计算成本要高得多。

    此规则有一些例外情况:假设您要计算许多产品的总和。在这种情况下,您可能只想重新线性化最终总和而不是单个被加数,因为计算大小为 3 密文的总和仍然非常快。

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

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

    稍后评估方可以将这些用作:

    evaluator.relinearize(result, ev_keys);
    

    这里我在generate_evaluation_keys 中使用了60 作为decomposition_bit_count,这是最快也是最常见的选择。您可能永远不应该在generate_evaluation_keys 中使用不同于1(默认)的int count 参数。这适用于您让密文的大小超过 3 并且需要将它们从例如尺寸 4 或 5 到 2。

    【讨论】:

    • 因此,即使我将 3 或 4 个 Chiphertexts(每个大小为 2)计算为大小为 4 或 5 的新 Chiphertext 结果,使用 keygen.generate_evaluation_keys(60, ev_keys);evaluator.relinearize(result, ev_keys); 仍然是一个不错的选择?
    • 否;在这些情况下,您需要更大的计数。但通常你不应该让你的密文增长到超过 3 的大小,你可以通过在每次乘法(除了 multiply_plain)之后重新线性化来实现,就像你的例子一样。
    • generate_evaluation_keys(60, ev_keys) 在使用evaluator.relinearize(result, ev_keys) 时会消耗很多噪声预算,而generate_evaluation_keys(16, ev_keys) 不会消耗任何噪声预算并完成相同的工作。除了计算速度之外,使用 16 而不是 60 是否还有其他限制?
    • 这只是关于性能和评估密钥的大小。这同样适用于 Galois 键,但由于 Galois 键的数量通常要大得多,因此保持 DBC 尽可能大更为重要。
    • 正确,但超过某个点它不会改变任何东西,因为新密文中的噪声已经大于重新线性化增加的噪声。像 15 或 20 这样的东西真的是很小的 DBC,很难想象有什么理由比它更小。
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2019-02-23
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多