Рейтинг:0

HElib: отправить sk и pk другой стороне для расшифровки и шифрования

флаг bb

Этот вопрос касается сериализации ПК, ск, и контекст в HElib. В моем сценарии есть две доверенные стороны (A и B), эти две стороны могут шифровать сообщения и расшифровывать зашифрованные тексты.

Итак, А отправит контекст, ПК, и ск B. Затем A шифрует сообщение и отправляет ctxtA на B, B расшифровывает ctxtA и посылает другой ctxtB к А. Этот пример просто для пояснения.

Но сбивает с толку реализация HElib, получаю ошибку: несоответствие контекста, пример кода показан ниже:

    Контекст* новыйКонтекст;
    unique_ptr<SecKey> новыйSecKey;
    unique_ptr<PubKey> новыйPubKey;

недействительный тест :: testStruct () {
    беззнаковое длинное p = 127;
    беззнаковый длинный м = 12800;
    беззнаковое длинное г = 1;
    беззнаковые длинные биты = 119;
    беззнаковое длинное с = 2;
    
    helib::Context context = helib::ContextBuilder<helib::BGV>()
                                м (м)
                                .р(р)
                                .r(r)
                                .биты (биты)
                                .с(с)
                                .строить();
    helib::SecKey oldSk(контекст);
    старыйSk.GenSecKey();
    helib::addSome1DMatrices(oldSk);
    const helib::PubKey& oldPk = oldSk;
    
    стрингстрим сс;
    контекст.writeTo (сс);

    newContext = Context::readPtrFrom(ss);
    cout << "Context isEqual: " << (newContext == context) << endl; // результат:1

    // новые сгенерированные pk и sk
    newSecKey = make_unique<SecKey>(*newContext);
    новыйSecKey->GenSecKey();
    addSome1DMatrices(*newSecKey);
    newPubKey = make_unique<PubKey>(*newSecKey);

    encryptt(*newContext, *newPubKey, *newSecKey); // это работает
    // encryptt(*newContext, *newPubKey, oldSk); сбой из-за несоответствия контекста
// или encryptt(*newContext, oldPk, *newSecKey); сбой из-за несоответствия контекста
}

void test::encryptt(const Context& con, const PubKey& pk, const SecKey& sk){
    вектор<длинный> inputtest(256);
    для (долго я = 0; я < 256; я ++) {
        inputtest[i] = я % 2;
    }
    cout << inputtest << endl;
    
    Ctxt кт (пк);
    вектор<длинный> выходной тест;

    //Шифрование
    con.getEA().encrypt(ct, pk, inputtest);
    //Расшифровка
    con.getEA().decrypt(ct, sk, outputtest);

    cout << outputtest << endl;
}

В целом, (oldContext, oldSk, oldPk) и (новыйконтекст, новыйSk, новыйPk) нельзя смешивать.

encryptt(*newContext, *newPubKey, oldSk); сбой из-за несоответствия контекста
// или encryptt(*newContext, oldPk, *newSecKey); сбой из-за несоответствия контекста

Но мы видим, что новый и старый контекст равны согласно коду:

 cout << "Context isEqual: " << (newContext == context) << endl; // результат:1

P.S. Запись и чтение из файла не учитываются, только stringstream.

HElib

Land avatar
флаг in
Я думаю, вам следует опубликовать эту проблему в «репозитории HElib» на GitHub.
Dylan avatar
флаг bb
@Land Никто больше не поддерживает проблемы с репозиторием HElib на GitHub ..... на многие вопросы нет ответов ... Если кто-то также реализует этот сценарий и может ответить мне, я публикую здесь ...

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

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