【问题标题】:SEAL: How to read Relinkeys data in forms of modulo coefficients?SEAL:如何以模系数的形式读取 Relinkkeys 数据?
【发布时间】:2021-05-25 11:08:56
【问题描述】:

在 SEAL (v3.6) 中运行示例时,我可以使用支持函数打印出 secret_keypublic_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();

系数数据布局跟随模数与Simple Encrypted Arithmetic Library (SEAL) and the seal::Ciphertext variable相同。

输出系数60位为例:

348362126124274227
287021082413421529
790977662641979136
532895062119300067
...

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

【问题讨论】:

    标签: c++ encryption cryptography seal


    【解决方案1】:

    RelinKeys 派生自 KSwitchKeys,其中包含 vector&lt;vector&lt;PublicKey&gt;&gt; 类型的数据成员。由于PublicKeyCiphertext基本相同,所以RelinKeys只是Ciphertext的二维向量。

    第一个维度枚举了为某个密钥的幂次生成的重新线性化密钥。例如,默认情况下只生成密钥的 2 次方的重新线性化密钥,因此 第一维的大小通常为 1。这可以通过this method 描述的relin_keys.key(2) 访问,返回vector&lt;PublicKey&gt;

    第二个维度对应于用于生成重新线性化键和执行重新线性化的分解方法。第二个维度的大小通常等于context.first_context_data()-&gt;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());
        }
    }
    

    【讨论】:

    • 感谢您的帮助。现在我可以在 evaluator.cpp 文件中打印出 relin_keys 及其相关密文。
    猜你喜欢
    • 2015-04-10
    • 2023-03-16
    • 2011-03-31
    • 1970-01-01
    • 2020-12-21
    • 2018-04-06
    • 2019-04-16
    • 2013-03-05
    • 2016-05-27
    相关资源
    最近更新 更多