0

在 SEAL (v3.6) 中运行示例时,我可以使用支持函数打印出secret_key,数据的多项式系数public_key

ofstream sk;
sk.open(filename, ios::binary);
for (uint64_t i = 0; i < poly_modulus_degree; i++)
{
    sk << secret_key.data()[i] << endl;
}
sk.close();

系数数据布局跟随模数与简单加密算术库 (SEAL) 和 seal::Ciphertext 变量相同。

输出系数 60 位为例:

348362126124274227
287021082413421529
790977662641979136
532895062119300067
...

但是我无法理解它的形式relin_keys以及如何使用它的类的支持方法以relin_keys多项式系数的形式打印数据?感谢您的帮助。

4

1 回答 1

1

RelinKeys派生自KSwitchKeys其中包含 . 类型的数据成员vector<vector<PublicKey>>。由于PublicKey与 基本相同CiphertextRelinKeys因此只是 的二维向量Ciphertext

第一个维度枚举了为特定幂的密钥生成的重新线性化密钥。例如,默认情况下,仅生成密钥的 2 次方的重新线性化密钥,因此第一维通常具有 size1。这可以通过此方法relin_keys.key(2)描述来访问,该方法返回。vector<PublicKey>

第二个维度对应于用于生成重新线性化键和执行重新线性化的分解方法。第二维的大小通常等于context.first_context_data()->parms().coeff_modulus().size()。在此之后,您应该知道如何打印出每个Ciphertext对象。

以下代码应该会有所帮助:

void print_ciphertext(const Ciphertext &ciphertext) {
    // code to print coefficients of a Ciphertext object
}

RelinKeys relin_keys;
// ... generate keys ...

for (std::size_t key_power = 2; relin_keys.has_key(key_power); key_power++) {
    for (auto &public_key: relin_keys.key(key_power)) {
        print_ciphertext(public_key.data());
    }
}
于 2021-04-15T21:44:12.573 回答