.NET SEAL BFV方案SquareInplace运算Plaintext取值异常问题咨询
问题根因分析
1. Plaintext输出差异的原因
Plaintext.ToString()方法默认将存储的数值以十六进制格式输出:16的十六进制表示为10,256的十六进制表示为100,完全匹配你观察到的输出结果pt[0]返回的是存储值的原始十进制整数值,这个才是运算的真实结果
2. 运算结果不符合预期的核心错误
你在CreateCiphertextFromInt方法中构造Plaintext的方式存在错误:
new Plaintext(value.ToString())这个构造函数的入参字符串,会被SEAL解析为十六进制数值,而非十进制整数:
当你输入十进制10时,传的字符串是"10",被解析为十六进制的0x10即十进制的16,16平方后得到256,完全匹配你得到的pt[0] = 256的结果
修复方案
1. 正确构造Plaintext
不要将整数转字符串传入Plaintext构造函数,改用以下两种方式之一:
- 直接用数值构造(适合单整数场景):
var plaintext = new Plaintext(value); // 直接传ulong类型的数值,无需转字符串
- 用
IntegerEncoder/BatchEncoder做正式编码(适合多整数、批量运算场景):
// 初始化Encoder var encoder = new IntegerEncoder(context); // 编码整数 var plaintext = encoder.Encode(value); // 解码结果 int result = encoder.DecodeInt32(pt);
2. 正确读取运算结果
- 如果你是单系数存储整数,直接读取
pt[0]即可得到正确的十进制结果,不要使用Plaintext.ToString()的输出作为运算结果 - 如果使用了Encoder编码,调用对应Encoder的Decode方法得到结果
参数配置说明
你当前的BFV参数配置没有问题:
- PolyModulusDegree 8192搭配BFVDefault的218位CoeffModulus符合SEAL的推荐配置
- PlainModulus 4173162863是符合要求的素数,单值运算的数值上限只要不超过PlainModulus就不会出现模溢出问题
内容的提问来源于stack exchange,提问作者Tad McClellan
相关产品推荐
相关产品推荐

