与多个用户一起处理 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_key
、secret_key
和 parms
保存到文件中供以后使用。我使用 public_key
加密一些数据并将其存储在数据库中。我使用服务器上保存的 parms
和数据库对存储的 Ciphertexts
例如执行一些数学运算evaluator.add(stored_ciphertext1, stored_ciphertext2, result_ciphertext3);
.
现在假设另一个人想要:
- 对我存储的
Ciphertexts
进行计算。
- 上传一些新的加密
Ciphertexts
到我旁边的数据库。
对于选项 1,第二个人只需要我存储的 parms
在我的 Ciphertexts
上执行 evaluator.add()
或者他可以为此目的创建一次新的吗?
对于选项 2,第二个人必须能够访问我存储的 public_key
,因为创建 new_public_key
、new_secret_key
集将不允许我解密任何使用 [=24 加密的数据=] 正确,对吗?
现在让事情变得更加混乱 :-) 假设第二个人创建了他自己的 new_public_key
、new_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::save
和 load
以序列化(二进制)格式将其提供给它们,或者以其他方式让它们知道,以便它们然后可以创建自己的 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 方案在理论上允许这种行为(双方都需要帮助解密)但此时它们不是很有效并且没有在我所知道的任何库中实现。
我的 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_key
、secret_key
和 parms
保存到文件中供以后使用。我使用 public_key
加密一些数据并将其存储在数据库中。我使用服务器上保存的 parms
和数据库对存储的 Ciphertexts
例如执行一些数学运算evaluator.add(stored_ciphertext1, stored_ciphertext2, result_ciphertext3);
.
现在假设另一个人想要:
- 对我存储的
Ciphertexts
进行计算。 - 上传一些新的加密
Ciphertexts
到我旁边的数据库。
对于选项 1,第二个人只需要我存储的 parms
在我的 Ciphertexts
上执行 evaluator.add()
或者他可以为此目的创建一次新的吗?
对于选项 2,第二个人必须能够访问我存储的 public_key
,因为创建 new_public_key
、new_secret_key
集将不允许我解密任何使用 [=24 加密的数据=] 正确,对吗?
现在让事情变得更加混乱 :-) 假设第二个人创建了他自己的 new_public_key
、new_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::save
和 load
以序列化(二进制)格式将其提供给它们,或者以其他方式让它们知道,以便它们然后可以创建自己的 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 方案在理论上允许这种行为(双方都需要帮助解密)但此时它们不是很有效并且没有在我所知道的任何库中实现。