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

Этот вопрос относится к версии 3.0 простой зашифрованной арифметической библиотеки Microsoft (SEAL), если это не видно из тега.

Я пытаюсь извлечь и оценить фактические биты, которые будут записаны в память, как они хранятся в классе Ciphertext. Я в растерянности, как это сделать; внутреннее представление, кажется, включает в себя 65 байтов дополнительной информации, и неясно, сколько из этого необходимо для восстановления зашифрованного текста при его обратном чтении. Есть ли какая-либо другая часть функции сохранения, которая будет необходима для восстановления зашифрованного текста, предполагая, что системные параметры фиксированы и известны априори?

После прочесывания кода я решил попробовать подготовить шифротекст с помощью моего кодировщика, получить uint64_count, а затем перебрать коэффициенты с помощью перегрузки оператора []. Если эти значения дополняются нулями до некоторой общей длины, будет ли это точное представление базовых данных?

Заранее спасибо

1 Ответ

0 голосов
/ 05 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...