我的印象是,有些同态加密方案允许您执行任意数量的加法,然后进行单次乘法,之后噪声变得太大.但是,当我尝试以下它似乎工作:
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;
Run Code Online (Sandbox Code Playgroud)
再执行一次乘法会产生错误的结果.
是否需要在引导之前允许的操作数量和/或类型是可预测的?它取决于什么?底层值或任何初始化参数?
小智 5
特定实例可以执行的计算量在很大程度上取决于用于初始化系统的参数.通常,乘法(或涉及乘法的运算)成本最高.
指示模数链中的级数的"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,或更改其他参数,并查看它如何影响运行时,可执行的计算次数和解密错误.
如果你需要bootstrap,你可以在同一个src文件中查看params.cpp,并根据params.cpp底部的说明运行"params_x ..."来测试引导的各种参数.
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |