Palisade: EvalMult между открытым текстом и зашифрованным текстом, что приводит к несоответствию размера башни

Надеюсь, кто-нибудь поможет мне разобраться в ошибке, которую я получаю при использовании Palisades. Я хочу использовать только первые 329 слотов зашифрованного текста BGV и обнулить остальные (которые в какой-то момент содержат некоторый «мусор», я не хочу повторно вводить первые 329 слотов при выполнении вращений). Итак, я создал открытый текст, называемый маской, который я заполняю единицами в первых 329 слотах следующим образом:

      Plaintext mask;
vector<int64_t> vecMask;
for(int i=0; i<329; ++i)
  vecMask.push_back(1);
mask = cryptoContext->MakePackedPlaintext(vecMask);

Позже я вызываю EvalMult, чтобы обнулить все в зашифрованном тексте C1, кроме 329 первых позиций:

      C1=cryptoContext->EvalMult(mask,C1);

Но когда я позже попытаюсь добавить еще один зашифрованный текст в C1, появится следующее сообщение об ошибке:

несоответствие размеров башни; не могу добавить

Если маскирование закомментировано, все работает нормально, за исключением того, что C1 будет содержать мусор, который я хочу удалить. Как правильно сделать маскировку?

1 ответ

Было бы полезно увидеть более полный пример кода, включая генерацию криптоконтекста. Я предполагаю, что вы используете, а не BGVв ПАЛИСАДЕ до 1.11. Если нет, я определенно предлагаю использовать для повышения эффективности.

BGVrnsимеет два режима переключения модуля: и. В режиме пользователь должен звонить после каждого умножения, а в режиме AUTOВ этом режиме переключение модуля происходит автоматически. Исходя из описываемой ошибки, вы, вероятно, используете MANUAL режим и не звонит ModReduce() после этого.

Чтобы ответить на ваш вопрос более определенно, я хотел бы увидеть генерацию криптоконтекста и все предыдущие операции как для C1, так и для другого зашифрованного текста, который вы пытаетесь добавить. Спасибо.

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