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

Извините, я публикую здесь тот же вопрос, так как этот вопрос также касается кодирования HElib.

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

Итак, A отправит контекст, pk и sk в B. Затем A зашифровывает сообщение и отправляет ctxtA в B, B расшифровывает ctxtA и отправляет другой ctxtB в A. Этот пример предназначен только для объяснения.

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

       Context* newContext;
    unique_ptr<SecKey> newSecKey;
    unique_ptr<PubKey> newPubKey;

void test::testStruct(){
    unsigned long p = 127;
    unsigned long m = 12800;
    unsigned long r = 1;
    unsigned long bits = 119;
    unsigned long c = 2;
    
    helib::Context context = helib::ContextBuilder<helib::BGV>()
                                .m(m)
                                .p(p)
                                .r(r)
                                .bits(bits)
                                .c(c)
                                .build();
    helib::SecKey oldSk(context);
    oldSk.GenSecKey();
    helib::addSome1DMatrices(oldSk);
    const helib::PubKey& oldPk = oldSk;
    
    stringstream ss;
    context.writeTo(ss);

    newContext = Context::readPtrFrom(ss);
    cout << "Context isEqual: " << (newContext == context) << endl; // result:1

    // new generated pk and sk
    newSecKey = make_unique<SecKey>(*newContext);
    newSecKey->GenSecKey();
    addSome1DMatrices(*newSecKey);
    newPubKey = make_unique<PubKey>(*newSecKey);

    encryptt(*newContext, *newPubKey, *newSecKey); // this works
    //  encryptt(*newContext, *newPubKey, oldSk); fail due to context dismatch
// or  encryptt(*newContext, oldPk, *newSecKey);  fail due to context dismatch
}

void test::encryptt(const Context& con, const PubKey& pk, const SecKey& sk){
    vector<long> inputtest(256);
    for (long i = 0; i< 256; i++) {
        inputtest[i] = i % 2;
    }
    cout << inputtest << endl;
    
    Ctxt ct(pk);
    vector<long> outputtest;

    //Encryption
    con.getEA().encrypt(ct, pk, inputtest);
    //Decryption
    con.getEA().decrypt(ct, sk, outputtest);

    cout << outputtest << endl;
}

Общий, (oldContext, oldSk, oldPk) а также (newContext, newSk, newPk) нельзя смешивать.

      encryptt(*newContext, *newPubKey, oldSk); fail due to context dismatch
// or  encryptt(*newContext, oldPk, *newSecKey);  fail due to context dismatch

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

       cout << "Context isEqual: " << (newContext == context) << endl; // result:1

PS Запись и чтение из файла не рассматриваются, только stringstream.

0 ответов

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