什么是同态加密

同态加密是一种加密形式,但是与我们理解的加密方法不同的是,它允许人们对密文进行特定形式的代数运算得到仍然是加密的结果,然后对结果进行解密得到的明文与直接对明文进行相同的代数运算的结果一样。如下图所示:

换言之,这项技术令人们可以对加密的数据进行处理,得出正确的结果,而在整个处理过程中无需对数据进行解密,直接在加密之后的明文上进行处理即可。

如果一种同态加密算法支持对密文进行任意形式的计算,则称其为全同态加密(Fully Homomorphic Encryption, FHE);如果支持对密文进行部分形式的计算,例如仅支持加法、仅支持乘法或支持有限次加法和乘法,则称其为半同态加密或部分同态加密,英文简称为SWHE(Somewhat Homomorphic Encryption)或PHE(Partially Homomorphic Encryption)。一般而言,由于任意计算均可通过加法和乘法构造,若加密算法同时满足加法同态性和乘法同态性,则可称其满足全同态性。

目前,同态加密算法主要分为半同态加密和全同态加密两大类。半同态加密主要包括以RSA算法和ElGamal算法为代表的乘法同态加密、以Paillier算法为代表的加法同态加密以及以Boneh-Goh-Nissim方案为代表的有限次数全同态加密;全同态加密算法主要包括以Gentry方案为代表的第一代方案、以BGV方案和BFV方案为代表的第二代方案、以GSW方案为代表的第三代方案以及支持浮点数近似计算的CKKS方案等等。

同态加密的组成部分

同态加密算法一般包含以下四个部分:

  1. KeyGen:密钥生成算法,产生公钥和私钥
  2. Encryption:加密算法
  3. Decryption:解密算法
  4. Homomorphic Property:同态加密计算部分

同态加密的分类

为了更好地理解与运用同态加密算法,我们按照将同态加密算法支持的运算类型和数量,将其分成3类:部分同态加密、层次同态加密、和全同态加密。

  1. **部分同态加密(Partial HE,简称PHE)指同态加密算法只对加法或乘法(其中一种)有同态的性质。**例如:RSA加密是最早应用的公钥加密算法框架,同时RSA算法也是一种PHE算法,其对乘法有同态的性质。PHE的研究成果出现比较早,并且加法同态加密算法(Additive HE)比 乘法同态加密算法要多一些。PHE的优点是原理简单、易实现,缺点是仅支持一种运算(加法或乘法)。
  2. **层次同态加密算法(LHE,Leveled HE 或 SWHE ,SomeWhat HE)一般支持有限次数的加法和乘法运算。**层次同态加密的研究主要分为两个阶段,第一个阶段是在2009年Gentry提出第一个FHE框架以前,比较著名的例子有:BGN算法、姚氏混淆电路等;第二个阶段在Gentry FHE框架之后,主要针对FHE效率低的问题。LHE的优点是同时支持加法和乘法,并且因为出现时间比PHE晚,所以技术更加成熟、一般效率比FHE要高很多、和PHE效率接近或高于PHE,缺点是支持的计算次数有限。
  3. 全同态加密算法(Fully HE,简称FHE)支持在密文上进行无限次数的、任意类型的计算。从使用的技术上分,FHE有以下类别:基于理想格的FHE方案、基于LWE/RLWE的FHE方案等等。FHE的优点是支持的算子多并且运算次数没有限制,缺点是效率很低,目前还无法支撑大规模的计算。

同态加密在联邦学习中的运用

在联邦学习中,各个参与方分享梯度到服务服务器上以聚合全局模型,但是已有研究证明通过几个梯度信息就可以推断出原数据信息,所以如果直接发送明文的结果可能会有隐私泄露风险。隐私风险可能来自于中间人攻击,又或者参与方认为服务器方都是不可信的。在这种场景下,同态加密就可以发挥很重要的作用。

