Puncte:0

HElib: trimiteți sk și pk unei alte părți pentru decriptare și criptare

drapel bb

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

Land avatar
drapel in
Cred că ar trebui să postezi această problemă pe „depozitul HElib” pe GitHub.
Dylan avatar
drapel bb
@Land nimeni nu mai menține problemele de pe depozitul HElib de pe GitHub.....multe întrebări nu primesc răspuns... În cazul în care cineva implementează și acest scenariu și ar putea să-mi răspundă, postez aici...

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.