Tôi đang sử dụng thư viện mã hóa đồng cấu, HElib, để thực hiện các thử nghiệm.
Tôi đã thử sử dụng bootstrapping với các tham số không có trong bảng được cung cấp cùng với HElib.
Nhưng tôi không biết làm thế nào để chọn các tham số (ví dụ: gen, ords và mvec) để khởi động.
Dưới đây là một ví dụ trong HElib (ví dụ/BGV_binary_arithmetic.cpp
)
// Mô đun nguyên tố bản rõ.
dài p = 2;
// Đa thức cyclotomic - định nghĩa phi(m).
m dài = 4095;
// Nâng Hensel (mặc định = 1).
dài r = 1;
// Số bit của chuỗi mô-đun.
bit dài = 500;
// Số lượng cột của ma trận Key-Switching (thường là 2 hoặc 3).
dài c = 2;
// Hệ số hóa của m cần thiết cho bootstrapping.
std::vector<long> mvec = {7, 5, 9, 13};
// Tạo tập nhóm Zm*.
std::vector<long> gens = {2341, 3277, 911};
// Lệnh của các trình tạo trước đó.
std::vector<long> lệnh = {6, 4, 6};
Câu hỏi của tôi: Trong thử nghiệm của tôi, tôi cần bản mã với số lượng vị trí chính xác (chẳng hạn như vị trí = 256, 1024, 4096
). Vì vậy, tôi phải tìm đúng m, p, bit
để tạo ra một bản mã như vậy với các khe này. Nhưng đối với những m, p, bit
, tôi không biết làm thế nào để thiết lập mvec, gens, ords
.
Đây là một ví dụ cụ thể:
m dài = 12800;
dài p = 127;
dài r = 1;
bit dài = 119;
dài c = 2;
vectơ<dài> mvec = {25, 512};
vector<long> gens = {2, 128};
vectơ<long> lệnh = {43, 4351};
Ném một ngoại lệ: kết thúc với ngoại lệ chưa được phát hiện của loại helib::LogicError: Trình tạo do người dùng cung cấp không hợp lệ
// Một số thông tin về bối cảnh này:
m = 12800, p = 127, phi(m) = 5120
thứ tự(p) = 20
định mứcBnd = 1,23107
polyNormBnd = 1,23107
yếu tố = [2 5]
trình tạo 43 có thứ tự (== Z_m^*) là 128
trình tạo 4351 có thứ tự (== Z_m^*) là 2
r = 1
nslots = 256
hwt = 0
ctxtPrimes = [6,7]
đặc biệtPrimes = [8]
số bit = 173
mức độ bảo mật = 98.4643
Cập nhật: Tôi chạy một ví dụ với các tham số được tìm thấy bởi HElib (linh tinh/psi/params.cpp
), nhưng ném một ngoại lệ LogicError: tiếng ồn tỷ lệ rawModSwitch vượt quá giới hạn: 309684.692524
.
Các thông số đã cho là: 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ã này được viết để thực hiện nhiều phép nhân trong khi kiểm tra nhiễu và thực hiện khởi động.
m dài = 12789;
dài p = 127;
dài r = 1;
bit dài = 119;
dài c = 2;
// Hệ số hóa của m cần thiết cho bootstrapping.
vectơ<dài> mvec = {49, 261};
// Tạo tập nhóm Zm*.
vector<long> gens = {11224, 7106};
// Lệnh của các trình tạo trước đó.
vectơ<dài> lệnh = {42, 6};
Bối cảnh ngữ cảnh = ContextBuilder<BGV>()
.m(m)
.p(p)
.r(r)
.gens(gens)
.ords(ords)
.bits(bit)
.c(c)
.bootstrappable (đúng)
.mvec(mvec)
.xây dựng();
// Quản lý khóa
SecKey secret_key(bối cảnh);
secret_key.GenSecKey();
addSome1DMatrices(secret_key);
addFrbMatrices(secret_key);
secret_key.genRecryptData();
const PubKey& public_key = secret_key;
const EncryptedArray& ea = context.getEA();
// tạo một bản mã
std::vector<long> ptxt(nslots);
for (int i = 0; i < nslots; ++i) {
ptxt[i] = 2;
}
Ctxt ctxt(public_key);
ea.encrypt(ctxt, public_key, ptxt);
// phép nhân và bootstrapping
for (int i = 0; i < 10; i++) {
nếu (ctxt.bitCapacity() <= 50)
{
cout << "Bắt đầu khởi động!" << kết thúc;
public_key.thinReCrypt(ctxt);
}
ctxt.square();
}
Sự ngoại lệ:
Bắt đầu khởi động!
libc++abi: kết thúc với ngoại lệ chưa được phát hiện của loại helib::LogicError: tiếng ồn tỷ lệ rawModSwitch vượt quá giới hạn: 309684.692524
kết thúc với ngoại lệ loại helib::LogicError: rawModSwitch scale tiếng ồn vượt quá giới hạn: 309684.692524