多方直接将梯度信息采用同态加密算法进行加密,然后交给服务器进行聚合运算,此时因为数据是被加密的,服务器也只能进行聚合运算,但是不能获取到任何梯度信息,避免了隐私泄露。

这种情况下,联邦学习中的有三类参与者,一类是加入训练的参与者,一类是server,在一类是CA机构。由CA机构生成同态加密的密钥对交给参与者对梯度进行加密,然后加密梯度交给server,server计算完成之后交给CA机构进行解密,然后再由CA将聚合后的结果分发给参与者。

Paiilier库

Paiilier是一种同态加密算法,满足加法同态。其支持的运算如下:

  1. [[x1]]pk∗[[x2]]pk=[[x1+x2]]pk[[x_1]]_{pk}*[[x_2]]_{pk} = [[x_1 + x_2]]_{pk}[[x1​]]pk​∗[[x2​]]pk​=[[x1​+x2​]]pk​,由这个可以看出,即使是加密之后的密文,也支持加法运算,这也就是Paiilier是加法同态的原因
  2. [[x1]]pkr=[[r∗x1]]pk[[x_1]]^r_{pk} = [[r*x_1]]_{pk}[[x1​]]pkr​=[[r∗x1​]]pk​,其中rrr是任意常数。由次可以看出,虽然Paiilier不支持密文之间的乘法,但是支持密文与常量之间的乘法。
  3. [[x1]]pk+r=[[x1+r]]pk[[x_1]]_{pk}+r = [[x_1+r]]_{pk}[[x1​]]pk​+r=[[x1​+r]]pk​,由此可以看出Paiilier不仅支持密文与常量的乘法,还支持密文与常量的加减法。

总结起来就是,Paiilier支持密文之间的加减法,支持密文与明文之间的乘除法。

Paiilier库实现了半同态加密Paiilier算法,可以简单实现同态加密。

项目官方地址:https://github.com/data61/python-paillier

安装

去PyPI单独看一下phe的安装说明:phe(插一句,PyPI真的是个非常好用的和python相关的各种包的安装集合地)

直接进行安装:

pip install phe

在安装phe之前它推荐安装gmpy2,虽然不是必须的,但gmpy2做大数计算和精确计算以及提高计算效率都很有帮助。

同样到pypi中查看安装帮助:https://pypi.org/project/gmpy2/#files

我们也可以直接安装:

pip install gmpy2

测试

from phe import paillier
import gmpy2 as gypublic_key, private_key = paillier.generate_paillier_keypair()def test_mul(encrypt_x, encrypt_y, origin_x, origin_y):# [[x]]*[[y]] = [[x+y]]encrypt_res = paillier.EncryptedNumber(public_key, encrypt_x.ciphertext() * encrypt_y.ciphertext())res = origin_x + origin_yassert res == private_key.decrypt(encrypt_res)def test_exponent(encrypt_x, x, r):# [[x]]^r = [[x*r]]encrypt_res = paillier.EncryptedNumber(public_key, encrypt_x.ciphertext() ** r)res = x * rassert res == private_key.decrypt(encrypt_res)secret_number_list = [3, 4, 5]
encrypted_number_list = [public_key.encrypt(x) for x in secret_number_list]test_mul(encrypted_number_list[0], encrypted_number_list[1], secret_number_list[0], secret_number_list[1])
test_exponent(encrypted_number_list[0], secret_number_list[0], 3)encrypt_res = encrypted_number_list[0] + encrypted_number_list[1]
assert 7 == private_key.decrypt(encrypt_res)encrypt_res = encrypted_number_list[0] + 4
assert 7 == private_key.decrypt(encrypt_res)

再通过计算测试一下同态性,可以发现phe中的paillier支持同态相加以及密文与明文的加法和乘法计算,同时也验证了paillier的性质不支持乘法同态:

安全多方计算

