Microsoft SEAL: найдите среднее значение зашифрованного текста PolyCRT - PullRequest
0 голосов
/ 16 октября 2018

Есть ли простой способ вычислить среднее значение зашифрованного текста, который был составлен с использованием PolyCRTBuilder и зашифрован.

Вот фрагмент кода:

EncryptionParameters parms;
parms.set_poly_modulus("1x^4096 + 1");
parms.set_coeff_modulus(coeff_modulus_128(4096));
parms.set_plain_modulus(40961);
SEALContext context(parms);
print_parameters(context);
KeyGenerator keygen(context);
auto public_key = keygen.public_key();
// auto secret_key = keygen.secret_key();

Encryptor encryptor(context, public_key);
Evaluator evaluator(context);
// Decryptor decryptor(context, secret_key);

PolyCRTBuilder crtbuilder(context);

int slot_count = crtbuilder.slot_count();
int row_size = slot_count / 2;

vector<uint64_t> pod_matrix(slot_count, 0);
pod_matrix[0] = 5;
pod_matrix[1] = 2;
pod_matrix[2] = 56;
pod_matrix[3] = 34;
pod_matrix[row_size] = 47;
pod_matrix[row_size + 1] = 35;
pod_matrix[row_size + 2] = 16;
pod_matrix[row_size + 3] = 37;

Plaintext plain_matrix;
crtbuilder.compose(pod_matrix, plain_matrix);

Ciphertext encrypted_matrix;

encryptor.encrypt(plain_matrix, encrypted_matrix);

// Is there a way to compute the MEAN of encrypted_matrix and return one ciphertext that is the mean.
// I am trying to not use the secret key

В основном у меня есть массив, гдеЯ упаковываю все элементы массива в один зашифрованный текст, используя технику пакетирования в SEAL.Как только я создаю зашифрованный текст, мне нужно найти СРЕДСТВО зашифрованного массива.Среднее значение должно быть зашифрованным (IntegerEncoded или FractionalEncoded).Есть ли способ добиться этого без использования секретного ключа?Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

Сначала необходимо суммировать значения во всех используемых вами слотах дозирования.Это всегда можно сделать с шагом log(degree(poly_modulus)), поворачивая зашифрованный текст на 0, 1, 2, 4, 8, ... слотов и суммируя после каждого поворота.Для последнего шага вам нужно также суммировать две строки, поэтому вам нужно будет выполнить вращение столбца.В итоге вы получите зашифрованный текст, в котором каждый слот содержит сумму значений.После дешифрования обычный полином в этом случае будет просто постоянным полиномом, поэтому убедитесь, что ваш plain_modulus достаточно большой, чтобы содержать сумму.

Для деления на размер пакета, возможно, вы сможете сделать это после расшифровки,но, возможно, лучшим вариантом будет использование схемы CKKS (в SEAL 3.0), в которой такое деление зашифрованного текста по простому тексту легко.

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