Рейтинг:1

Как установить параметры (например, gen, ords и mvec) для начальной загрузки в HElib?

флаг bb

Для экспериментов я использую библиотеку гомоморфного шифрования 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
Hilder Vitor Lima Pereira avatar
флаг us
Я думаю, что Helib может выбрать генераторы и заказы для вас, если вы не передаете их в контекст.
kelalaka avatar
флаг in
[Стандартизация гомоморфного шифрования] (https://crypto.stackexchange.com/a/74939/18298)
Dylan avatar
флаг bb
@HilderVitorLimaPereira Привет, Хильдер. Я попытался создать контекст, не передавая ему генераторы и заказы, но это не удалось из-за `LogicError: Несоответствие циклотомических полиномов`. Затем я запускаю пример, данный HElib, не передавая их в контекст, он не работает по той же причине. Так что кажется, что HElib не поддерживает это.
Dylan avatar
флаг bb
@kelalaka Большое спасибо, что поделились!
Hilder Vitor Lima Pereira avatar
флаг us
Я уже использовал следующий код, и он сработал. Хелиб нашел генераторы сам. Однако он не использует начальную загрузку, так что, возможно, в этом и есть загвоздка. Вы могли бы протестировать... `helib::Context context = helib::ContextBuilder<:bgv>().m(16384).p(257).r(1).bits(250).c(3).skHwt(0).build( );`
Dylan avatar
флаг bb
@HilderVitorLimaPereira, вы правы, я использовал приведенный выше код и проверил сгенерированные `gens` и `ords`, используя предоставленные функции `context.getZMStar().ZmStarGen()` и `context.getZMStar().OrderOf() `. Однако мне не удалось запустить код из-за того, что «масштабированный шум rawModSwitch превышает установленный предел», когда я использую параметры «m = 8471, p = 127, биты = 200, r = 1, c = 2, gens = {3744, 2366}». , ords = {42, -2}, mvec = {43, 197}` (уровень безопасности около `80`). Но это нормально для предоставленных параметров в `benchmarks/bgv_fatboot.cpp`, хотя уровень безопасности равен `0`.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.