Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cryptography 利用栅栏库实现同态加密_Cryptography_Lattice - Fatal编程技术网

Cryptography 利用栅栏库实现同态加密

Cryptography 利用栅栏库实现同态加密,cryptography,lattice,Cryptography,Lattice,对于所有同态加密专家: 我正在使用PALISADE图书馆: int-PlainTextModules=65537; 浮动西格玛=3.2; SecurityLevel SecurityLevel=HEStd_128_经典; uint32_t深度=2; //实例化加密上下文 CryptoContext cc=CryptoContextFactory::genCryptoContextBFVrns( PlainTextModules,securityLevel,sigma,0,深度,0,优化); 请

对于所有同态加密专家:

我正在使用PALISADE图书馆:

int-PlainTextModules=65537;
浮动西格玛=3.2;
SecurityLevel SecurityLevel=HEStd_128_经典;
uint32_t深度=2;
//实例化加密上下文
CryptoContext cc=CryptoContextFactory::genCryptoContextBFVrns(
PlainTextModules,securityLevel,sigma,0,深度,0,优化);
请解释一下(所有)参数,特别是ptm、深度和西格玛

第二,我试图用上面的cc制作一个压缩的明文

cc->MakePackedPlaintext(array);

阵列的最大大小是多少?因为在我的本地机器上,当数组大于~8000 int64时,我会遇到一些奇怪的错误,例如
free():无效的下一个大小(正常)

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

对于您询问的参数:

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

同样对于压缩明文,应该使用向量而不是数组。也许这会解决你的问题。如果没有,请尝试减小大小,必要时制作几个向量。

谢谢您提出的问题

明文模量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方案可能是一个更好的选择(我将在另一个线程中对应用程序进行更详细的响应)。

您可以使用
cc->GetRingDimension()确定环维度(由加密上下文根据参数设置生成)
如第113行所示

非常感谢您的回答!1.在源代码中,我使用的是向量而不是数组,sry用于混淆!2.我有一个后续问题:目前我能够使用向量(SIMD)和标量执行乘法、加法等操作。在我的特殊用例中,当我在本地机器上尝试此操作时,我希望使用大小为(~600000 int64_t)的向量执行乘法,因为输入太大。我可以将深度增加到16(2^16=65536),这与600000相差甚远,而且效率非常低,占用大量内存。建议?除非你有一台功能非常强大的机器,否则拥有大深度和纯文本模数会大大降低你的计算速度,而且你很有可能会耗尽内存。我建议将向量拆分为几个较小的向量。您必须通过简单地测试不同的输入大小,在不耗尽内存的情况下找到最适合您的大小。每当我有大的向量时,我都会在SEAL中这样做,并编写函数来处理它们。再次感谢您的回复!是的,我试过类似的方法,把大向量分成更小的块来计算它们,然后以某种方式将它们聚合回来。你知道我如何计算明文和密文的实际大小吗?例如,有一个1000 int64值的向量作为消息?我认为这在这种情况下是不可能的。CKKS加密方案不同于BFV方案。CKKS和BFV都基于多项式(mod x^n+1,mod q),其中n是环维数(密文维数),q是密文模。因此,环尺寸概念的使用方式相同。BFV和CKKS之间的主要区别在于信息编码和编码过程中使用的打包程序。其余的(与多项式和环LWE加密相关)基本相同。抱歉,我举了一个使用CKKS而不是BFV的例子,这可能会混淆问题。正如Yuriy所说,获得结果环维数的方法适用于我们的几种晶格方案。在所有情况下,可以在密文中编码的向量的最大大小都基于环维数的某些函数。通常,您会根据安全性、深度和platintext模数获得给定的环维数。您不需要操纵环维度来适应更大的输入向量大小。大于编码最大值的向量需要在多个密文中处理。