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
)
lung p = 2;
lungime m = 4095;
lung r = 1;
biți lungi = 500;
lung c = 2;
std::vector<lung> mvec = {7, 5, 9, 13};
std::vector<lung> gens = {2341, 3277, 911};
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;
vector<lung> mvec = {49, 261};
vector<lung> gens = {11224, 7106};
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();
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();
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);
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