1

这个问题参考了 Microsoft 简单加密算术库 (SEAL) 的 3.0 版,以防从标签中看不出来。

我正在尝试提取和评估将写入内存的实际位,这些位存储在 Ciphertext 类中。我不知道该怎么做;内部表示似乎包含 65 个字节的附加信息,目前尚不清楚在读回密文时重建密文需要多少这些信息。假设系统参数是固定的并且是先验已知的,那么保存函数的任何其他部分是否是重建密文所必需的?

在梳理了代码之后,我决定尝试使用我的编码器准备一个密文,检索 uint64_count,然后使用 [] 运算符重载迭代系数。如果这些值被零填充到某个公共长度,这是否是基础数据的忠实表示?

提前致谢

4

1 回答 1

3

Ciphertext 类包含以下成员变量:

parms_id_type parms_id_ = parms_id_zero;
bool is_ntt_form_ = false;
size_type size_capacity_ = 2;
size_type size_ = 0;
size_type poly_modulus_degree_ = 0;
size_type coeff_mod_count_ = 0;
double scale_ = 1.0;
IntArray<ct_coeff_type> data_;

如果你知道参数 ( parms_id_, poly_modulus_degree_, coeff_mod_count_) 那么

(1) 如果您使用 BFV 方案scale == 1.0并且is_ntt_form_ == false除非您手动转换了密文。最后,size_ == 2如果您有一个新加密的密文,并且每当您(反)序列化密文时,它可能会是 2;

(2) 如果你使用 CKKS 方案,你需要知道规模。如果这应该是一个新加密的密文,那么也许你会坚持一些约定,比如使用最后一个coeff_modulus素数作为比例,在这种情况下,你会从参数中知道它。对于 CKKS 方案,is_ntt_form_ == true除非您手动转换了密文。同样,很可能size_ == 2在您的用例中。

鉴于此,您拥有填充不同字段的所有信息。您需要做的就是从data_using中读取数据IntArray<ct_coeff_type>::save/load。那里也有一些小的开销,因为除了数据之外,它还节省了总字数。

我不确定你所说的零填充是什么意思。请注意,您使用 operator[] 获得的值并不是真正的多项式系数,而是密文数据的 CRT 表示的一部分(请参阅此 SO question。由于这些数字是模数高达 60 位素数的整数,因此会有高阶位中的一些零可以安全地压缩以进行存储并恢复以进行计算。

于 2018-11-05T16:55:04.207 回答