DGHV

DGHV全同态方案的实现

这是具有压缩公钥的DGHV的全同态加密方案的实现,参考文章:

[1] J.S. Coron, D. Naccache and M. Tibouchi, "Public-key Compression and Modulus Switching for Fully Homomorphic Encryption over the Integers", Proceedings of Eurocrypt 2012.available at http://eprint.iacr.org/2011/440

实现依靠数学库Sage,具体参考:数学库Sage安装和使用

什么是DGHV方案?

最初在下面的文章中给出:

[2] M. van Dijk, C. Gentry, S. Halevi and V. Vaikuntanathan, "FullyHomomorphic Encryption over the Integers". Proceedings of Eurocrypt 2010.and available at http://eprint.iacr.org/2009/616

加密:c= q*p + 2*r + m

这里p是密钥,m是比特明文(0或1),q是一个大随机数,r是一个小随机数

解密:m=(c mod p) mod 2,容易看出,若噪音2*r < p,则可以解密成功

例如:

给定两个密文:

c1= q1*p + 2*r1 + m1
c2= q2*p + 2*r2 + m2

加法:c1+c2=(q1+q2)*p+2*(r1+r2)+m1+m2

可以得到:m1+m2=( c1+c2)mod p mod 2

乘法:c1*c2=q12*p+2*(2*r1*r2+r1*m2+r2*m1)+m1*m2

也可以得到:m1*m2=( c1*c2)mod p mod 2

这里,密文的噪音比原始密文c1和c2扩大了两倍,由于噪声必须低于p,

因此在密文上进行的乘法次数是有限的,所以方案叫做 Somewhat FHE

为了获得“纯”的FHE,即密文的无限次加法和乘法,必须减少密文中的噪音量,叫做密文刷新。

Gentry的密文刷新的关键思想,是使用密钥位的加密对密文位上的解密电路进行同态计算,这叫做Bootstrapping技术,然而我们得到的不是明文位,而是明文位的加密,即相同明文的新密文,现在若解密电路有足够小的深度,那么新密文中的噪音量实际上小于原始明文中的噪音量,因此叫做密文刷新。

然而,之前的解密算法m=(c mod p) mod 2的深度并不小,因此解密过程必须被“压缩”,以便可以将其表示为低深度电路,在[2]中解释了是如何完成的。

到目前为止,我们只描述了一个私钥加密方案,即加密者必须知道私钥p,然而很容易获得公钥加密方案。为此生成一组公开密文xi,它们都是0的不同的加密,xi=qi*p+2*ri,然后加密1bit的m,c=m+2*r+random_subset_sum(xi),

c确实是m的加密。

在该库中,我们实现了DGHV的同态加密,即实现了密钥生成,加解密,同态加,同态乘和密文刷新

什么是压缩公钥?

在DGHV算法中我,密文大小必须是很大的,以防止格基约减算法,密文大小至少为10^7 bits,密钥p相对较小,大概为2000bit,大约10^4的密文必须包含在公钥中,所以我们给出公钥的的大小为10^11 bits,即12.5GB

为了减少公钥的大小,我们实现了[1]的技术,而不是生成 xi=qi*p+2*ri ,第一生成相同尺寸的伪随机数X,计算di,使得 xi=Xi-di是小的,模p,那么只有这些小的正确的值被存储在公钥中,(带有PRNG的种子),使用

这种压缩技术,可以减少公钥大小变为 10^4*(2*10^3)=2*10^7 bits,即2.5MB,这是可以接受的。

下载

源码地址

git clone 地址

安装

1、安装sage库

具体参考:数学库Sage安装和使用

2、运行sage

./sage

load("dghv.sage")

testPkRecrypt()函数里面有密钥生成,密文加法、密文乘法和密文刷新

问题:

各种报错,欢迎交流!

参考

1、dghv code运行笔记

DGHV同态库的更多相关文章

  1. HEAAN库学习

    本文主要学习HEAAN同态库,选择最老的一版:地址,最新版在:位置,HEAAN是CKKS17论文的主要代码复现. 版本 1.地址这是最老的一版,对应的论文CKKS17 2.在1的基础上,实现了boot ...

  2. SEAL库 - 安装和介绍

    本篇文章介绍:SEAL同态库的安装和简单使用 注:使用Clang++编译的Microsoft Seal比使用GNUG++编译的Microsoft Seal具有更好的运行时性能. 1. cmake:适应 ...

  3. Homomorphic Evaluation of the AES Circuit:解读

    之前看过一次,根本看不懂,现在隔这么久,再次阅读,希望有所收获! 论文版本:Homomorphic Evaluation of the AES Circuit(Updated Implementati ...

  4. 同态加密-Homomorphic encryption

    同态加密(Homomorphic encryption)是一种加密形式,它允许人们对密文进行特定的代数运算得到仍然是加密的结果,将其解密所得到的结果与对明文进行同样的运算结果一样.换言之,这项技术令人 ...

  5. Paillier同态加密的介绍以及c++实现

    我们先来简短认识一下Paillier同态加密算法: 如果就这么按照定义来用最简朴的c++程序写 就像这样: #include <iostream> #include <math.h& ...

  6. MAC上安装HEAAN库

    介绍 HEAN是一个软件库,它实现支持定点运算的同态加密(HE),此库支持有理数之间的近似运算.近似误差取决于某些参数,与浮点运算误差几乎相同.该库中的方案发表在"近似数算术的同态加密&qu ...

  7. Tenseal库

    在此记录Tenseal的学习笔记 介绍 在张量上进行同态计算的库,是对Seal的python版实现,给开发者提供简单的python接口,无需深究底层密码实现. 当前最新版本:3.11 位置:A lib ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)

    使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中 ...

随机推荐

  1. 【C/C++】【输入】关于scanf:输入空格,多次使用

    一.C/C++中带空格字符串的输入 C++中的cin和C中的scanf都是遇到空格或回车结束. 如果要让scanf接收空格,可以用读入字符集合的方式.%[] char a[100]; scanf(&q ...

  2. docker容器使用loki收集日志

    docker-compose安装loki套件(loki+promtail+grafana) loki进行日志聚合处理  类似elk中的es promtail是日志收集,类似elk中的logstash ...

  3. pwnable_start & ciscn_2019_es_2 & ez_pz_hackover_2016 & pwn2_sctf_2016

    花了两天时间做了这四道题,感觉收获很多.但是这种收获感觉写文章写不出自己的思路,就录制了一个视频. pwnable_start 这道题考察了系统调用,shellcode的编写,和动态调试的知识. ci ...

  4. 可视报表(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 原来一直有一个执念,做项目的人电脑上一定要安装Project软件,今天突然知道了,原来领导的电脑上,可以不装,因为,Pro ...

  5. There is a cycle in the hierarchy! role对象此时是什么错误

    There is a cycle in the hierarchy! role对象此时是什么错误

  6. svn服务器用户名密码更改后,如何更新本地用户名密码

    在提交时,IDE会给出这样的提示,说明用户名密码已更改 在命令行输入 svn ls https:XXX(项目的地址),具体步骤如下图

  7. 【LeetCode】235. Lowest Common Ancestor of a Binary Search Tree 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 [LeetCode] https://leet ...

  8. 【LeetCode】50. Pow(x, n) 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述: 题目大意 解题方法 递归 迭代 日期 题目地址: https://le ...

  9. 【剑指Offer】树的子结构 解题报告(Python)

    [剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  10. Test for Job(poj3249)

    Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10209   Accepted: 2372 Des ...