1、概念:同态加密是基于数学难题的计算复杂性理论的密码学技术。对经过同态加密的数据进行处理得到一个输出,将这一输出进行解密,其结果与用同一方法处理未加密的原始数据得到的输出结果是一样的。
2、同态加密过程:
以云计算应用场景为例,Alice通过Cloud,以同态加密处理数据的整个处理过程大致是这样的:

Alice对数据进行加密。并把加密后的数据发送给Cloud;
Alice向Cloud提交数据的处理方法,这里用函数f来表示;
Cloud在函数f下对数据进行处理,并且将处理后的结果发送给Alice;
Alice对数据进行解密,得到结果。

根据同态加密的算法,可以分为RSA(乘法)、Paillier(加法)等。
3、Paillier同态加密算法:
密钥生成
总共有如下几个步骤:
1、 随机选择两个质数 p 和 q 满足 |p|=|q|=τ|p|=|q|=τ,这个条件保证了 p 和 q 的长度相等。
2、 计算 N=pqN=pq 和 λ=lcm(p−1,q−1)λ=lcm(p−1,q−1),注:lcm 表示最小公倍数。
3、随机选择 g∈Z∗N2g∈ZN2∗,满足 gcd(L(gλmodN2),N)=1gcd(L(gλmodN2),N)=1,注:gcd 表示最大公约数;Z 表示整数,下标表示该整数集合里有多少个元素;L(x)=x−1NL(x)=x−1N
4、 公钥为 (N,g)(N,g)
5、 私钥为 λλ
加密
对于任意整数 m∈ZNm∈ZN,任意选择随机数r∈Z∗Nr∈ZN∗,密文C=E(m)=gmrNmodN2C=E(m)=gmrNmodN2
解密
对于密文 C∈Z∗N2C∈ZN2∗,解密得到明文 m 的计算如下:
m=L(CλmodN2)L(gλmodN2)modNm=L(CλmodN2)L(gλmodN2)modN
加法同态
对于任意明文 m1,m2∈ZNm1,m2∈ZN,假设 E(m1)=gm1rN1modN2E(m1)=gm1r1NmodN2 和 E(m2)=gm2rN2modN2E(m2)=gm2r2NmodN2,有
E(m1)E(m2)=gm1+m2(r1r2)NmodN2=E(m1+m2modN)E(m1)E(m2)=gm1+m2(r1r2)NmodN2=E(m1+m2modN)
这个性质表明 Paillier 加密方案具有加法同态性。
4、Paillier同态加密算法的python实现

from phe import paillier  # 开源库
import time  # 做性能测试
# 测试paillier参数
print("默认私钥大小:", paillier.DEFAULT_KEYSIZE)  # 2048
# 生成公私钥
public_key, private_key = paillier.generate_paillier_keypair()
# 测试需要加密的数据
message_list = [12, 100]
# 加密操作
time_start_enc = time.time()
encrypted_message_list = [public_key.encrypt(m) for m in message_list]
time_end_enc = time.time()
print("加密耗时ms:", time_end_enc - time_start_enc)
# 解密操作
time_start_dec = time.time()
decrypted_message_list = [private_key.decrypt(c) for c in encrypted_message_list]
time_end_dec = time.time()
print("解密耗时ms:", time_end_dec - time_start_dec)
print("原始数据:", decrypted_message_list)a1, b1 = message_list  # a1,b1分别为对应原始数据
# 测试加法和乘法同态
a2, b2 = encrypted_message_list  # a2,b2分别为对应密文print("a1 a2 = ", a1, a2)
print("b1 b2 = ", b1, b2)
# 密文加明文
print("a1+5=", a1 + 5, ",dec(a2+5)=", private_key.decrypt(a2 + 5))
# 密文加密文
print("a1+b1=", a1 + b1, ",dec(a2+b2)=", private_key.decrypt(a2 + b2))
# 密文乘明文
print("a1*2 = ", a1 * 2, ",dec(a2*2) = ", private_key.decrypt(a2 * 2))
# 密文乘密文(不支持)
print("a1*b1 = ", a1 * b1, ",dec(a2*b2) = ", private_key.decrypt(a2 * b2))

