由于我们无法真正选择将旋转哪些插槽,因此实现此目的的一般方法更多是一种解决方法:
给定seal::Ciphertext x、int steps 和适当的评估器/编码器和Seal Rotation Example (including Explanations) 中的密钥,我们可以执行以下操作:
- 复制 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);