Score:1

จะตั้งค่าพารามิเตอร์ (เช่น gen, ords และ mvec) สำหรับการบูตสแตรปใน HElib ได้อย่างไร

ธง bb

ฉันใช้ไลบรารีการเข้ารหัสแบบโฮโมมอร์ฟิก 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
Hilder Vitor Lima Pereira avatar
ฉันคิดว่า Helib สามารถเลือกเครื่องกำเนิดและคำสั่งให้คุณ ถ้าคุณไม่ส่งต่อไปยังบริบท
kelalaka avatar
in flag
[มาตรฐานการเข้ารหัสแบบโฮโมมอร์ฟิก](https://crypto.stackexchange.com/a/74939/18298)
Dylan avatar
bb flag
@HilderVitorLimaPereira สวัสดี ฮิลเดอร์ ฉันพยายามสร้างบริบทโดยไม่ผ่านตัวสร้างและคำสั่ง แต่ล้มเหลวเนื่องจาก `LogicError: Cyclotomic polynomial mismatch` จากนั้นฉันเรียกใช้ตัวอย่างที่กำหนดโดย HElib โดยไม่ส่งต่อไปยังบริบท มันใช้งานไม่ได้ด้วยเหตุผลเดียวกัน ดูเหมือนว่า HElib จะไม่รองรับสิ่งนี้
Dylan avatar
bb flag
@kelalaka ขอบคุณมากสำหรับการแบ่งปันของคุณ!
Hilder Vitor Lima Pereira avatar
ฉันใช้รหัสต่อไปนี้แล้วและใช้งานได้ เฮลิบพบเครื่องปั่นไฟด้วยตัวมันเอง อย่างไรก็ตาม มันไม่ได้ใช้การบูทสแตรป ดังนั้นนั่นอาจเป็นปัญหา คุณสามารถทดสอบ... `helib::Context บริบท = helib::ContextBuilder<:bgv>().m(16384).p(257).r(1).bits(250.c(3).skHwt(0).build( );`
Dylan avatar
bb flag
@HilderVitorLimaPereira คุณพูดถูก ฉันใช้โค้ดด้านบนและตรวจสอบ `gens` และ `ords` ที่สร้างขึ้นโดยใช้ฟังก์ชันที่มีให้ `context.getZMStar().ZmStarGen()` และ `context.getZMStar().OrderOf() `. อย่างไรก็ตาม ฉันไม่สามารถรันโค้ดได้เนื่องจาก `rawModSwitch scaled noise เกินขอบเขต' เมื่อฉันใช้พารามิเตอร์ `m = 8471, p=127, bits=200, r=1, c=2, gens = {3744, 2366} , ords = {42, -2}, mvec = {43, 197}` (ระดับความปลอดภัยอยู่ที่ประมาณ `80`) แต่ก็ใช้ได้สำหรับพารามิเตอร์ที่ให้ไว้ใน `benchmarks/bgv_fatboot.cpp` แม้ว่าระดับความปลอดภัยจะเป็น `0` ก็ตาม

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา