คำถามนี้เกี่ยวกับการทำให้เป็นอนุกรมของ พีเค
, สก
, และ บริบท
ใน HElib.
ในสถานการณ์ของฉัน มีสองฝ่ายที่เชื่อถือได้ (A และ B) ทั้งสองฝ่ายสามารถเข้ารหัสข้อความและถอดรหัสข้อความเข้ารหัสได้
ดังนั้น A จะส่ง บริบท
, พีเค
, และ สก
ถึง B จากนั้น A จะเข้ารหัสข้อความและส่ง ctxtA
ถึง B, B ถอดรหัส ctxtA
และส่งอีก ctxtB
ถึง A ตัวอย่างนี้เป็นเพียงการอธิบายเท่านั้น
แต่มันทำให้เกิดความสับสนในการใช้งาน HElib ได้รับข้อผิดพลาด: ความไม่ตรงกันของบริบท
โค้ดตัวอย่างแสดงด้านล่าง:
บริบท* newContext;
unique_ptr<SecKey> newSecKey;
unique_ptr<PubKey> newPubKey;
โมฆะการทดสอบ :: testStruct () {
ยาว p = 127;
m ยาวที่ไม่ได้ลงชื่อ = 12800;
ยาวที่ไม่ได้ลงชื่อ r = 1;
บิตยาวที่ไม่ได้ลงชื่อ = 119;
ยาว c = 2;
helib::Context บริบท = helib::ContextBuilder<helib::BGV>()
.ม.(ม.)
.p(พี)
.r(ร)
.bits(บิต)
.ค(ค)
.สร้าง();
helib::SecKey oldSk (บริบท);
oldSk.GenSecKey();
helib::addSome1DMatrices(oldSk);
const helib::PubKey& oldPk = oldSk;
เอสเอสสตริงสตรีม;
บริบท.writeTo(ss);
newContext = บริบท :: readPtrFrom (ss);
ศาล << "บริบทเท่ากับ:" << (บริบทใหม่ == บริบท) << endl; // ผลลัพธ์:1
// pk และ sk ที่สร้างขึ้นใหม่
newSecKey = make_unique<SecKey>(*newContext);
newSecKey->GenSecKey();
addSome1DMatrices(*newSecKey);
newPubKey = make_unique<PubKey>(*newSecKey);
เข้ารหัส (*newContext, *newPubKey, *newSecKey); // งานนี้
// เข้ารหัส (*newContext, *newPubKey, oldSk); ล้มเหลวเนื่องจากบริบทไม่ตรงกัน
// หรือเข้ารหัส (*newContext, oldPk, *newSecKey); ล้มเหลวเนื่องจากบริบทไม่ตรงกัน
}
การทดสอบเป็นโมฆะ :: เข้ารหัส (const Context& con, const PubKey& pk, const SecKey& sk){
เวกเตอร์ <ยาว> อินพุตทดสอบ (256);
สำหรับ (ผมยาว = 0; ผม< 256; i++) {
การทดสอบอินพุต [i] = ฉัน % 2;
}
ศาล << อินพุตทดสอบ << endl;
Ctxt กะรัต(pk);
เวกเตอร์ <long> เอาต์พุตทดสอบ;
// การเข้ารหัส
con.getEA().เข้ารหัส(ct, pk, ทดสอบอินพุต);
// ถอดรหัส
con.getEA().decrypt(ct, sk, การทดสอบเอาต์พุต);
ศาล << outputtest << endl;
}
โดยรวม, (oldContext, oldSk, oldPk)
และ (บริบทใหม่, newSk, newPk)
ไม่สามารถผสมได้
เข้ารหัส (*newContext, *newPubKey, oldSk); ล้มเหลวเนื่องจากบริบทไม่ตรงกัน
// หรือเข้ารหัส (*newContext, oldPk, *newSecKey); ล้มเหลวเนื่องจากบริบทไม่ตรงกัน
แต่เราจะเห็นว่าบริบทใหม่และเก่ามีความเท่าเทียมกันตามรหัส:
ศาล << "บริบทเท่ากับ:" << (บริบทใหม่ == บริบท) << endl; // ผลลัพธ์:1
ป.ล. ไม่พิจารณาการเขียนและอ่านจากไฟล์ เฉพาะ stringstream
เฮลิบ