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的整数组成(比如:\((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加密方案的更多相关文章
- 一个异或加密方案--C语言实现
核心代码: char encrypt( char f , char c) { return f^c; } int OutEncrypt( char *FilePath, char *SecretWor ...
- C# .net 语言加密方案
C# .net 语言加密方案 方案背景 当前C# .net语言的应用范围越来越广泛,IIS 的服务器架构后台代码.桌面应用程序的 winform .Unity3d 的逻辑脚本都在使用.C# .net ...
- lua 代码加密方案
require 实现 require函数在实现上是依次调用package.searchers(lua51中是package.loaders)中的载入函数,成功后返回.在loadlib.c文件里有四个载 ...
- 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案
基于HTTP在互联网传输敏感数据的消息摘要.签名与加密方案 博客分类: 信息安全 Java 签名加密AESMD5HTTPS 一.关键词 HTTP,HTTPS,AES,SHA-1,MD5,消息摘要,数 ...
- [原创]aaencode等类似js加密方案破解方法
受http://tieba.baidu.com/p/4104806767 2L启发,不过他说的方法,我没有尝试成功,自己摸索出了一个新方法,在这里分享下. 首先拿aaencode官网的加密字符串作为例 ...
- 基于RSA的WEB前端密码加密方案
受制于WEB页面源码的暴露,因此传统的对称加密方案以及加密密钥都将暴露在JS文件中,同样可以被解密. 目前比较好的解决方案是WEB页面全程或用户登录等关键环节使用HTTPS进行传输. 另外一种解决方案 ...
- 如何保护你的 Python 代码 (一)—— 现有加密方案
https://zhuanlan.zhihu.com/p/54296517 0 前言 去年11月在PyCon China 2018 杭州站分享了 Python 源码加密,讲述了如何通过修改 Pytho ...
- [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案
如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前
- Android数据库(sqlite)加密方案
最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...
随机推荐
- Spring Boot 使用 Filter
Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理. 1. 编写 ...
- A ROBUST KERNEL PCA ALGORITHM
目录 引 主要内容 问题一 问题二 Lu C, Zhang T, Du X, et al. A robust kernel PCA algorithm[C]. international confer ...
- 编写Java程序,使用菜单组件制作一个记事本编辑器
返回本章节 返回作业目录 需求说明: 使用菜单组件制作一个记事本编辑器 实现思路: 创建记事本菜单工具栏JMenuBar. 创建多个菜单条JMenu. 创建多个菜单项JMenuItem. 将菜单添加至 ...
- SpringBoot集成MyBatis-Plus代码生成器(Dao)
1.说明 本文基于SpringBoot集成MyBatis-Plus代码生成器, 把原来生成Entity.Mapper.Mapper XML.Service.Controller等各个模块的代码, 修改 ...
- JMeter_性能压测报错address already in use:connect
报错截图如下: 原因分析: 这个问题的原因是windows端口被耗尽了(默认1024-5000),而且操作系统要 2~4分钟才会重新释放这些端口,所以可以增加windows的可用端口来解决.windo ...
- spring boot --- 注解 @Bean 和@Component
1.前言 @Bean是给方法注册bean @Component是给不好归类的类注册bean 2.可以达到一样的效果 (1)@Component 直接注册即可 完整源码 package com.exam ...
- element ui 动态菜单解决方案集锦
1.<分享一个VUE Element-UI 的多级菜单动态渲染的组件> 2.<饿了么组件库,element-ui开发精美的后台管理系统系列之(一)开发伸缩菜单> 3.<V ...
- [BJDCTF2020]EzPHP-POP链
那次某信内部比赛中有道pop链问题的题目,我当时没有做出来,所以在此总结一下,本次以buu上复现的[MRCTF2020]Ezpop为例. 题目 1 Welcome to index.php 2 < ...
- phar反序列化
我们一般利用反序列漏洞,一般都是借助unserialize()函数,不过随着人们安全的意识的提高这种漏洞利用越来越来难了,但是在今年8月份的Blackhat2018大会上,来自Secarma的安全研究 ...
- shell基础知识查缺补漏
最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...