我正在使用Microsoft密码研究小组的Simple Encrypted Arithmetic Library (SEAL)库。有没有办法获取seal::Ciphertext variable的内容?我试图了解ciphertext.h和ciphertext.cpp并发现:

/**
Saves the ciphertext to an output stream. The output is in binary format and not
human-readable. The output stream must have the "binary" flag set.

@param[in] stream The stream to save the ciphertext to
@see load() to load a saved ciphertext.
*/
void save(std::ostream &stream) const;

/**
Loads a ciphertext from an input stream overwriting the current ciphertext.

@param[in] stream The stream to load the ciphertext from
@see save() to save a ciphertext.
*/
void load(std::istream &stream);

但是我找不到另一种选择来获取不是二进制流也不是指向某个内存地址的指针的任何seal::Ciphertext variable的内容并将其保存为字符串。

如果您有任何人从上面的链接下载了SEAL库并提取了它而没有进行任何更改。您可以在 SEAL_2.3.1 \ SEAL \ seal \ ciphertext.h SEAL_2.3.1 \ SEAL \ seal \ ciphertext.cpp 中找到有关seal::Ciphertext的所有允许的操作

最佳答案

简短的答案是,没有其他方法可以访问SEAL中的密文数据。 Ciphertext::data返回的指针将使您可以直接访问密文数据,从这种意义上讲,您可以对其进行任何类型的计算,例如如果出于某种原因想要转换为人类可读的字符串。

当然,要做任何可理解的事情,您需要知道密文的数据布局。在BFV方案中,密文由一对系数(系数coeff_modulus大)的多项式(c0,c1)组成。由于对具有如此大系数的多项式进行运算很不方便,因此SEAL 2.3.1改为使用复合coeff_modulus并以coeff_modulus中指定的每个素数为模分别存储c0和c1(表示这些因子q1,q2,...,qk) 。每个qi都适合一个64位字,因此所有这些2k多项式都具有字长系数。

密文系数数据布局如下(在内存中是连续的):

[c0 mod q1] [c0 mod q2] ... [c0 mod qk] [c1 mod q1] [c1 mod q2] ... [c1 mod qk]

每个[ci mod qj]看起来像

[c0 [0] mod qj] [c1 [0] mod qj] ... [cn-1 [0] mod qj]

在这里,我用ci [k]表示ci的度k系数。请注意,每个系数都存储在uint64_t中。
Ciphertext::data返回一个指向c0多项式的常数系数的指针,该常数相对于coeff_modulus中的第一个模数,即c0 [0] mod q1。除此系数数据外,密文还包含其他一些可以使用成员函数读取的字段。

10-06 14:42