在 SEAL 中重新线性化一个密文
Relinearizing one Ciphertext in SEAL
假设我计算了 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 的密文的进一步操作可以计算成本明显更高。
此规则有一些例外情况:假设您要计算许多产品的总和。在这种情况下,您可能只想重新线性化最终总和而不是单个被加数,因为计算大小为 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 号。
假设我计算了 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 的密文的进一步操作可以计算成本明显更高。
此规则有一些例外情况:假设您要计算许多产品的总和。在这种情况下,您可能只想重新线性化最终总和而不是单个被加数,因为计算大小为 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 号。