Сериализация 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.