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 位素数的整数,因此会有高阶位中的一些零可以安全地压缩以进行存储并恢复以进行计算。