本文内容来自“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. Spring Boot 使用 Filter

    Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理. 1. 编写 ...

  2. A ROBUST KERNEL PCA ALGORITHM

    目录 引 主要内容 问题一 问题二 Lu C, Zhang T, Du X, et al. A robust kernel PCA algorithm[C]. international confer ...

  3. 编写Java程序,使用菜单组件制作一个记事本编辑器

    返回本章节 返回作业目录 需求说明: 使用菜单组件制作一个记事本编辑器 实现思路: 创建记事本菜单工具栏JMenuBar. 创建多个菜单条JMenu. 创建多个菜单项JMenuItem. 将菜单添加至 ...

  4. SpringBoot集成MyBatis-Plus代码生成器(Dao)

    1.说明 本文基于SpringBoot集成MyBatis-Plus代码生成器, 把原来生成Entity.Mapper.Mapper XML.Service.Controller等各个模块的代码, 修改 ...

  5. JMeter_性能压测报错address already in use:connect

    报错截图如下: 原因分析: 这个问题的原因是windows端口被耗尽了(默认1024-5000),而且操作系统要 2~4分钟才会重新释放这些端口,所以可以增加windows的可用端口来解决.windo ...

  6. spring boot --- 注解 @Bean 和@Component

    1.前言 @Bean是给方法注册bean @Component是给不好归类的类注册bean 2.可以达到一样的效果 (1)@Component 直接注册即可 完整源码 package com.exam ...

  7. element ui 动态菜单解决方案集锦

    1.<分享一个VUE Element-UI 的多级菜单动态渲染的组件> 2.<饿了么组件库,element-ui开发精美的后台管理系统系列之(一)开发伸缩菜单> 3.<V ...

  8. [BJDCTF2020]EzPHP-POP链

    那次某信内部比赛中有道pop链问题的题目,我当时没有做出来,所以在此总结一下,本次以buu上复现的[MRCTF2020]Ezpop为例. 题目 1 Welcome to index.php 2 < ...

  9. phar反序列化

    我们一般利用反序列漏洞,一般都是借助unserialize()函数,不过随着人们安全的意识的提高这种漏洞利用越来越来难了,但是在今年8月份的Blackhat2018大会上,来自Secarma的安全研究 ...

  10. shell基础知识查缺补漏

    最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...