Как бы я мог получить двоичное представление зашифрованного текста, как он будет сохранен на диске

Этот вопрос относится к версии 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-битных простых чисел, будет там есть несколько нулей в старших разрядах, которые можно безопасно сжать для хранения и восстановить для вычислений.

Другие вопросы по тегам