CKKS加密方案

本文内容来自“Protecting Privacy throughHomomorphic Encryption”,主要学习里面的CKKS部分。

CKKS是一种同态加密方案,其安全性依赖于RLWE问题。明文是实数向量,表示为定点类型计算方式(实数表示方法:浮点计算和定点计算)。该方案很支持以SIMD方式在这些向量之间进行定点运算。

CKKS方案涉及几个参数,这些参数决定了该方案支持的安全级别、功能和精度。这些参数是:
1、与计算精度相对应的小数位数f;
2、(最大的)密文模数q;
3、密文维数n

我们假设每一个明文值都表示为一个二进制定点数,它在小数点后有f个小数位。密文的f值可以在使用重缩放后进行调整,这是CKKS的一个显著特征。

这里介绍实数的表示方法:
对实数的计算有两种表示形式
例如:
(有效位:6位;缩减因子:2^-5)
(这里一个实数(浮点数),可以分成两部分表示,整数部分叫做“有效位”,小数部分叫做“缩减因子”)
1、浮点计算
(有效位:6位;缩减因子:2^-4。有效位不变,缩减因子变)
2、定点计算
(有效位:7位;缩减因子:2^-5。有效位变,缩减因子不变)
在加密解密中,定点计算更合适,因为计算消耗更小(省去了约减缩减因子的计算)