安全多方计算可形式化描述为,n个计算参与方分别持有数据x1,x2,…,xn,协议的目的是各方利用自己和的它方的秘密数据计算一个预先达成的共识函数y1,y2,…yn=f(x1,x2,…,xn),此时任意一方可以得到对应的自己想要的结果yi,但无法获得其他任何信息,无法得到其他人的密码信息。如下图:

在传统分布式计算模型下,传统的分布式计算由中心节点协调各用户的计算进程,收集各参与方的明文输入信息,各参与方的原始数据对第三方来说毫无秘密可言,很容易造成数据泄露。在MPC计算模式下,不需要可信第三方收集所有参与节点的原始明文数据,只需要各参与节点之间相互交换数据即可,而且交换的是处理后(如同态加密、秘密共享等处理方法)的数据,保证其他参与节点拿到数据后,也无法反推原始明文数据,确保了各参与方数据的私密性。

多方安全计算的特点:

  1. 两方或者多方参与基于他们各自隐私或秘密数据输入的计算。

  2. 参与一方都不愿意让其他任何第三方知道自己的输入信息。

MPC方案主要可分为基于混淆电路(Garbled Circuit,GC)和基于秘密共享两种。
根据参与方的个数,可分为两方安全计算(two party computation,简称2PC)和多方安全计算(multiparty computation)

秘密共享

传统的对称加密就可以视为一种密码共享,例如:C=Enckey(M)C = Enc_{key}(M)C=Enckey​(M)。其中的M是明文,C是密文,key是密钥。也就是说,明文被分解成了密文和密钥,分发给多方就实现了秘密共享。

谈及秘密分享时,一般取的是它狭义的定义,即数据的裂片被一组参与方分别拥有。这些参与方一般是对等的角色,且其中的分享或者说分裂和还原均不涉及加解密。秘密分享的优势正在于此,数据的分裂和还原运算一般来说成本极低,如加性秘密分享(Additive Secret Sharing),分裂和还原只是加减法,除此之外,就是对分裂点的选择需要做一次随机数生成,这些运算成本远低于一般的加解密运算。

如果仅限于分裂和还原,秘密分享就没有什么价值,它的真正价值在于处于分裂态可以运算,而运算的结果在多方参与的情况下可以还原。这正是隐私计算中所追求的可用而不可见的性质,因此秘密分享成为隐私计算中最重要的框架之一的多方安全计算的基石。

算数秘密共享

算术秘密分享( Arithmetic Secret Sharing ) 是一种低成本的秘密分享,它的主要思想是将一个数xxx随机的分裂为两个或多个数,如加性秘密分享中,分裂为x1x_1x1​和x2x_2x2​ ,使得x=x1+x2x = x_1+x_2x=x1​+x2​,分裂后的数分属不同的计算方,谓之分享,各计算方即可根据这些分享的数据展开隐私保护下的算术计算。

Additive Secret Sharing 加法秘密共享

假设现在有两个参与方A和B,他们各自有数据xax_axa​和xbx_bxb​,现在C想知道两数的和,但是A和B不想告诉Cxax_axa​和xbx_bxb​的值。那么双方利用算术秘密共享可以有:A:xa=xa1+xa2x_a = x_{a1}+x_{a2}xa​=xa1​+xa2​,B:xb=xb1+xb2x_b = x_{b1}+x_{b2}xb​=xb1​+xb2​。
A此时将xa1x_{a1}xa1​发送给Server1,将xa2x_{a2}xa2​发送给Server2,B同理。

这时候C想知道和,C向各个Server请求和计算算子,Server1计算z1=xa1+xb1z_1 = x_{a1} + x_{b1}z1​=xa1​+xb1​,Server2计算z2=xa2+xb2z_2 = x_{a2} + x_{b2}z2​=xa2​+xb2​,最终C计算z1+z2z_1+z_2z1​+z2​既得到两个数的和。
从而完成了加法运算。双方都没有泄露自己的数字。但是前提是,Server之间没有进行共谋攻击,如果两个Server联手,秘密就泄露了。

