Как бы я мог получить двоичное представление зашифрованного текста, как он будет сохранен на диске
Этот вопрос относится к версии 3.0 простой зашифрованной арифметической библиотеки Microsoft (SEAL), если это не видно из тега.
Я пытаюсь извлечь и оценить фактические биты, которые будут записаны в память, как хранится в классе Ciphertext. Я в недоумении, как это сделать; внутреннее представление, кажется, включает в себя 65 байтов дополнительной информации, и неясно, сколько из этого необходимо для восстановления зашифрованного текста при его обратном чтении. Есть ли какая-либо другая часть функции сохранения, которая будет необходима для восстановления зашифрованного текста, если предположить, что системные параметры фиксированы и известны априори?
Прочесав код, я решил попробовать подготовить шифротекст с помощью моего кодировщика, получить uint64_count, а затем перебрать коэффициенты, используя перегрузку оператора []. Если эти значения дополняются нулями до некоторой общей длины, будет ли это точное представление базовых данных?
заранее спасибо
1 ответ
Класс 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-битных простых чисел, будет там есть несколько нулей в старших разрядах, которые можно безопасно сжать для хранения и восстановить для вычислений.