opt*_*_ex 5 cryptography lattice palisade
致所有同态加密专家:
我正在使用 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);
Run Code Online (Sandbox Code Playgroud)
您能解释一下(所有)特别关注 ptm、深度和 sigma 的参数吗?
其次,我试图用上面的 cc 制作一个打包明文。
cc->MakePackedPlaintext(array);
Run Code Online (Sandbox Code Playgroud)
数组的最大尺寸是多少?在我的本地计算机(8GB RAM)上,当数组大于 ~8000 int64 时,我收到free(): invalid next size (normal)错误
小智 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 方案可能是一个更好的选择(我将在另一个线程中更详细地响应该应用程序)。