使用 Palisade 库的同态加密
Homomorphic encryption using Palisade library
致所有同态加密专家:
我正在使用 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)
我对同样使用 BFV 加密方案的 SEAL 库有一些经验。 BFV 方案使用模块化算法,能够加密整数(非实数)。
对于您询问的参数:
- 明文模数是输入整数的上限。如果此参数太低,可能会导致您的整数溢出(当然取决于它们的大小)
- Sigma 是高斯噪声生成的分布参数
- Depth是电路深度,是路径上的最大乘法数
同样对于压缩明文,您应该使用向量而不是数组。也许这会解决你的问题。如果不是,请尝试降低大小并在必要时创建多个向量。
感谢您的提问。
Plaintext modulus t
(此处表示为 t)是 BFV 的关键参数,因为所有操作都执行 mod t。换句话说,当您选择 t 时,您必须确保所有计算都不会回绕,即不超过 t。否则你会得到一个错误的答案,除非你的目标是计算一些东西 mod t.
sigma
是分布参数(用于底层的 Learning with Errors 问题)。您可以设置为 3.2。无需更改。
Depth
是您要计算的电路的乘法深度。它与向量的大小无关。基本上,如果你有 AxBxCxD,你有一个深度为 3 的天真的方法。 BFV 还支持更高效的二叉树评估,即 (AxB)x(CxD) - 此选项会将深度减少到 2。
BFV是一种支持打包的方案。默认情况下,打包密文的大小等于环维数(对于您提到的示例,类似于 8192)。这意味着您最多可以打包 8192 个整数。要支持更大的 arrays/vectors,您需要将它们分成每批 8192 个并分别加密。
关于您的应用程序,CKKS 方案可能是一个更好的选择(我将在另一个线程中更详细地回复该应用程序)。
您可以使用 cc->GetRingDimension()
确定环维度(由加密上下文根据您的参数设置生成),如 https://gitlab.com/palisade/palisade-development/blob/master/src/pke/examples/simple-real-numbers.cpp
的第 113 行所示
致所有同态加密专家:
我正在使用 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)
我对同样使用 BFV 加密方案的 SEAL 库有一些经验。 BFV 方案使用模块化算法,能够加密整数(非实数)。
对于您询问的参数:
- 明文模数是输入整数的上限。如果此参数太低,可能会导致您的整数溢出(当然取决于它们的大小)
- Sigma 是高斯噪声生成的分布参数
- Depth是电路深度,是路径上的最大乘法数
同样对于压缩明文,您应该使用向量而不是数组。也许这会解决你的问题。如果不是,请尝试降低大小并在必要时创建多个向量。
感谢您的提问。
Plaintext modulus t
(此处表示为 t)是 BFV 的关键参数,因为所有操作都执行 mod t。换句话说,当您选择 t 时,您必须确保所有计算都不会回绕,即不超过 t。否则你会得到一个错误的答案,除非你的目标是计算一些东西 mod t.
sigma
是分布参数(用于底层的 Learning with Errors 问题)。您可以设置为 3.2。无需更改。
Depth
是您要计算的电路的乘法深度。它与向量的大小无关。基本上,如果你有 AxBxCxD,你有一个深度为 3 的天真的方法。 BFV 还支持更高效的二叉树评估,即 (AxB)x(CxD) - 此选项会将深度减少到 2。
BFV是一种支持打包的方案。默认情况下,打包密文的大小等于环维数(对于您提到的示例,类似于 8192)。这意味着您最多可以打包 8192 个整数。要支持更大的 arrays/vectors,您需要将它们分成每批 8192 个并分别加密。
关于您的应用程序,CKKS 方案可能是一个更好的选择(我将在另一个线程中更详细地回复该应用程序)。
您可以使用 cc->GetRingDimension()
确定环维度(由加密上下文根据您的参数设置生成),如 https://gitlab.com/palisade/palisade-development/blob/master/src/pke/examples/simple-real-numbers.cpp