与多个用户一起处理 SEAL 密文

Working on SEAL Ciphertexts with multiple users

我的 SEAL v2.3.1 中有这些 SEAL 设置:

seal::EncryptionParameters parms;
parms.set_poly_modulus("1x^2048 + 1");
parms.set_coeff_modulus(seal::coeff_modulus_128(2048));
parms.set_plain_modulus(1 << 8);

seal::SEALContext context(parms);

seal::IntegerEncoder encoder(context.plain_modulus());
seal::KeyGenerator keygen(context);
seal::PublicKey public_key = keygen.public_key();
seal::SecretKey secret_key = keygen.secret_key();

seal::Encryptor encryptor(context, public_key);
seal::Evaluator evaluator(context);
seal::Decryptor decryptor(context, secret_key);

我已经将 public_keysecret_keyparms 保存到文件中供以后使用。我使用 public_key 加密一些数据并将其存储在数据库中。我使用服务器上保存的 parms 和数据库对存储的 Ciphertexts 例如执行一些数学运算evaluator.add(stored_ciphertext1, stored_ciphertext2, result_ciphertext3);.

现在假设另一个人想要:

  1. 对我存储的 Ciphertexts 进行计算。
  2. 上传一些新的加密 Ciphertexts 到我旁边的数据库。

对于选项 1,第二个人只需要我存储的 parms 在我的 Ciphertexts 上执行 evaluator.add() 或者他可以为此目的创建一次新的吗?

对于选项 2,第二个人必须能够访问我存储的 public_key,因为创建 new_public_keynew_secret_key 集将不允许我解密任何使用 [=24 加密的数据=] 正确,对吗?

现在让事情变得更加混乱 :-) 假设第二个人创建了他自己的 new_public_keynew_secret_key 并在其他 [=50= 中上传了他自己的 Ciphertexts ] 在同一数据库上。现在我想使用他和我的 Ciphertexts 执行一些交叉计算。有没有办法让它工作或者它永远不会工作,因为我们每个人都使用不同的 public_key 进行加密?

For option 1 the second person only needs my stored parms to execute evaluator.add() on my Ciphertexts or can he create new once for this purpose?

对方需要知道你的加密参数是什么。此外,EncryptionParameters 对象仅依赖于这些参数:您可以使用 EncryptionParameters::saveload 以序列化(二进制)格式将其提供给它们,或者以其他方式让它们知道,以便它们然后可以创建自己的 EncryptionParameters 对象,它将起作用。

For option 2 the second person has to have access to my stored public_key because creating new_public_key, new_secret_key set will not allow me to decrypt any data encrypted with new_public_key correctly, right?

要让第二个人加密数据供您解密,他们需要您的 public 密钥。是的,它必须与您存储的 public 密钥相同。理论上可以创建多个 public 密钥对应同一个密钥,但 SEAL 2.3.1 不支持这一点。

Now to make things more confusing :-) let's say the second person has created his own new_public_key, new_secret_key and uploaded his own Ciphertexts in some other table on the same database. Now I want to execute some cross calculations using his and my Ciphertexts. Is there a way for this to work or it can never work because each of us used a different public_key for encryption?

这行不通;您需要使用与用于加密的 public 密钥相对应的密钥进行解密。在这些场景中,可以通过引入一个非共谋的第三方来设置密钥切换服务,该第三方的唯一任务是接收在一个密钥下加密的密文,使用某个密钥将它们切换为使用另一个密钥,并将它们转发给正确的接收者. SEAL 2.3.1 不支持此类通用按键开关。或者,有一些多密钥 FHE 方案在理论上允许这种行为(双方都需要帮助解密)但此时它们不是很有效并且没有在我所知道的任何库中实现。