布尔秘密分享(GMW)

布尔共享与算数秘密共享类似,只是替换了运算。

XOR秘密共享

假设一个秘密值为sss,此时要将s分解成n份,那么就选择n-1个同bit长度的随机数。r1,r2,…,rn−1r_1,r_2,\dots,r_{n-1}r1​,r2​,…,rn−1​,计算:
rn=s⊕r1⊕r2⊕⋯⊕rn−1r_n = s \oplus r_1 \oplus r_2 \oplus \dots \oplus r_{n-1} rn​=s⊕r1​⊕r2​⊕⋯⊕rn−1​
最终s就被拆分成了r1,r2,…,rnr_1,r_2,\dots,r_{n}r1​,r2​,…,rn​,既秘密的分享。恢复秘密只需要计算:
s=r1⊕r2⊕⋯⊕rns= r_1 \oplus r_2 \oplus \dots \oplus r_{n} s=r1​⊕r2​⊕⋯⊕rn​

举例

我们假设现在有秘密值s=10s = 10s=10,需要拆分成两份,既n=2。然后我们选择一个随机数15。
计算得到r1=15,r2=5r_1 = 15, r_2 = 5r1​=15,r2​=5。然后将r1,r2r_1,r_2r1​,r2​分享给P1,P2P_1, P_2P1​,P2​。
P1P_1P1​做运算:r1⊕3=12r_1 \oplus 3 = 12r1​⊕3=12,P2P_2P2​做运算:r2⊕4=1r_2 \oplus 4 = 1r2​⊕4=1。然后P1P_1P1​和P2P_2P2​将运算结果还给我们。我们再进行解密:s=12⊕1=13s = 12 \oplus 1 = 13s=12⊕1=13,就等价于s⊕3⊕4=13s \oplus 3 \oplus 4 = 13s⊕3⊕4=13。
这样P1P_1P1​和P2P_2P2​既进行了运算,但是又不能得到秘密值。

xor秘密共享共享出去的秘密仅支持xor运算,既对xor是同态的。

Shamir秘密共享

Beaver Triples 三元组

