【问题标题】:When is bootstrapping needed in helib?helib 什么时候需要引导?
【发布时间】:2017-10-21 21:47:29
【问题描述】:

我的印象是,某种同态加密方案允许您执行任意数量的加法,然后是单次乘法,之后噪声变得太大。但是当我尝试以下它似乎工作:

publicKey.Encrypt(ctx1, to_ZZX(2));
publicKey.Encrypt(ctx2, to_ZZX(3));
publicKey.Encrypt(ctx3, to_ZZX(10));

Ctxt ctRes = ctx1;
ctRes += ctx2;
ctRes *= ctx3;
ctRes *= ctx3;

ZZX ptRes;
secretKey.Decrypt(ptRes, ctRes);
std::cout << "(2 + 3) * 10 * 10= " << ptRes[0] << std::endl;

再执行一次乘法会产生错误的结果。

在需要引导之前允许的操作数量和/或类型是否可预测?它取决于什么?基础值或任何初始化参数?

【问题讨论】:

  • 我现在没时间回答,但是有一个名为 L 的隐式参数,它代表“级别”,表示您可以按顺序执行多少次乘法(因此,在您的示例中,似乎 L = 2)。看看自己的Helib的代码中的例子...

标签: c++ cryptography


【解决方案1】:

您的特定实例可以执行的计算量在很大程度上取决于用于初始化系统的参数。一般来说,乘法(或涉及乘法的运算)是最昂贵的。

“L”参数表示模链中的层数,是在需要引导之前可以执行多少次计算(特别是乘法)的最重要因素。尝试将其设置为更大的数字。

我强烈建议通读 HElib 的 src 文件夹中的 Test_General.cpp,可以在这里下载:https://github.com/shaih/HElib。您可以在该文件夹中运行“make”以生成名为 Test_General_x 的可执行文件并使用“Test_General_x L=10 R=5”运行它以将 L 设置为 10 并运行 5 轮这些计算(您可以在源代码中更改) .尝试各种参数,将 L 更改为 15,20,...,60,或更改其他参数,看看它如何影响运行时间、可以执行的计算次数和解密错误。

如果您需要引导,您可以查看同一个 src 文件中的 params.cpp,并根据 params.cpp 底部的说明运行“params_x ...”来测试引导的各种参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 2019-08-13
    • 2012-09-16
    • 1970-01-01
    • 2013-10-22
    • 2015-10-08
    • 2012-12-03
    • 2018-12-10
    相关资源
    最近更新 更多