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