Această întrebare este despre serializarea pk, sk, și context în HElib.
În scenariul meu, există două părți de încredere (A și B), aceste două părți pot cripta mesajele și decripta textele cifrate.
Deci, A va trimite context, pk, și sk la B. Apoi, A criptează mesajul și trimite ctxtA la B, B decriptează ctxtA si trimite altul ctxtB către A. Acest exemplu este doar pentru explicație.
Dar este confuz în implementarea HElib, obțineți eroarea: dezacordarea contextului, exemplu de cod este prezentat mai jos:
Context* nouContext;
unique_ptr<SecKey> newSecKey;
unique_ptr<PubKey> newPubKey;
void test::testStruct(){
lung nesemnat p = 127;
nesemnat lung m = 12800;
lung nesemnat r = 1;
biți lungi nesemnați = 119;
nesemnat lung c = 2;
helib::Context context = helib::ContextBuilder<helib::BGV>()
.m(m)
.p(p)
.r(r)
.biți (biți)
.c(c)
.construi();
helib::SecKey oldSk(context);
oldSk.GenSecKey();
helib::addSome1DMatrices(oldSk);
const helib::PubKey& oldPk = oldSk;
stringstream ss;
context.writeTo(ss);
newContext = Context::readPtrFrom(ss);
cout << "Contextul este Egal: " << (newContext == context) << endl; // rezultat:1
// pk și sk generate noi
newSecKey = make_unique<SecKey>(*newContext);
newSecKey->GenSecKey();
addSome1DMatrices(*newSecKey);
newPubKey = make_unique<PubKey>(*newSecKey);
encryptt(*newContext, *newPubKey, *newSecKey); // asta functioneaza
// encryptt(*newContext, *newPubKey, oldSk); eșuează din cauza nepotrivirii contextului
// sau encryptt(*newContext, oldPk, *newSecKey); eșuează din cauza nepotrivirii contextului
}
void test::encryptt(const Context& con, const PubKey& pk, const SecKey& sk){
vector<lung> inputtest(256);
pentru (lung i = 0; i< 256; i++) {
test de intrare[i] = i % 2;
}
cout << inputtest << endl;
Ctxt ct(pk);
vector<lung> outputtest;
//Criptare
con.getEA().encrypt(ct, pk, inputtest);
//Decriptare
con.getEA().decrypt(ct, sk, outputtest);
cout << outputtest << endl;
}
Per total, (oldContext, oldSk, oldPk) și (newContext, newSk, newPk) nu poate fi amestecat.
encryptt(*newContext, *newPubKey, oldSk); eșuează din cauza nepotrivirii contextului
// sau encryptt(*newContext, oldPk, *newSecKey); eșuează din cauza nepotrivirii contextului
Dar, putem vedea că noul și vechiul context este egal conform codului:
cout << "Contextul este Egal: " << (newContext == context) << endl; // rezultat:1
P.S. Nu se ia în considerare scrierea și citirea din fișier, ci doar stringstream.
HElib