与多个用户一起使用SEAL密文

时间:2018-09-17 19:55:18

标签: c++ seal

我有那些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在我的evaluator.add()上执行Ciphertexts,或者他可以为此创建一次新的东西?

对于选项2,第二个人必须有权访问我存储的public_key,因为创建new_public_keynew_secret_key集将不允许我解密用new_public_key加密的任何数据正确吧?

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

1 个答案:

答案 0 :(得分:2)

  

对于选项1,第二个人只需要我存储的参数即可执行   我的密文上的evaluator.add()还是他可以为此创建一个新的   目的?

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

  

对于选项2,第二个人必须有权访问我存储的   public_key,因为创建new_public_key,new_secret_key集将   不允许我解密使用new_public_key加密的任何数据   正确吧?

第二个人需要加密数据才能解密,因此需要您的公共密钥。是的,它必须与您存储的公用密钥相同。从理论上讲,可以创建对应于同一秘密密钥的多个公共密钥,但是SEAL 2.3.1不支持此功能。

  

现在让事情变得更加混乱:-)假设第二个人   创建了自己的new_public_key,new_secret_key并上传了自己的   同一数据库中其他表中的密文。现在我想   使用他和我的密文执行一些交叉计算。在那儿   一种可行的方法,或者永远无法奏效,因为我们每个人都使用了   使用不同的public_key进行加密?

这行不通;您将需要使用与用于加密的公共密钥相对应的秘密密钥进行解密。在这些情况下,可以通过引入非冲突第三方来建立密钥交换服务,该第三方的唯一任务是接收使用一个密钥加密的密文,使用某个密钥将其切换为使用另一个密钥,然后将其转发给正确的接收者。但是,SEAL 2.3.1不支持此类通用密钥开关。另外,有一些多密钥FHE方案在理论上允许这种行为(双方都需要帮助解密),但是目前它们效率不高,并且在我所知的任何库中都没有实现。 >