Câu trả lời ngắn gọn là không có cách nào khác để truy cập dữ liệu bản mã trong SEAL. Con trỏ được trả về bởi Ciphertext::data
sẽ cung cấp cho bạn quyền truy cập trực tiếp vào dữ liệu bản mã và theo nghĩa đó cho phép bạn thực hiện bất kỳ loại tính toán nào trên đó, ví dụ:chuyển đổi thành một chuỗi mà con người có thể đọc được nếu vì lý do nào đó bạn muốn làm điều đó.
Tất nhiên để làm bất cứ điều gì dễ hiểu, bạn cần biết bố cục dữ liệu của bản mã. Trong lược đồ BFV, một bản mã bao gồm một cặp đa thức (c 0 , c 1 ) với kích thước lớn (kích thước coeff_modulus
) các hệ số. Vì hoạt động trên các đa thức có hệ số lớn như vậy là không thuận tiện, SEAL 2.3.1 thay vào đó sử dụng coeff_modulus
tổng hợp và lưu trữ cả c 0 và c 1 modulo từng thừa số nguyên tố được chỉ định trong coeff_modulus
(biểu thị các yếu tố này q 1 , q 2 , ..., q k ). Mỗi q i phù hợp với một từ 64 bit, vì vậy tất cả các đa thức 2k này đều có hệ số kích thước từ.
Bố cục dữ liệu hệ số bản mã như sau (liền kề trong bộ nhớ):
[c 0 mod q 1 ] [c 0 mod q 2 ] ... [c 0 mod q k ] [c 1 mod q 1 ] [c 1 mod q 2 ] ... [c 1 mod q k ]
nơi mỗi [c i mod q j ] giống như
[c 0 [0] mod q j ] [c 1 [0] mod q j ] ... [c n-1 [0] mod q j ]
Ở đây tôi đã sử dụng c i [k] để biểu thị hệ số bậc k của c i . Lưu ý rằng mỗi hệ số được lưu trữ trong uint64_t
.
Ciphertext::data
trả về một con trỏ đến hệ số không đổi của c 0 đa thức đối với mô đun đầu tiên trong coeff_modulus
của bạn , tức là đến c 0 [0] mod q 1 . Ngoài dữ liệu hệ số này, Bản mã chứa một số trường khác mà bạn có thể đọc bằng cách sử dụng các hàm thành viên.