2021SC@SDUSC PALISADE开源库(三)CKKS代码分析(一)简单代码步骤介绍

这篇博客详细介绍了如何利用PALISADE库进行CKKS同态加密的大致步骤,包括设置CryptoContext类,指定乘法深度、缩放因子位长、密文槽数和安全级别,以及密钥生成、输入编码和加密、加减乘等操作和解密。文章强调了乘法深度和缩放因子在计算精度和噪声管理中的作用,并展示了CKKS方案如何处理实数计算。此外,还提到了编码和解码、密文操作以及解密输出的过程。

2021SC@SDUSC

目录

介绍

大体步骤

1. 设置CryptoContext类

1)指定乘法深度

2)指定缩放因子的位长

3)指定密文中使用的明文槽数

4)指定基于FHE标准的期望安全级别

5)基于指定参数加密上下文

2. 密钥生成

1)生成加密密钥

2)生成重新线性化键

3)生成旋转键

3. 输入后的编码和加密

4. 进行加减乘等操作

5. 解密和输出


介绍

        在这一篇博客中,我们主要是介绍了利用PALISADE的主要API来进行CKKS的同态加密解密的大体步骤以及部分代码,如果想要看完整代码和运行过程及结果的同学,请查看的我的下一篇博客 PALISADE开源库(三)CKKS代码分析(二)简单代码运行及结果 来进行具体的操作。

大体步骤

1. 设置CryptoContext类

1)指定乘法深度

        我们在这里设置的CKKS方案将适用于任何具有乘数深度等于" multidepth "的计算。这是给定乘法的最大可能深度,但不是该方案支持的乘法总数。

        例如,f(x, y) = x^2 + x*y + y^2 + x + y的乘法深度为1,但总共需要3次乘法。另一方面,计算  g(x_i) = x1*x2*x3*x4 可以实现为 g(x_i) = ((x1*x2)*x3)*x4的乘法深度为3的计算,也可以实现为乘深2的计算:g(x_i) = (x1*x2)*(x3*x4)。

        出于性能方面的考虑,通常更可取的做法是尽可能缩短乘法深度。

  uint32_t multDepth = 1;

2)指定缩放因子的位长

        CKKS适用于实数,但这些数字被编码为整数。例如,实数m = 0.01被编码为m' = round(m*D),其中D是称为比例因子的方案参数。假设D = 1000,那么 m' 是 10(一个整数)。假设一个基于 m' 的计算结果是130,然后在解密时,去掉比例因子,使用户看到的实数结果是0.13。

        参数 " scaleFactorBits " 决定了比例因子 D 的位长,而不是比例因子本身。后者是特定于实现的,在CKKS的某些版本(例如EXACTRESCALE)中,它也可能在密文之间有所不同。

        选择 " scaleFactorBits " 取决于所需的计算精度,以及剩余的参数,如 multidepth 或 security 。这是因为其余的参数决定了在计算过程中会产生多少噪声 (记住CKKS是一种近似方案,每次操作都会产生少量的噪声)。缩放因子应该足够大,既能容纳这种噪声,又能支持与所需精度匹配的结果。

uint32_t scaleFactorBits = 50;

3)指定密文中使用的明文槽数

        CKKS在每个密文中包含多个明文值。插槽的最大数目取决于称为环尺寸的安全参数。在本例中,我们不直接指定环的尺寸,而是让库根据我们选择的安全级别、我们希望支持的乘深和比例因子大小为我们选择环的尺寸。

        请使用  GetRingDimension()  方法找出用于这些参数的环的确切尺寸。根据CKKS的工作方式,给出环尺寸N,最大批量尺寸为N/2。

        这就是我上一个系列文章中提到的M和N的来源。

uint32_t batchSize = 8;

4)指定基于FHE标准的期望安全级别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值