Beaver三元组:主要用于安全多方计算协议中的乘法计算。应用范围为加法和乘法均为线性的秘密分享机制。
我们用用[∗][∗][∗]表示秘密被分享之后的状态,如[

2022-7月-日报相关推荐

  1. CVPR 2022 3月7日论文速递(17 篇打包下载)涵盖 3D 目标检测、医学影像、图像去模糊、车道线检测等方向

    CVPR2022论文速递系列: CVPR 2022 3月3日论文速递(22 篇打包下载)涵盖网络架构设计.姿态估计.三维视觉.动作检测.语义分割等方向 CVPR 2022 3月4日论文速递(29 篇打 ...

  2. 【LeetCode】2022 7月 每日一题

    [LeetCode]2022 7月 每日一题 前言 七月太忙了,又是项目又是练车又是各种比赛.大概有10天的每日一题没有当天写完(虽然后面补上了). 将每日一题的所有思路记录在这里分享一下. 7.1 ...

  3. 2022 12月——2023 2月 寒假假期总结

    在寒假期间,本人有效的贯彻落实了<科研小分队寒假计划>.做到了以数据结构学习为主体,充分利用考试题.算法题.力扣题一体化的学习优势,圆满完成了本人所学习的数据结构等目的.完成了科研小分队寒 ...

  4. 2022.08月--pushmall推贴共享电商更新与开发计划

    pushmall推贴共享电商2022年08月–更新与开发计划 已完成: 1.商家员工管理及商家分润管理: 2.商家升级为盟主,创建商圈, 3.盟主对商圈内商家分润维护管理 4.商家发布共享商品:盟主可 ...

  5. 北上广深等多市同步招募!外企德科开启2022“一个月的CEO”项目

    上海2022年3月11日 /美通社/ -- 3月10日,外企德科(FESCO Adecco)宣布在中国大陆开启CEO for One Month 2022项目招募.该项目将在上海.北京.广州.深圳.重 ...

  6. 海康前端实习日记-2022.12月

    背景:框架是vue2,刚开始安排了一些缺陷单让你解决,后面就会分一些需求让你开发了.我是第一天装环境,第二天就开始解决缺陷了,第三周就开始开发需求啦 目录 2022.12.6 2022.12.7 20 ...

  7. 【叨叨与总结】2022.7月结

    一.七月总结   本月总共未记录时间32.5个小时有印象未记录了大概是16-17个小时的时间,如果在加上一两个小时的边角时间,按照19个小时算,还有13.5个小时不知道是干嘛的,需要注意一下.   本 ...

  8. 2022 6 月25 日交易总结

    玩金融衍生品前几个月爆仓了10次以上(不重仓) 金融衍生品其实更容易提高自己的能力,一夜暴富不可能 不断反思,也感谢成文杰大佬的指点,最近一个月没有爆仓,稳定盈利还有待时间验证 最初太追求胜率了,胜率 ...

  9. Task06|连接|joyfulpandas|组队学习 2022.8月组队学习

    目录 一.关系型连接 1. 连接的基本概念 2. 值连接 merge函数 [练一练] 3. 索引连接 二.方向连接 1. concat TIPS: 2. Series序列与DataFrame表的合并 ...

  10. 2022.8月更新在线客服系统源码外贸聊天通讯带翻译多语言接待支持网页APP

    8月4号更新日志:更新谷歌翻译接口,更新发送语音功能,更新地图发送功能,优化前端接待页面UI. 8月22号更新日志:主要代码重整,防止被反Z中心错误判断DNS污染拦截. 原文章地址:http://pe ...

最新文章

  1. java基础入门课后习题_《Java基础入门》课后习题及答案
  2. eclipse 快捷键汇总
  3. 用Python一次性把论文作图与数据处理全部搞定!
  4. 鼠标点击层以外的地方层隐藏
  5. 被Redis击穿的一次面试经历
  6. c语言通讯录程序设计个人感言,人生经验 C语言程序设计的感悟
  7. KNN聚类的原理和实现
  8. 机器学习十大算法!入门看这个就够了~
  9. 现代大学英语精读第二版(第一册)学习笔记(原文及全文翻译)——16A - Who Shall Dwell?(生的机会留给谁?)
  10. 华为服务器设置raid0为系统盘,服务器设置raid0
  11. YARN-client提交任务处理过程
  12. 搜狐邮箱无法被Foxmail、网易邮箱大师代收的问题的解决方法
  13. Linux 不重启添加SCSI硬盘方法
  14. 数美科技斩获36氪“WISE 2020数据智能最佳解决方案”
  15. IntentFilter
  16. 解决mvn打包报There are test failures.的问题
  17. 基于安全芯片NRSEC3000的输电设备状态监测系统介绍
  18. mybatis运行原理(面试回答)
  19. dwr根据输入中文得到拼音和简拼
  20. FreeSWITCH动态更改网关中的sip_from_user

热门文章

  1. PMP通过率暴跌,是否跟新大纲有关?
  2. luogu 1594 护卫队(线性dp)
  3. Onunload与Onbeforeunload的应用与区别
  4. 国产降噪耳机排行:华为和南卡降噪蓝牙耳机有何差别?
  5. 计算机英语电子词典,电子辞典时代的英语学习陷阱
  6. 2023黑龙江大学计算机考研信息汇总
  7. 新标准 USB4 2.0 有多快?
  8. 日历签到 java_Java实现按年月打印日历功能【基于Calendar】
  9. three.js,透明模型能够遮挡可见模型
  10. 千万级并发架构下如何提高数据库存储性能