3

致所有同态加密专家:

我正在使用 PALISADE 库:

int plaintextModulus = 65537;
float sigma = 3.2;
SecurityLevel securityLevel = HEStd_128_classic;
uint32_t depth = 2;

//Instantiate the crypto context
CryptoContext<DCRTPoly> cc = CryptoContextFactory<DCRTPoly>::genCryptoContextBFVrns(
            plaintextModulus, securityLevel, sigma, 0, depth, 0, OPTIMIZED);

您能否解释一下(所有)参数,尤其是对 ptm、深度和 sigma 感兴趣的参数。

其次,我试图用上面的 cc 制作一个打包的明文。

cc->MakePackedPlaintext(array);

数组的最大大小是多少?因为在我的本地机器上,当数组大于 ~ 8000 int64 时,我会遇到一些奇怪的错误,例如free(): invalid next size (normal)

4

3 回答 3

2

我对也使用 BFV 加密方案的 SEAL 库有一些经验。BFV 方案使用模运算并且能够加密整数(不是实数)。

对于您要询问的参数:

  • 明文模数是输入整数的上限。如果这个参数太低,它可能会导致你的整数溢出(当然取决于它们有多大)
  • Sigma 是高斯噪声生成的分布参数
  • 深度是电路深度,它是路径上的最大乘法次数

同样对于打包明文,您应该使用向量而不是数组。也许这会解决你的问题。如果没有,请尝试降低大小并在必要时制作多个向量。

于 2020-08-03T11:52:09.173 回答
2

感谢您提出问题。

Plaintext modulus t(这里表示为 t)是 BFV 的一个关键参数,因为所有操作都是在 mod t 下执行的。换句话说,当您选择 t 时,您必须确保所有计算不回绕,即不超过 t。否则你会得到一个不正确的答案,除非你的目标是计算一些 mod t。

sigma是分布参数(用于潜在的错误学习问题)。你可以设置为3.2。无需更改它。

Depth是您尝试计算的电路的乘法深度。它与向量的大小无关。基本上,如果您有 AxBxCxD,那么您的深度 3 和一种天真的方法。BFV 还支持更高效的二叉树评估,即 (AxB)x(CxD) - 此选项会将深度降低到 2。

BFV 是一种支持打包的方案。默认情况下,打包密文的大小等于环尺寸(对于您提到的示例,类似于 8192)。这意味着您最多可以打包 8192 个整数。为了支持更大的数组/向量,您需要将它们分成每批 8192 个,并分别加密每一个。

关于您的应用程序,CKKS 方案可能是一个更好的选择(我将在另一个线程中更详细地响应应用程序)。

于 2020-08-04T13:57:09.910 回答
-1

您可以使用https://gitlab.com/palisade/palisade-development/blob/master/src/pke/examples/cc->GetRingDimension()的第 113 行所示来确定环维度(由加密上下文根据您的参数设置生成)简单实数.cpp

于 2020-08-04T14:28:13.953 回答