这个问题是针对Microsoft简单加密算术库(SEAL)的3.0版,如果从标记中看不出来的话。
我正在尝试提取和评估将存储在Ciphertext类中的实际位,并将这些位写入内存。我不知道该怎么做。内部表示似乎包含65字节的附加信息,并且尚不清楚在读回密文时需要多少字节来重建密文。假设系统参数是固定的并且是先验的,那么保存功能是否还有其他部分需要重新构造密文?
在对代码进行梳理之后,我决定尝试使用编码器准备一个Ciphertext,检索uint64_count,然后使用[]运算符重载对系数进行迭代。如果将这些值零填充到某个公共长度,这是否可以忠实地表示基础数据?
预先感谢
答案 0 :(得分: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_
从IntArray<ct_coeff_type>::save/load
读取数据。那里也有一些小的开销,因为除了数据之外,它还节省了总字数。
我不知道您所说的零填充是什么意思。请注意,用operator []获得的值实际上并不是多项式系数,而是密文数据的CRT表示的一部分(请参见this SO question。由于这些数字是取模,直到60位素数都为整数)高阶位中会有一些零,可以安全地压缩掉这些零以进行存储和恢复以进行计算。