Microsoft SEAL: найдите среднее значение зашифрованного текста PolyCRT

Есть ли простой способ вычислить среднее значение зашифрованного текста, который был составлен с использованием 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 ответ

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

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

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