Простая зашифрованная арифметическая библиотека (SEAL) и переменная seal::Ciphertext
Я использую библиотеку Simple Encrypted Arithmetic Library (SEAL) от исследовательской группы по криптографии Microsoft. Есть ли способ получить содержание seal::Ciphertext variable
? Я попытался понять ciphertext.h и ciphertext.cpp и нашел:
/**
Saves the ciphertext to an output stream. The output is in binary format and not
human-readable. The output stream must have the "binary" flag set.
@param[in] stream The stream to save the ciphertext to
@see load() to load a saved ciphertext.
*/
void save(std::ostream &stream) const;
/**
Loads a ciphertext from an input stream overwriting the current ciphertext.
@param[in] stream The stream to load the ciphertext from
@see save() to save a ciphertext.
*/
void load(std::istream &stream);
Но я не могу найти другой вариант, чтобы получить содержание любогоseal::Ciphertext variable
это не двоичный поток или просто указатель на какой-либо адрес памяти и сохранение в нем строки.
Если кто-то из вас скачал библиотеку SEAL по ссылке выше и распаковал ее, ничего не меняя. Вы можете найти все разрешенные операции на seal::Ciphertext
в SEAL_2.3.1\SEAL\seal\ciphertext.h и SEAL_2.3.1\SEAL\seal\ciphertext.cpp
1 ответ
Краткий ответ: в SEAL нет других способов доступа к данным зашифрованного текста. Указатель возвращается Ciphertext::data
предоставит вам прямой доступ к данным зашифрованного текста и в этом смысле позволит вам выполнять любые вычисления на них, например, преобразовывать их в удобочитаемую строку, если по какой-либо причине вы захотите это сделать.
Конечно, чтобы сделать что-либо вразумительное, вам нужно знать расположение данных зашифрованного текста. В схеме BFV зашифрованный текст состоит из пары полиномов (c0, c1) с большим (размер coeff_modulus
) коэффициенты. Поскольку работать с полиномами с такими большими коэффициентами неудобно, в SEAL 2.3.1 вместо этого используется составной coeff_modulus
и хранит как c0, так и c1 по модулю каждого из простых факторов, указанных в coeff_modulus
(обозначим эти факторы q1, q2,..., qk). Каждый qi вписывается в 64-битное слово, поэтому все эти 2k многочленов имеют коэффициенты размера слова.
Структура данных коэффициента зашифрованного текста выглядит следующим образом (непрерывно в памяти):
[c0 mod q1 ] [c0 mod q2 ]... [c0 mod qk ] [c1 mod q1 ] [c1 mod q2 ]... [c1 mod qk ]
где каждый [ci mod qj ] выглядит
[c0[0] mod qj ] [c1[0] mod qj ]... [cn-1[0] mod qj ]
Здесь я использовал ci[k] для обозначения коэффициента степени k для ci. Обратите внимание, что каждый коэффициент хранится в uint64_t
,
Ciphertext::data
возвращает указатель на постоянный коэффициент полинома c0 относительно первого модуля в вашем coeff_modulus
то есть до c0[0] mod q1. В дополнение к этим данным коэффициента, зашифрованный текст содержит несколько других полей, которые вы можете прочитать, используя функции-члены.