输出结果:
4、RSA同态加密算法:
密钥生成
1、 随机找两个质数 P 和 Q,越大越安全,并计算乘积 n=P∗Qn=P∗Q。P 和 Q 的乘积的二进制位数代表 RSA 加密的位数,一般来说都要有 1024 或 2048 位。

2、 计算 n 的欧拉函数 ϕ(n)ϕ(n),表示在小于等于 n 的正整数中,与 n 构成互质关系的数的个数。比如 1~8 中,和 8 互质的有 1,3,5,7,所以 ϕ(8)=4ϕ(8)=4,如果 p 和 q 为质数,那么他们的乘积的欧拉函数有一个特殊的性质,公式为 ϕ(n)=ϕ(P∗Q)=ϕ(P−1)ϕ(Q−1)=(P−1)(Q−1)ϕ(n)=ϕ(P∗Q)=ϕ(P−1)ϕ(Q−1)=(P−1)(Q−1)。

3、选取 e,要大于 1 小于 ϕ(n)ϕ(n),并且 e 与 ϕ(n)ϕ(n) 要互质。

4、计算出一个整数 d,使得 (ed−1) % ϕ(n)=0(ed−1) % ϕ(n)=0,即 e∗de∗d 除以 ϕ(n)ϕ(n) 的余数为 1,实际上转化为找到二元一次方程 ed+kϕ(n)=1ed+kϕ(n)=1 的一组解(求 d 和 k),具体使用的是扩展欧几里得算法。

于是我们可以得到:

公钥 (n, e)
私钥 (n, d)

在这样的条件下,如果想要根据 n 和 e 算出 d,就只能暴力破解,位数越长,玻璃破解时间越长。
加密
我们现在有个这么几个关键的数值:n, e, d。要使用公钥 (n, e) 加密,首先要求被加密的数字必须是整数且小于 n(如果是字符串,可以逐个取 ascii 码或 unicode 值,并且中间用非数字和字母分割即可)。假设我们需要加密的数字是 A,则加密之后的 B 为(为了区别使用大写):

Ae % n=BAe % n=B

如果没有 d,那么是很难从 B 中恢复 A 的。
解密

如果我们拥有私钥 (n, d),那么对于 B,就可以通过下面的公式计算出 A:

Bd % n=ABd % n=A

乘法同态相对 Paillier 来说还要更加简单一些,我们只要把两个加密后的数字相乘即可,代码片段如下:

print('接下来加密计算 2 x 20')
print('加密 2')
enc1 = rsa.core.encrypt_int(2, public_key.e, public_key.n)
print(enc1)
print('加密 20') # 40471062776583530669631608186743860028386032505372124150562694293213549812024
enc2 = rsa.core.encrypt_int(20, public_key.e, public_key.n)
print(enc2) # 16915103439566807805446086181091224947678993169521653470724152014464992293178
print('相乘')
result = enc1 * enc2
print(result) # 684572213175112282577113686759405066981454950839007710126450052851088805616753069318980764721622690261112227625923822693220128510206043466290770597572272
print('解密结果')
decrypt_result = rsa.core.decrypt_int(result, private_key.d, public_key.n)
print(decrypt_result) # 40

本篇博客参考:https://blog.csdn.net/watson2017/article/details/121630306

