在没有密钥的情况下读取密文的剩余噪声预算

Reading the remaining noise budget of Ciphertexts without the Secret Key

我使用 SEAL 2.3.1,这是我的参数设置:

seal::EncryptionParameters parms;
parms.set_poly_modulus("1x^2048 + 1"); // n = 2048
parms.set_coeff_modulus(coeff_modulus_128(2048)); // q = 54-bit prime
parms.set_plain_modulus(1 << 8); // t = 256

seal::SEALContext context(parms);

还有一些 Ciphertext encrypted1; 持有数字 5。手册说可以使用 seal::Simulator class 来读取噪声预算而无需密钥。我唯一发现的是 simulator.h 文件中的这个。

/**
Creates a simulation of a ciphertext encrypted with the specified encryption 
parameters and given invariant noise budget. The given noise budget must be 
at least zero, and at most the significant bit count of the coefficient 
modulus minus two.

@param[in] parms The encryption parameters
@param[in] noise_budget The invariant noise budget of the created ciphertext
@param[in] ciphertext_size The size of the created ciphertext
@throws std::invalid_argument if ciphertext_size is less than 2
@throws std::invalid_argument if noise_budget is not in the valid range
*/
Simulation(const EncryptionParameters &parms, int ciphertext_size, 
            int noise_budget);

我可以用其他的设置Ciphertext encrypted2:

seal::Simulation(parms, encrypted2.size(), (context.total_coeff_modulus().significant_bit_count() - log2(context.poly_modulus().coeff_count() - 1) - log2(context.plain_modulus().value()));

但是使用它只会创建一个模拟密文,与实际 encrypted1 密文噪声预算没有任何实际联系。

有没有办法在没有密钥的情况下估算 encrypted1 的噪声预算?当我或其他人对外部存储的密文进行一些计算时,这种情况很重要,例如在云数据库中,需要在不泄露密钥的情况下检查噪声预算服务器端。

Simulation class 旨在估计各种操作中的噪声预算消耗,以便实际上不必对真实数据执行这些操作。此外,它对噪声消耗使用启发式上限估计,即它很可能高估了噪声消耗,并且当计算更复杂时这种效果变得更加明显,有时会导致对噪声消耗的巨大高估。当然,这个想法是,如果根据模拟器工作,计算就可以保证工作。 Simulation 的典型用法是通过 ChooserPoly(及相关的)classes; SEALExamples/main.cpp SEAL 版本 < 3.0.

中的示例之一对此进行了演示

如果不知道密文是如何产生的,就不可能知道或估计密文中的噪声。因此,如果我给你一个密文而不告诉你任何其他信息(加密参数除外),那么除非你知道密钥,否则你不应该知道任何关于噪声预算的信息。我同意,在某些情况下,如果密文对于进一步的计算仍然有效,那么立即知道某人可能很重要,但如果没有一些外部机制,这是不可能的。