本文内容来自“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. Following Orders(poj1270)

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4436   Accepted: 1791 ...

  2. IT6516DP转VGA转换器|替代台湾联阳IT6516方案|CS5212Capstone

    台湾联阳IT6516是一种高性能的DP显示端口到VGA转换器方案芯片.IT6516结合DisplayPort接收器和三重DAC,通过转换功能支持DisplayPort输入和VGA输出.内置Displa ...

  3. tcache BUUCTF gyctf_2020_signin

    Ubuntu18.04的题 用到了两个特性: 一个是 calloc 的特点:不会分配 tcache chunk 中的 chunk 另一个是 tcache 的特点:在分配 fastbin 中的 chun ...

  4. 云南农职《JavaScript交互式网页设计》 综合机试试卷⑥——简易旅游网

    本页面分为顶部导航.登录注册栏,中部图片展示.主体内容和底部反馈模板 一.导航栏部分 要求一:设置菜单栏(二级菜单)和登录注册模块 要求二:当鼠标悬停到菜单栏(一级菜单)时,二级菜单以滑动效果滑出显示 ...

  5. Java程序设计基础笔记 • 【第6章 循环结构进阶】

    全部章节   >>>> 本章目录 6.1 for循环 6.1.1 for循环的简介 6.1.2 for循环的使用 6.1.3 for循环的表达式 6.1.4 实践练习 6.2 ...

  6. .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记

    目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...

  7. Drools集成SpringBoot

    1.说明 为了更好的在项目中使用Drools, 需要把Drools集成到Spring Boot, 下面介绍集成的方法, 并且开发简单的Demo和测试用例. 2.创建Maven工程 pom.xml工程信 ...

  8. Linux查看CPU详细信息

    1.查看CPU详细信息 在Linux服务器上查看CPU详细信息: cat /proc/cpuinfo 输出结果: processor : 0 vendor_id : GenuineIntel cpu ...

  9. nano 编辑器快速入门

    # 打开或新建一个文件 $ nano tmp.txt # 常用组合按键 ^G:获取帮助 ^X:退出,如果文件有改定会提示是否保存 ^O:保存文件内容 ^R:读取其他文件的内容,放入到当前文件中 ^W: ...

  10. CSS基础 水平居中案例

    html结构 <body> <div class="father"> <div class="son"></div&g ...