SDU项目实训——同态加密技术学习相关推荐

  1. 软件测试技术与项目实训pdf,软件测试技术任务驱动式教程pdf

    软件测试技术任务驱动式教程 内容简介 <软件测试技术任务驱动式教程>分四个篇章介绍了软件测试的基本知识.方法.工具及流程.软件测试的基本理论阐述了软件测试的概念.模型和分类,软件质量管理与 ...

  2. SDU项目实训——后台搭建——SpringBoot+Vue学习(一)

    项目初期,要先搭建起一个框架,采用迭代增量的方法不断完善功能,我负责搭建一个后台管理系统,我的选择是vue和springboot.本篇博客我将记录我学习vue的过程. 1.什么是vue? vue是一个 ...

  3. AutoRunner 功能自动化测试项目实训之自动化测试技术(十七)

    十七.自动化化测试技术 通过计算机运行测试工具和测试脚本自动进行测试具有如下优点,缩短测试周期.多次重复运行相同的测试减少测试的单调性等,所以在测试工作中,应尽力实现测试自动化或扩大自动化测试的覆盖范 ...

  4. 【SDU项目实训2019级】前端和后端实现手机短信验证码登录和注册功能

    目录 1.前端登录页面手机号验证码登录页面: 2.前端获取验证码的函数: 3.后端获取验证码代码 4.前端登录的函数: 5.后端登录的实现 6.注册功能前后端的实现 1.前端登录页面手机号验证码登录页 ...

  5. c4d完全学习手册_动态视觉设计就业班,全商业项目实训,一线制作团队10人小班授课,持续提升学习...

    CUBE专注动态视觉设计培训.CUBE依托本身设计公司制作资源优势,将培训制作完美结合,开设有北京实体培训课程以及网络案例实战课程. CUBE课程与工作要求完美对接,16周高强度集训,零基础学员毕业后 ...

  6. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二)-docker安装与学习

    目录 前言: 一.docker安装 1.centos7使用yum安装 二.命令行创建 docker 容器测试 前言: 项目实训立项通过后的几天均在学习 docker 的相关知识,上一篇文章也简单记述了 ...

  7. 【SDU青山】项目实训记录(1)

    目录 前言 环境搭建 切面编程 拦截器 WAR包部署 RestFul 前言 在本次项目实训中我负责后端的开发,后端主要使用springboot和mybatis,数据库使用mysql. 由于我之前并未对 ...

  8. 视频教程-C++微服务架构及安全云盘项目实训-C/C++

    C++微服务架构及安全云盘项目实训 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真,计算机视觉,嵌入式图像处理,云安全审 ...

  9. 视频教程-JSP从入门到精通2016+在线视频教学平台项目实训-其他

    JSP从入门到精通2016+在线视频教学平台项目实训 19年软件开发经验,设计开发40多个大型软件,10年从事高等教育,主要为java系列课程,带你轻松进入java生涯. 赖国荣 ¥68.00 立即订 ...

最新文章

  1. ROS系统——动态修改realsense相机参数方法
  2. 超详细教你10分钟搭建一个高端的B2B2C模式的综合性商城|含来客推V3源码下载
  3. 自主研发:3通道1GS/s FPGA+DSP板
  4. 怎么用python处理excel文件-Python自动化如何处理excel文件数据
  5. Java-Frame
  6. 计算机文化基础教程问什么好难买到,问一个翻译的问题新编计算机文化基础(教程 – 手机爱问...
  7. sqL编程篇(三) 游标与存储过程
  8. linux 安装 maven 、解决:bash: mvn: command not found
  9. 洛谷P4092树——并查集
  10. 【linux系统编程】基础开发工具:vi/vim
  11. 手把手教你搭建Jenkins+Jmeter+Ant自动化集成环境
  12. Zabbix 对接 LDAP 实现用户统一登录的方法
  13. SpringMVC框架使用注解执行定时任务(转)
  14. 实现一次加载多级所有的菜单
  15. 软件实习周软件设计报告
  16. TF-tf.keras.layers.Conv1D
  17. Primavera P6 数据字典分享
  18. sqlplus命令大全
  19. am3352 项目记录
  20. 看完书就忘,怎么办?告诉你六种方法(转载)

热门文章

  1. 使用MV制作最简单的游戏:我要做游戏(9)
  2. css应用重定义标签设置背景、导航条及rgba
  3. 从穆迪上调评级,看联想集团高质量战略转型
  4. 磁力大会,快手“品销合一”铸造直播+营销商业双引擎
  5. p 分位法实现图像二值化 matlab
  6. mac DBPC 和 Druid jar 包下载
  7. 3D技术技巧疑难解答丨新手必入,提问你就来
  8. SAS进行主成分分析(Principal Component Analysis,PCA)
  9. 485转以太网 串口服务器 跨Internet通讯-P2P技术
  10. 苹果cms播放器添加教程