Этот вопрос касается сериализации ПК
, ск
, и контекст
в 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