密文模数q是决定方案加密计算能力的主要参数。CKKS方案的密文由2n个模q的整数组成(比如:(c1,c2),c1c2nn。参数q越大,对密文执行的操作越多,精度越高。对于给定的q值,密文维数n决定了方案的安全级别,n越大表示安全性越高。读者可以参考《参数选择》那部分了解更多细节。

如上所述,CKKS允许我们加密多个定点数字在一个密文中(可以理解为,多个明文数字打包到一个明文多项式,然后加密成一个密文)。密文维数n还决定了明文多项式的大小,即n/2。

同态计算#

所有涉及至少一个加密输入的计算都会产生加密输出。主要计算包括:

两个参数#

1、密文 加 密文
2、密文 加 明文
3、密文 乘 密文
4、密文 乘 明文
5、密文 减 密文
6、密文 减 明文

密文-密文和密文-明文的乘法返回一个密文,其缩减因子是输入值的缩减因子的乘积。

密文-密文和密文-明文加法需要输入的缩减因子匹配(意思就是,缩减因子要一致)。

单个参数#

1、求逆
2、旋转
3、重缩放

重缩放是在乘法运算之后进行,它是将输入密文的缩放因子除以特定因子的一元运算。它控制同态计算期间缩放因子的大小。密码模数在重新缩放操作后减小,如果密文模数太小,则不允许进一步乘法。

参数选择#

小数位数和加密方案支持的深度是需要考虑的主要参数。如果电路深度不超过由参数确定的界限,则可以对电路进行加密评估(意思就是可以继续执行密文计算)。

精度损失和溢出是定点算法的两个主要问题。CKKS中的密文在加密和计算后会产生错误,这是由参数f控制的。f越大意味着结果越准确,但计算成本会随着f的增加而增加。同时,密文的大小必须充分小于密文模数q,以确保计算期间不会发生溢出。

最大密文模数q主要由待评估电路的乘法深度(意思就是可以执行多少次乘法计算)和精度参数f决定;更高的深度和更高的精度需要更大的密文模数,并且通常较慢。因此,一种常见的优化技术是将计算任务表示为深度最小的电路。例如,计算四个加密数字A、B、C和D的乘积最好是(A∗ B)∗ (C∗ D) 而不是A∗ (B∗ (C∗ D)),因为前者具有较低的乘法深度,因此需要较小的密文模数。
更具体的以下面的图为例:

一旦确定了q,现在就可以使用“全同态加密标准 ”中的表来确定密文维度n的下限,以达到所需的安全级别。建议应用程序开发人员使用实现“全同态加密标准 ”标准的库,并自动选择正确的表,因为选择正确的表需要了解实现的某些细节,例如密钥分发。

CKKS的小例子#

//
// Created by Pam on 2022/2/7.
//

// 首先定义参数f:小数位数,q:密文最大模数,n:密文维数
f=2;
q=65537;
n=8;

// 使用f=2的小数位的十进制表示

// 注意这里的设置并不安全!
// 要获得q=65537的方案安全性,我们至少需要n=512
// 使用这些参数,明文向量的大小为4(这里注意,明文维数:n/2)

// 用这些参数生成密钥
myPublicKey,mySecretKey=generateCKKSkey(n,q);

// 加密数据时,每个明文是由4个元素组成的向量
encrypted_a = encrypt(myPublicKey, [1.53, -11.53, 0.02, -3.32]);
encrypted_b = encrypt(myPublicKey, [12.29, 7.52, -14.47, 11.01]);
excrypted_c = encrypt(myPublicKey, [2.64, 10.78, -15.30, 13.34]);
// 现在得到了三个密文

// 现在将encrypted_a + encrypted_b
// 幸运的是,可以使用了同态加密,所以实际上可以这样做
encrypted_d = addCiphertexts(myPublicKey,encrypted_a, encrypted_b);
// 得到密文向量  [13.82, -4.01, -14.45, 7.69]

// 现在将encrypted_a * encrypted_b * excrypted_c
encrypted_e = multiplyCiphertexts(myPublicKey, encrypted_c,encrypted_d);
// 得到密文向量   [36.48, -43.23, 221.09, 102.58]

// 然后向右旋转2
// CKKS中的旋转大多就是进行对于矩阵的旋转,通俗一点讲就是,对于矩阵来说,旋转列可能就是将一列元素进行向左或者是向右进行平移。旋转行可能就是将矩阵的每两行进行对调,从而实现旋转的操作。
encrypted_f = rotateBy2(myPublicKey, encrypted_e);

// 解密,使用私钥
decrypted = decrypt(mySecretKey, encrypted_f);
print(decrypted);
// 输出: [221.09, 102.58, 36.48, -43.23]

更多#

数据编码#

在使用CKKS方案加密数据之前,需要对明文进行单独的编码操作。CKKS编码会导致精度损失,因此必须首先将明文向量乘以缩减因子(由方案参数确定),以确保编码后保持足够的精度。然后,将缩放后向量转换为方案的明文形式。密文中隐藏的缩减因子可能发生变化正在同态计算过程中。解密后,需要进行相应的解码操作。

密文模数(q)决定了编码后的底层明文上限(q/2),以保证其正确解密。例如,将密文模数设置为q=1024意味着缩放因子为32,加密12.34的密文可以正确解密,但使用缩放因子为256,加密相同的值将导致溢出。

这里不太理解: the underlying encoded plaintext,是什么意思,好几次见到了,希望大佬解惑?

其他操作#

CKKS方案还使用了一些操作,这些操作不会改变底层明文(除了一些可能的精度损失之外),但出于实现原因,仍然需要这些操作。
1、密文-密文乘法和循环向量旋转的副作用是,解密结果所需的密钥与操作前所需的密钥不同。因此,这些操作之后是密钥转换操作,以将密钥转换回原始密钥。密文-密文乘法的密钥切换操作也称为重线性化。

重线性化:在CKKS中是缩减密文的维数,保证密文的大小。
密钥转换:改变密文对应的密钥,重新生成一个新的密文,所对应的密钥也不同!
重线性化湿密钥转换的一个实例!

2、Bootstrapping可以“刷新”密文并提高密文模数,以支持更多的计算。这种操作成本很高,因此不经常使用(有时甚至没有实现)。

重缩放:CKKS中的rescaling是为了保证缩放因子不变,同时降低噪音,但会造成密文模数减少,所以只能构成有限级全同态方案,这里的bootstarpping能后提升密文模数,所以使用bootstrapping技术可以构造全同态!

计算密钥#

密钥切换操作要求计算者能够有一个公开的特殊计算密钥。计算密钥的生成必须由私钥所有者完成。在密文-密文乘法中,这些密钥通常被称为重线性化密钥;在密文旋转中,它们有时被称为旋转密钥或伽罗瓦密钥(Galois keys)。bootstarpping过程也需要这样的计算密钥。

CKKS的参考#

CKKS加密方案最早是在[Homomorphic Encryption for Arithmetic of Approximate Numbers]中提出的。出于与BFV方案相同的原因,需要在RNS中表示大整数。已经提出并实施了CKKS方案的几个RNS变体,包括[A Full RNS Variant of the Approximate Homomorphic Encryption,Optimized Homomorphic Encryption Solution for Secure Genome-Wide Association Studies,Semi-Parallel Logistic Regression for GWAS on Encrypted Data]和[Better Bootstrapping for Approximate Homomorphic Encryption]。现在的HE库通常实现这些RNS变体的组合,并经常添加自己的优化/可用性改进。[Bootstrapping for Approximate Homomorphic Encryption,Improved Bootstrapping for Approximate Homomorphic Encryption,Better Bootstrapping for Approximate Homomorphic Encryption]中描述了CKKS的bootstrapping。

接下来搞明白RNS是什么?

实现#

以下开源库具有CKKS的开源实现:
• HEAAN/RNS-HEAAN
• HElib
• Lattigo
• Microsoft SEAL
• PALISADE

作者:Hang Shao

出处:https://www.cnblogs.com/pam-sh/p/15867627.html

版权:本作品采用「知识共享」许可协议进行许可。

声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.

posted @   PamShao  阅读(6501)  评论(6编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu