只是想知道我们是否可以对旋转的密文执行一些操作,使得只有部分密文参与操作,而不是整个对象。假设我们只希望 ct 的 slot_count/2 部分参与操作,而后一个 slot_count/2 应该保持原样。任何想法如何去做?我目前正在使用 BFV 方案
问问题
44 次
1 回答
1
由于我们无法真正选择将旋转哪些插槽,因此实现此目的的一般方法更多是一种解决方法:
给定seal::Ciphertext x
,int steps
和适当的评估器/编码器和密封件旋转示例(包括解释)中的键,我们可以执行以下操作:
- 复制 x
seal::Ciphertext copy = x;
- 旋转副本
evaluator.rotate_vector_inplace(copy, steps, galoisKeys);
(假设您使用的是 CKKS 方案) - 与掩码相乘(插槽中为 0 或 1 的明文)
std::vector<unsigned long int> mask = {1,1,1,1,1,0,0,0,0 /*...*/};
seal::Plaintext mask_ptxt;
encoder.encode(mask, mask_ptxt);
evaluator.multiply_plain_inplace(copy, mask_ptxt);
- 将原始与反向掩码相乘
std::vector<unsigned long int> inv_mask = {0,0,0,0,0,1,1,1,1 /*...*/};
seal::Plaintext inv_mask_ptxt;
encoder.encode(inv_mask , inv_mask_ptxt);
evaluator.multiply_plain_inplace(x, mask_ptxt);
- 将原始密文和旋转密文相加
evaluator.add_inplace(x,copy);
于 2021-09-01T23:10:28.080 回答