当前位置: 首页 > news >正文

同态加密:一个基于多方计算的CKKS方案

这篇文章主要介绍LattiGo团队搞出来的一个多方同态加密的工作。个人觉得比较优雅,而且有库支持,方便把玩,所以记一下。
在攒毕业论文的时候整了这么个看上去很烂,但是(个人觉得)有一点意思的烂活,没心思写那么多的公式,各位dalao凑合看,欢迎轻喷。

简介和亮点

实现了CKKS方案的一个多方计算版本(对BFV也适用)。这个多方版本的方案将私钥拆分成了nnn份分给nnn个计算方,一方一个。

对应的安全性:只要这nnn方别都是内鬼(比如所有方都沆瀣一气,沟通私钥),这个同态加密方案就具有语义安全性。

可以基于上述私钥拆分的想法设计一些有趣的多方解密/自举方案。

预备知识:CKKS同态加密方案的简介

引个流,看这儿。

LattiGo的多方CKKS方案

首先定义 nnn 个计算方:P=P1,...,PN\mathcal P = P_1, ..., P_NP=P1,...,PN

私钥生成

参与计算的nnn方都随机生成一个私钥碎片ski,fori=1,...,nsk_i, \textit{for}\ i=1,...,nski,for i=1,...,n。最后sk=∑skisk = \sum sk_isk=ski就是完整的私钥多项式。这意味着每一方都持有一个私钥的碎片。

在具体操作中,可以让客户端先线下生成nnn个私钥碎片再分发给nnn个计算方,或者每个计算方先生成私钥碎片再发送给客户端。

在方案运行过程中,各个计算方持有一个私钥碎片和全部的公钥。

其他钥生成(不费脑子版本)

我们先假设客户端持有私钥。那么客户端其实已经可以根据私钥计算出一系列的公钥,比如加密公钥、重线性化钥、旋转钥blablabla,然后公布给nnn个计算方使用。

至于nnn个计算方如何派生出这一系列公钥,可以在看完下面多方解密和多方自举部分后留作文末习题(doge

多方解密和多方自举

我们先通过介绍多方解密和多方自举方案来阐明文章里的一些核心想法。

多方解密

对于密文多项式对c=(c0,c1)c=(c_0, c_1)c=(c0,c1),解密方案就是求解m=c0+c1⋅skm = c_0+c_1\cdot skm=c0+c1sk

这里,多方参与完成解密就是计算c0+c1⋅∑skic_0+c_1\cdot \sum sk_ic0+c1ski

解密方法如下:

各方计算c1⋅ski+eic_1 \cdot sk_i + e_ic1ski+ei,其中eie_iei是噪声。然后计算

c0+∑(c1⋅ski+ei)c_0+ \sum (c_1 \cdot sk_i+e_i)c0+(c1ski+ei)

就完成了解密(虽然带了点噪声)。

在这个方案中,RLWE问题的语义安全性保证了skisk_iski很难被爆破,于是只要至少有一个计算方不是内鬼(不是内鬼:指保护好自己的私钥碎片),那么私钥就不会被破解。

多方自举

在实现多方自举之前,我们首先让各个计算方生成一个公有的密文ddd

首先各方生成随机密文did_idi,然后各方共同参与求和,得到d=∑did = \sum d_id=diddd被对外公布。

在这个过程中,只要计算方不是全员内鬼,那么did_ididdd就是语义安全的。

基于上述这些秘密did_ididdd,我们可以设计多方自举方案。

对于密文多项式对c=(c0,c1)c=(c_0, c_1)c=(c0,c1)

首先,各方计算c1⋅ski+di+eic_1\cdot sk_i +d_i + e_ic1ski+di+ei,其中eie_iei是噪声。

求和得到m=c0+∑(c1⋅ski+di+ei)m = c_0 + \sum(c_1\cdot sk_i +d_i + e_i)m=c0+(c1ski+di+ei)

然后,计算m−dm - dmd

于是多方自举就完成了。

本质上是对解密后的明文加上一层mask,然后再把它抹掉就完事了。

其他钥生成(费脑子版本)

课后习题:

nnn个计算方如何派生出加密公钥、重线性化钥、旋转钥blablabla一系列公钥呢?

http://www.lryc.cn/news/45259.html

相关文章:

  • 最小生成数
  • 【模板】树状数组
  • 网站都变成灰色了,怎么实现的?
  • NeRF详解
  • Java之静态代码块和静态类、静态导入
  • Python3 File isatty() 、os.chflags()方法
  • 【SH_CO_TMT_PACKAGE保留60天数据和增加索引】
  • 2022蓝桥杯省赛——数位排序
  • 弥散磁共振成像在神经科学中的应用
  • 多进程(python)
  • 利用Kali工具进行信息收集(35)
  • 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)
  • 实体商家做抖音运营如何做矩阵?
  • java 双列集合Map 万字详解
  • 【数据结构】二叉树<遍历>
  • linux查看硬件信息
  • 吐血整理,互联网大厂最常见的 1120 道 Java 面试题(带答案)整理
  • RabbitMQ如何避免消息丢失
  • 做算法题的正确姿势(不断更新)
  • p85 CTF夺旗-JAVA考点反编译XXE反序列化
  • FastJson——JSO字符串与对象的相互转化
  • 《程序员面试金典(第6版)》面试题 08.08. 有重复字符串的排列组合(回溯算法,全排列问题)C++
  • k8s API限流——server级别整体限流和客户端限流
  • 在华为做了三年软件测试被裁了,我该怎么办
  • Spring cloud 限流的多种方式
  • Linux命令·top
  • springmvc之系列文章
  • Matlab实现深度学习(附上完整仿真源码)
  • 我的谷歌书签
  • day3 数据库技术考点汇总