使用 Palisade 库的同态加密

问题描述 投票:0回答:4

致所有同态加密专家:

我正在使用 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->MakePackedPlaintext(array);

数组的最大尺寸是多少?在我的本地计算机(8GB RAM)上,当数组大于 ~8000 int64 时,我收到

free(): invalid next size (normal)
错误

cryptography lattice palisade
4个回答
3
投票

感谢您提出问题。

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

sigma
是分布参数(用于底层的误差学习问题)。您只需设置为 3.2 即可。无需更改。

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

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

关于您的申请,CKKS 方案可能是一个更好的选择(我将在另一个线程中更详细地回复该申请)。


2
投票

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

您所询问的参数:

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

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


0
投票

如果您对上下文参数感到困惑并想要一个随时可用的解决方案,请查看https://github.com/Desilo/liberate-fhe。查看快速入门部分。


-2
投票

您可以使用

cc->GetRingDimension()
确定环尺寸(由加密上下文根据您的参数设置生成),如 https://gitlab.com/palisade/palisade-development/blob/master/src 第 113 行所示/pke/examples/simple-real-numbers.cpp

© www.soinside.com 2019 - 2024. All rights reserved.