我将如何检索密文的二进制表示形式,因为它将存储到磁盘

How would I go about retrieving the binary representation of a ciphertext as it would be stored to disk

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

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

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

提前致谢

密文class包含以下成员变量:

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.0is_ntt_form_ == false 除非您手动转换了密文。最后,size_ == 2 如果您有新加密的密文,并且无论何时(反)序列化密文,它都可能是 2;

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

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

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