简单加密算术库 (SEAL) 和 seal::Ciphertext 变量
Posted
技术标签:
【中文标题】简单加密算术库 (SEAL) 和 seal::Ciphertext 变量【英文标题】:Simple Encrypted Arithmetic Library (SEAL) and the seal::Ciphertext variable 【发布时间】:2018-12-27 05:16:18 【问题描述】:我正在使用来自 Microsoft Cryptography Research Group 的 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);
但我找不到其他选项来获取 anyseal::Ciphertext variable
的内容,它不是二进制流或只是指向某个内存地址的指针并将其保存为字符串。
如果你们中的任何人从上面的链接下载了 SEAL 库并在不进行任何更改的情况下提取了它。您可以在 SEAL_2.3.1\SEAL\seal\ciphertext.h 和 SEAL_2.3.1\SEAL\seal\ciphertext.cppseal::Ciphertext 的所有允许操作/p>
【问题讨论】:
【参考方案1】:简短的回答是没有其他方法可以访问 SEAL 中的密文数据。 Ciphertext::data
返回的指针将使您可以直接访问密文数据,从这个意义上说,您可以对其进行任何类型的计算,例如如果您出于某种原因想要这样做,则转换为人类可读的字符串。
当然,要进行任何可理解的事情,您需要知道密文的数据布局。在 BFV 方案中,密文由一对具有大(大小coeff_modulus
)系数的多项式(c0,c1)组成。由于对具有如此大系数的多项式进行操作不方便,SEAL 2.3.1 改为使用复合 coeff_modulus
并存储 c0 和 c1 以每个素数为模在coeff_modulus
中指定(表示这些因子 q1,q2,...,qk)。每个 qi 都适合一个 64 位的字,因此所有这些 2k 多项式都有字长系数。
密文系数数据布局如下(在内存中连续):
[ c0 mod q1 ][ c0 mod q2 ]...[ c 0 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。除了这个系数数据之外,Ciphertext 还包含一些其他字段,您可以使用成员函数读取这些字段。
【讨论】:
以上是关于简单加密算术库 (SEAL) 和 seal::Ciphertext 变量的主要内容,如果未能解决你的问题,请参考以下文章