本文内容来自“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的整数组成(比如:\((c_1,c_2),c_1和c_2都是n维的向量(或者说是一个n次项的多项式)\)。参数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

CKKS加密方案的更多相关文章

  1. 一个异或加密方案--C语言实现

    核心代码: char encrypt( char f , char c) { return f^c; } int OutEncrypt( char *FilePath, char *SecretWor ...

  2. C# .net 语言加密方案

    C# .net 语言加密方案 方案背景 当前C# .net语言的应用范围越来越广泛,IIS 的服务器架构后台代码.桌面应用程序的 winform .Unity3d 的逻辑脚本都在使用.C# .net ...

  3. lua 代码加密方案

    require 实现 require函数在实现上是依次调用package.searchers(lua51中是package.loaders)中的载入函数,成功后返回.在loadlib.c文件里有四个载 ...

  4. 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案

    基于HTTP在互联网传输敏感数据的消息摘要.签名与加密方案 博客分类: 信息安全 Java 签名加密AESMD5HTTPS  一.关键词 HTTP,HTTPS,AES,SHA-1,MD5,消息摘要,数 ...

  5. [原创]aaencode等类似js加密方案破解方法

    受http://tieba.baidu.com/p/4104806767 2L启发,不过他说的方法,我没有尝试成功,自己摸索出了一个新方法,在这里分享下. 首先拿aaencode官网的加密字符串作为例 ...

  6. 基于RSA的WEB前端密码加密方案

    受制于WEB页面源码的暴露,因此传统的对称加密方案以及加密密钥都将暴露在JS文件中,同样可以被解密. 目前比较好的解决方案是WEB页面全程或用户登录等关键环节使用HTTPS进行传输. 另外一种解决方案 ...

  7. 如何保护你的 Python 代码 (一)—— 现有加密方案

    https://zhuanlan.zhihu.com/p/54296517 0 前言 去年11月在PyCon China 2018 杭州站分享了 Python 源码加密,讲述了如何通过修改 Pytho ...

  8. [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案

    如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前

  9. Android数据库(sqlite)加密方案

    最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...

随机推荐

  1. HDU 1052:Tian Ji -- The Horse Racing(贪心)

    Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536/32768 K (Jav ...

  2. 「算法笔记」Min_25 筛

    戳 这里(加了密码).虽然写的可能还算清楚,但还是不公开了吧 QwQ. 真的想看的 私信可能会考虑给密码 qwq.就放个板子: //LOJ 6053 简单的函数 f(p^c)=p xor c #inc ...

  3. A Tutorial on Energy-Based Learning

    目录 概 主要内容 损失函数 Energy Loss Generalized Perceptron Loss Generalized Margin Loss Hinge Loss Log Loss L ...

  4. CS5265完美替代CH7211|Type-C转HDMI2.0单转方案|CH7211替代方案

    龙迅Chrontel的CH7211是一款Type-C转HDMI2.0半导体设备,可通过USB Type-C连接器将DisplayPort信号转换为HDMI/DVI.这款创新的基于USB Type-C的 ...

  5. 基于Spring MVC + Spring + MyBatis的【图书信息管理系统(一)】

    资源下载:https://download.csdn.net/download/weixin_44893902/34867237 练习点设计:模糊查询.删除.新增 一.语言和环境 1.实现语言:JAV ...

  6. VMware客户端vSphere Web Client新建虚拟机

    1.说明 vSphere Web Client是为管理员提供的一款通用的. 基于浏览器的VMware管理工具, 能够监控并管理VMware基础设施. 由于需要登录的宿主机安装的是ESXi-6.5.0, ...

  7. Docker基本命令入门

    本文介绍Docker基本的操作命令,包括对镜像容器的获取,查看,保存,启停等操作. 1. 检查docker的版本: docker version docker -v 2. 搜索名字叫做tutorial ...

  8. css基础-2 div布局

    div布局 <html> <head> <title>div布局 </title> <meta charset="utf-8" ...

  9. K210,yolo,face_mask口罩检测模型训练及其在K210,kd233上部署

    前段时间考研,再加上工作,时间很紧,一直没有更新博客,这几天在搞k210的目标检测模型,做个记录,遇到问题可以添加qq522414928或添加微信13473465975,共同学习 首先附上github ...

  10. 初识python: 面向对象是个啥?

    编程范式:编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 ,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多 ...