ПЕЧАТЬ: Как читать данные Relinkeys в виде коэффициентов по модулю?

При запуске примеров в 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();

с макетом данных коэффициентов следующие модули такие же, как и в Простая зашифрованная арифметическая библиотека (ПЕЧАТЬ) и печать :: переменная зашифрованного текста.

Коэффициенты вывода 60 бит в качестве примеров:

348362126124274227
287021082413421529
790977662641979136
532895062119300067
...

Но я не могу понять формы relin_keys и как использовать методы поддержки этого класса для печати relin_keys данных в форме полиномиальных коэффициентов? Спасибо за помощь.


person France    schedule 23.02.2021    source источник


Ответы (1)


RelinKeys является производным от KSwitchKeys, который содержит элемент данных типа vector<vector<PublicKey>>. Поскольку PublicKey в основном то же самое с Ciphertext, RelinKeys - это просто 2-мерный вектор Ciphertext.

Первое измерение перечисляет ключ повторной линеаризации, сгенерированный для секретного ключа определенной мощности. Например, по умолчанию создается только ключ повторной линеаризации для секретного ключа 2-й степени, поэтому первое измерение обычно имеет размер 1. Это доступно с помощью relin_keys.key(2), описанного this method / a>, который возвращает 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());
    }
}
person Wei Dai    schedule 15.04.2021
comment
Спасибо за вашу помощь. Теперь я могу распечатать relin_keys и относительные шифтексты в файле evalator.cpp. - person France; 08.07.2021