Puncte:1

Cum să setați parametrii (adică gen, ords și mvec) pentru bootstrapping în HElib?

drapel bb

Folosesc biblioteca de criptare homomorfă, HElib, pentru a face experimente. Am încercat să folosesc bootstrapping cu parametri care nu sunt în tabelul furnizat cu HElib. Dar nu am idee cum să aleg parametrii (adică gen, ords și mvec) pentru bootstrapping.

Mai jos este un exemplu în HElib (exemple/BGV_binary_arithmetic.cpp)

  // Modulul prim text simplu.
  lung p = 2;
  // Polinom ciclotomic - definește phi(m).
  lungime m = 4095;
  // Ridicarea Hensel (implicit = 1).
  lung r = 1;
  // Numărul de biți ai lanțului de modul.
  biți lungi = 500;
  // Numărul de coloane ale matricei Key-Switching (de obicei 2 sau 3).
  lung c = 2;
  // Factorizarea lui m este necesară pentru bootstrapping.
  std::vector<lung> mvec = {7, 5, 9, 13};
  // Setul generator al grupului Zm*.
  std::vector<lung> gens = {2341, 3277, 911};
  // Comenzile generatoarelor anterioare.
  std::vector<lung>ords = {6, 4, 6};

Intrebarea mea: În experimentul meu, am nevoie de textul cifrat cu numărul exact de sloturi (cum ar fi sloturi= 256, 1024, 4096). Astfel, trebuie să găsesc cel potrivit m, p, biți pentru a genera un astfel de text cifrat cu aceste sloturi. Dar pentru acestea m, p, biți, nu stiu cum sa setez mvec, gens, ords.

Iată un exemplu special:

    lungime m = 12800;
    lung p = 127;
    lung r = 1;
    biți lungi = 119;
    lung c = 2;
    vector<lung> mvec = {25, 512};
    vector<lung> gens = {2, 128};
    vector<lung> ordine = {43, 4351};

Aruncă o excepție: se încheie cu excepția neprinsă de tip helib::LogicError: generator furnizat de utilizator greșit

// Câteva informații despre acest context:
m = 12800, p = 127, phi(m) = 5120
  ord(p) = 20
  normBnd = 1,23107
  polyNormBnd = 1,23107
  factori = [2 5]
  generatorul 43 are ordinul (== Z_m^*) de 128
  generatorul 4351 are ordinea (== Z_m^*) de 2
r = 1
nslots = 256
hwt = 0
ctxtPrimes = [6,7]
specialPrimes = [8]
numărul de biți = 173

nivelul de securitate = 98,4643

Actualizați: Rulez un exemplu cu parametrii găsiți de HElib (misc/psi/params.cpp), dar aruncați o excepție LogicError: zgomotul scalat rawModSwitch depășește limita: 309684.692524.

Parametrii dați sunt: phim=7056, d=28, m=12789, m=(3^2)*7^2*{29}, m/phim(m)=1,81, C=74 D=2 E=2, mvec=" [49 261]" gens="[11224 7106]" ords="[42 6]"

Codul este scris pentru a efectua înmulțiri multiple în timp ce se verifică zgomotul și se efectuează bootstrapping.

    lungime m = 12789;
    lung p = 127;
    lung r = 1;
    biți lungi = 119;
    lung c = 2;
    // Factorizarea lui m este necesară pentru bootstrapping.
    vector<lung> mvec = {49, 261};
    // Setul generator al grupului Zm*.
    vector<lung> gens = {11224, 7106};
    // Comenzile generatoarelor anterioare.
    vector<lungi> ordine = {42, 6};
    
    Context context = ContextBuilder<BGV>()
                                   .m(m)
                                   .p(p)
                                   .r(r)
                                   .gens(gens)
                                   .ords(ords)
                                   .biți (biți)
                                   .c(c)
                                   .bootstrappable (adevărat)
                                   .mvec(mvec)
                                   .construi();
    // Managementul cheilor
    SecKey cheie_secretă(context);
    secret_key.GenSecKey();
    addSome1DMatrices(cheie_secretă);
    addFrbMatrices(cheie_secretă);
    secret_key.genRecryptData();
    const PubKey& public_key = secret_key;
    const EncryptedArray& ea = context.getEA();

    // creează un text cifrat
    std::vector<lung> ptxt(nslots);
    pentru (int i = 0; i < nslots; ++i) {
        ptxt[i] = 2;
    }
    Ctxt ctxt(cheie_publică);
    ea.encrypt(ctxt, cheie_publică, ptxt);

    // înmulțire și bootstrapping
    pentru (int i = 0; i < 10; i++) {
        dacă (ctxt.bitCapacity() <= 50)
        {
            cout << "Începeți bootstrapping!" << endl;
            cheie_publică.thinReCrypt(ctxt);
        }
        ctxt.square();
    }

Exceptia:

Începeți să faceți bootstrapping!
libc++abi: se încheie cu excepția neprinsă de tip helib::LogicError: rawModSwitch zgomotul scalat depășește limita: 309684.692524
se încheie cu excepția neprinsă a tipului helib::LogicError: rawModSwitch zgomotul scalat depășește limita: 309684.692524
Hilder Vitor Lima Pereira avatar
drapel us
Cred că Helib vă poate alege generatoarele și comenzile dacă nu le treceți în context.
kelalaka avatar
drapel in
[Standardizare criptare homomorfă](https://crypto.stackexchange.com/a/74939/18298)
Dylan avatar
drapel bb
@HilderVitorLimaPereira Bună, Hilder. Am încercat să creez contextul fără a-i transmite generatoarele și comenzile, dar nu a reușit din cauza „LogicError: Cyclotomic polynomial discretch”. Apoi rulez exemplul dat de HElib fără a le trece în context, nu funcționează din același motiv. Deci, se pare că HElib nu acceptă acest lucru.
Dylan avatar
drapel bb
@kelalaka Multumesc mult pentru partajare!
Hilder Vitor Lima Pereira avatar
drapel us
Am folosit deja următorul cod și a funcționat. Helib a găsit generatoarele singur. Cu toate acestea, nu folosește bootstrapping, așa că poate că aceasta este problema. Ai putea testa... `helib::Context context = helib::ContextBuilder<:bgv>().m(16384).p(257).r(1).bits(250).c(3).skHwt(0).build( );`
Dylan avatar
drapel bb
@HilderVitorLimaPereira, ai dreptate, am folosit codul de mai sus și am verificat `gens` și `ords` generate folosind funcțiile furnizate `context.getZMStar().ZmStarGen()` și `context.getZMStar().OrderOf() `. Cu toate acestea, nu am reușit să rulez codul din cauza `rawModSwitch scaled noise exceeds bound` când folosesc parametrii `m = 8471, p=127, bits=200, r=1, c=2, gens = {3744, 2366} , ords = {42, -2}, mvec = {43, 197}` (nivelul de securitate este în jur de `80`). Dar este ok pentru parametrii furnizați în `benchmarks/bgv_fatboot.cpp`, deși nivelul de securitate este `0`.

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.