2

只是想知道我们是否可以对旋转的密文执行一些操作,使得只有部分密文参与操作,而不是整个对象。假设我们只希望 ct 的 slot_count/2 部分参与操作,而后一个 slot_count/2 应该保持原样。任何想法如何去做?我目前正在使用 BFV 方案

4

1 回答 1

1

由于我们无法真正选择将旋转哪些插槽,因此实现此目的的一般方法更多是一种解决方法:

给定seal::Ciphertext x,int steps和适当的评估器/编码器和密封件旋转示例(包括解释)中的键,我们可以执行以下操作:

  1. 复制 xseal::Ciphertext copy = x;
  2. 旋转副本evaluator.rotate_vector_inplace(copy, steps, galoisKeys);(假设您使用的是 CKKS 方案)
  3. 与掩码相乘(插槽中为 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);
  1. 将原始与反向掩码相乘
 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);
  1. 将原始密文和旋转密文相加evaluator.add_inplace(x,copy);
于 2021-09-01T23:10:28.080 回答