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