Простая зашифрованная арифметическая библиотека (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. В дополнение к этим данным коэффициента, зашифрованный текст содержит несколько других полей, которые вы можете прочитать, используя функции-члены.

Другие вопросы по тегам