GITHUB代码:HElib链接
讲解可以参考良心博主:虚拟机Ubuntu安装NTL
Ubuntu安装、编译并运行HElib
第一步:安装带有GMP的NTL库
可以参考:https://blog.youkuaiyun.com/weixin_43774577/article/details/103271672
我是这样解决的:6.2.0/6.1.2不匹配),所以选择安装了gmp6.1.2
一、 HElib
• C++
• Implements the BGV-‐type encryption scheme
• Supports such as: reLinearazatioon, bootstapping, packing
• Supports multithread from this March
BGV 方案一个leveled FHE(leveled FHE without bootstrapping)
1.什么是levels??
就是密文空间模数q
2 为什么需要level??
——Bootstrapping is too too heavy
——模切换减少密文中的噪声
3.什么时候改变 level
——大部分是在密文乘法操作后(加法产生的噪声一般忽略)
二、 Leveled FHE 参数
模切换过程
如何确定levels呢??
主要是依赖于 evaluation function
正如上图所见::密文乘法会导致 size 增大,维数升高,因此引入了新的技术 :重线性化 relinearzation
三、 ReLinearization (Key switching)
简单来看就是降低密文维数,同时保证解密仍然正确
为什么想要reLinearize??
——减少密文乘法的计算负担
怎么做??
需要 添加一些 额外信息到公钥中
是否需要总是reLinearize
——取决于乘法的深度
四、Packing 打包技术
什么是打包??
将多个消息 打包成 一个 密文
为什么要packing??
1.减少密文的数量
2.分摊计算时间
打包技巧
1.打包成系数
2.打包成子域(所谓的 CRT-based packing)
重点介绍打包技巧
. 一、打包成系数
Example Message Space: p=13,m=6,r=2
想象有 8 个盒子,每一个都可以放一个小于13^2 的整数
由于我们加密的明文空间是 多项式,所以我们需要设计如何将我们的数据编码成 一个有用的多项式形式
举例说明:
给定向量 v=[1,2,3] , u=[4,5,6]
(1)我们把多项式表示为
但是
因此,我们去U(x)的"逆形式":
这其中的原理解释可以参考:原理详解
二、打包成子域(pack into field)
1.并不是直接加密每一个系数
2.向量作为整体被加密,使用中国剩余定理
需要一个 辅助类:EncryptedArray
一个数可以分解为 素数因子的乘积
CRT的同构:
元素之间的对应关系:
多项式 CRT
首先介绍分圆多项式:
分圆多项式可以分解为两两互素不可约的多项式
Example: Component-‐wise Operations
每一个slot hold 零阶多项式 mod 17
下面介绍一个操作 “ Rotation”
做一个自同构: