ฉันใช้ไลบรารีการเข้ารหัสแบบโฮโมมอร์ฟิก HElib เพื่อทำการทดลอง
ฉันพยายามใช้ bootstrapping กับพารามิเตอร์ที่ไม่อยู่ในตารางที่มาพร้อมกับ HElib
แต่ฉันไม่รู้ว่าจะเลือกพารามิเตอร์อย่างไร (เช่น gen, ords และ mvec) สำหรับการบูตสแตรป
ด้านล่างนี้คือตัวอย่างใน HElib (ตัวอย่าง/BGV_binary_arithmetic.cpp
)
// โมดูลัสเฉพาะของข้อความธรรมดา
ยาว p = 2;
// พหุนาม Cyclotomic - กำหนด phi(m)
ยาว m = 4095;
// ยก Hensel (ค่าเริ่มต้น = 1)
ยาว r = 1;
// จำนวนบิตของโมดูลัสเชน
บิตยาว = 500;
// จำนวนคอลัมน์ของเมทริกซ์การสลับคีย์ (โดยทั่วไปคือ 2 หรือ 3)
ยาว c = 2;
// การแยกตัวประกอบของ m ที่จำเป็นสำหรับการบูตสแตรป
std::vector<long> mvec = {7, 5, 9, 13};
// กำลังสร้างชุดของกลุ่ม Zm*
std::vector<long> gen = {2341, 3277, 911};
// คำสั่งของเครื่องกำเนิดก่อนหน้า
std::vector<long> ออร์เดอร์ = {6, 4, 6};
คำถามของฉัน: ในการทดลองของฉัน ฉันต้องการไซเฟอร์เท็กซ์ที่มีจำนวนช่องที่แน่นอน (เช่น ช่อง = 256, 1024, 4096
). เลยต้องหาที่เหมาะๆ เมตร, พี, บิต
เพื่อสร้างไซเฟอร์เท็กซ์ด้วยสล็อตเหล่านี้ แต่สำหรับสิ่งเหล่านี้ เมตร, พี, บิต
, ฉันไม่ทราบวิธีการตั้งค่า mvec, gen, ords
.
นี่คือตัวอย่างเฉพาะ:
ยาว m = 12800;
ยาว p = 127;
ยาว r = 1;
บิตยาว = 119;
ยาว c = 2;
เวกเตอร์<ยาว> mvec = {25, 512};
เวกเตอร์<long> gen = {2, 128};
เวกเตอร์<long> ออร์เดอร์ = {43, 4351};
โยนข้อยกเว้น: สิ้นสุดด้วยข้อยกเว้นที่ไม่ได้ตรวจจับของประเภท helib::LogicError: ตัวสร้างที่ผู้ใช้ระบุไม่ถูกต้อง
// ข้อมูลบางอย่างเกี่ยวกับบริบทนี้:
m = 12800, p = 127, phi(m) = 5120
ออร์ด(p) = 20
normBnd = 1.23107
polyNormBnd = 1.23107
ปัจจัย = [2 5]
เครื่องกำเนิดไฟฟ้า 43 มีคำสั่ง (== Z_m^*) เท่ากับ 128
เครื่องกำเนิดไฟฟ้า 4351 มีคำสั่ง (== Z_m^*) เท่ากับ 2
r = 1
nslots = 256
hwt = 0
ctxtPrimes = [6,7]
ไพรม์พิเศษ = [8]
จำนวนบิต = 173
ระดับความปลอดภัย = 98.4643
อัปเดต: ฉันเรียกใช้ตัวอย่างด้วยพารามิเตอร์ที่ HElib พบ (misc/psi/params.cpp
) แต่โยนข้อยกเว้น LogicError: เสียงที่ปรับขนาด rawModSwitch เกินขอบเขต: 309684.692524
.
พารามิเตอร์ที่กำหนดคือ: 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]"
รหัสนี้เขียนขึ้นสำหรับดำเนินการคูณหลาย ๆ ครั้งในขณะที่ตรวจสอบสัญญาณรบกวนและทำการบูตสแตรป
ยาว m = 12789;
ยาว p = 127;
ยาว r = 1;
บิตยาว = 119;
ยาว c = 2;
// การแยกตัวประกอบของ m ที่จำเป็นสำหรับการบูตสแตรป
เวกเตอร์<ยาว> mvec = {49, 261};
// กำลังสร้างชุดของกลุ่ม Zm*
เวกเตอร์<long> gen = {11224, 7106};
// คำสั่งของเครื่องกำเนิดก่อนหน้า
เวกเตอร์<long> ออร์ด = {42, 6};
บริบทบริบท = ContextBuilder<BGV>()
.ม.(ม.)
.p(พี)
.r(ร)
.gens(เจน)
.ords(ออร์ด)
.bits(บิต)
.ค(ค)
.bootstrapable(จริง)
.mvec(เอ็มเวค)
.สร้าง();
// การจัดการคีย์
SecKey secret_key (บริบท);
secret_key.GenSecKey();
addSome1DMatrices (secret_key);
addFrbMatrices (secret_key);
secret_key.genRecryptData();
const PubKey&public_key = secret_key;
Const EncryptedArray& ea = Context.getEA();
// สร้างไซเฟอร์เท็กซ์
std::vector<long> ptxt(nslots);
สำหรับ (int i = 0; i < nslots; ++i) {
ptxt[i] = 2;
}
Ctxt ctxt (คีย์สาธารณะ);
ea.encrypt(ctxt, public_key, ptxt);
// การคูณและการบูตสแตรป
สำหรับ (int i = 0; i <10; i++) {
ถ้า (ctxt.bitCapacity() <= 50)
{
ศาล << "เริ่มต้นการบูต!" << ท้าย;
public_key.thinReCrypt(ctxt);
}
ctxt.square();
}
ข้อยกเว้น:
เริ่มการบู๊ตเครื่อง!
libc++abi: สิ้นสุดด้วยข้อยกเว้นที่ไม่ได้ตรวจจับของประเภท helib::LogicError: เสียงที่ปรับขนาด rawModSwitch เกินขอบเขต: 309684.692524
สิ้นสุดด้วยข้อยกเว้นที่ไม่ได้ตรวจสอบของประเภท helib::LogicError: เสียงที่ปรับขนาด rawModSwitch เกินขอบเขต: 309684.692524