Класс Ciphertext содержит следующие переменные-члены:
parms_id_type parms_id_ = parms_id_zero;
bool is_ntt_form_ = false;
size_type size_capacity_ = 2;
size_type size_ = 0;
size_type poly_modulus_degree_ = 0;
size_type coeff_mod_count_ = 0;
double scale_ = 1.0;
IntArray<ct_coeff_type> data_;
Если вам известны параметры (parms_id_
, poly_modulus_degree_
, coeff_mod_count_
), тогда
(1), если вы используете схему BFV scale == 1.0
и is_ntt_form_ == false
, если вы не преобразовали зашифрованный текст вручную. Наконец, size_ == 2
, если у вас есть только что зашифрованный зашифрованный текст, и всякий раз, когда вы (де) сериализуете зашифрованный текст, это, вероятно, будет 2;
(2) если вы используете схему CKKS, вам нужно знать масштаб. Если предполагается, что это только что зашифрованный зашифрованный текст, то, возможно, вы придерживаетесь некоторого соглашения, такого как использование последнего простого числа coeff_modulus
в качестве шкалы, и в этом случае вы узнаете его по параметрам. Для схемы CKKS is_ntt_form_ == true
, если вы вручную не преобразовали зашифрованный текст. Опять же, скорее всего, size_ == 2
в вашем случае использования.
Учитывая это, у вас есть вся информация для заполнения различных полей. Все, что вам нужно сделать, это прочитать данные из data_
, используя IntArray<ct_coeff_type>::save/load
. Там также есть небольшие накладные расходы, поскольку в дополнение к данным сохраняется общее количество слов.
Я не уверен, что вы подразумеваете под нулями. Обратите внимание, что значения, которые вы получаете с помощью оператора [], на самом деле являются не полиномиальными коэффициентами, а частями CRT-представления данных зашифрованного текста (см. этот вопрос SO . Так как эти числа являются целыми числами по модулю до 60- Бит простое, в старших разрядах будет несколько нулей, которые можно безопасно сжать для хранения и восстановить для вычислений.