Для экспериментов я использую библиотеку гомоморфного шифрования HElib.
Я попытался использовать загрузку с параметрами, которых нет в таблице, предоставленной HElib.
Но я понятия не имею, как выбрать параметры (например, gen, ords и mvec) для начальной загрузки.
Ниже приведен пример в HElib (примеры/BGV_binary_arithmetic.cpp
)
// Простой текстовый модуль.
длинный р = 2;
// Циклотомический полином - определяет phi(m).
длинный м = 4095;
// Подъем Hensel (по умолчанию = 1).
длинный г = 1;
// Количество бит цепочки модулей.
длинные биты = 500;
// Количество столбцов матрицы переключения клавиш (обычно 2 или 3).
длинный с = 2;
// Факторизация m, необходимая для начальной загрузки.
std::vector<long> mvec = {7, 5, 9, 13};
// Генерация группы Zm*.
std::vector<long> gens = {2341, 3277, 911};
// Заказы предыдущих генераторов.
std::vector<long> ords = {6, 4, 6};
Мой вопрос: В моем эксперименте мне нужен зашифрованный текст с точным количеством слотов (например, слоты = 256, 1024, 4096
). Таким образом, я должен найти правильный м, р, бит
для генерации такого зашифрованного текста с этими слотами. Но для этих м, р, бит
, я не знаю, как установить мвек, род, орды
.
Вот конкретный пример:
длинный м = 12800;
длинный р = 127;
длинный г = 1;
длинные биты = 119;
длинный с = 2;
vector<long> mvec = {25, 512};
vector<long> gens = {2, 128};
vector<long> ords = {43, 4351};
Выбросить исключение: завершение с необработанным исключением типа helib::LogicError: Неправильный пользовательский генератор
// Немного информации об этом контексте:
m = 12800, p = 127, phi(m) = 5120
порядок (р) = 20
норма Bnd = 1,23107
полиНормаБнд = 1,23107
факторы = [2 5]
генератор 43 имеет порядок (== Z_m^*) 128
генератор 4351 имеет порядок (== Z_m^*) 2
р = 1
nслотов = 256
вес = 0
ctxtPrimes = [6,7]
специальныеPrimes = [8]
количество бит = 173
уровень безопасности = 98,4643
Обновлять: Я запускаю пример с параметрами, найденными HElib (разное/psi/params.cpp
), но сгенерировать исключение LogicError: масштабированный шум rawModSwitch превышает границу: 309684.692524
.
Данные параметры: phim=7056, d=28, m=12789, m=(3^2)*7^2*{29}, m/phim(m)=1,81, C=74 D=2 E=2, mvec=" [49 261]" gens="[11224 7106]" ords="[42 6]"
Код написан для выполнения нескольких умножений при проверке шума и выполнении начальной загрузки.
длинный м = 12789;
длинный р = 127;
длинный г = 1;
длинные биты = 119;
длинный с = 2;
// Факторизация m, необходимая для начальной загрузки.
vector<long> mvec = {49, 261};
// Генерация группы Zm*.
vector<long> gens = {11224, 7106};
// Заказы предыдущих генераторов.
vector<long> ords = {42, 6};
Контекст контекста = ContextBuilder<BGV>()
м (м)
.р(р)
.r(r)
.gens(род)
.орды(орды)
.биты (биты)
.с(с)
.bootstrappable(правда)
.мвек(мвек)
.строить();
// Ключевой менеджмент
SecKey секрет_ключ (контекст);
secret_key.GenSecKey();
addSome1DMatrices (secret_key);
добавитьFrbMatrices (secret_key);
secret_key.genRecryptData();
const PubKey& public_key = secret_key;
const EncryptedArray& ea = context.getEA();
// создаем зашифрованный текст
std::vector<long> ptxt(nslots);
for (int i = 0; i < nslots; ++i) {
ptxt[i] = 2;
}
ctxt ctxt (открытый_ключ);
ea.encrypt(ctxt, public_key, ptxt);
// умножение и начальная загрузка
для (целое я = 0; я < 10; я ++) {
если (ctxt.bitCapacity() <= 50)
{
cout << "Начать загрузку!" << конец;
public_key.thinReCrypt(ctxt);
}
ctxt.square();
}
Исключение:
Начните загрузку!
libc++abi: завершение с необработанным исключением типа helib::LogicError: масштабированный шум rawModSwitch превышает границу: 309684.692524
завершение с необработанным исключением типа helib::LogicError: масштабированный шум rawModSwitch превышает границу: 309684.692524