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