在 SEAL 中重新线性化一个密文

Relinearizing one Ciphertext in SEAL

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

只有 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);

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