c++ - 带有 CKKS 的 Microsoft SEAL 中的 vector 点积

标签 c++ encryption cryptography seal

我目前正在尝试使用 Microsoft SEAL 库实现矩阵乘法方法。我创建了一个 vector<vector<double>>作为输入矩阵并用 CKKSEncoder 编码.然而,编码器将整个 vector 打包成一个 Plaintext所以我只有一个vector<Plaintext>这让我失去了 2D 结构(然后我当然会在加密后得到一个 vector<Ciphertext>)。拥有一维 vector 后,我只能完全访问行,而不能访问列。

我设法在编码前转置矩阵。这允许我按分量乘以第一个矩阵的行和第二个矩阵的列(转置形式的行),但我无法将结果 vector 的元素加在一起,因为它被打包到一个密文中。我只需要弄清楚如何使 vector 点积在 SEAL 中工作以执行矩阵乘法。我是否遗漏了什么或者我的方法有误?

最佳答案

KyoohyungHan 在问题中建议:https://github.com/microsoft/SEAL/issues/138可以通过旋转输出 vector 并反复求和来解决旋转问题。

例如:

// my_output_vector is the Ciphertext output

vector<Ciphertext> rotations_output(my_output_vector.size());

for(int steps = 0; steps < my_output_vector.size(); steps++)
{
    evaluator.rotate_vector(my_output_vector, steps, galois_keys, rotations_output[steps]);
}

Ciphertext sum_output;
evaluator.add_many(rotations_output, sum_output);

关于c++ - 带有 CKKS 的 Microsoft SEAL 中的 vector 点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60203625/

相关文章:

ASP.NET Rijndael 加密错误 - 指定的 key 不是该算法的有效大小

cryptography - 为什么在 Diffie-Hellman key 交换中使用素数?

cryptography - c#中的RSA密码学

c++ - 使用 CMake 检测支持的 C++ 标准

c++ - Arduino snprintf 在使用 float 时返回一个包含问号的字符串

rest - Restful 服务上的数据加密

javascript - 从 Javascript (nodeJS) 到 dart (Flutter) 以及从 dart 到 Javascript 的加密和解密

c++ - 使用 OpenMP 的较慢代码如何并行化?

c++ - OpenGL 3.2 为什么我会收到 glTexStorage3D 的 INVALID_ENUM 错误?

python - 解密单字节 XOR 编码文件