一、前置知识
同态加密以及全同态在另一篇文章中已经说的非常详细了:
同态加密与全同态加密的原理公式表示如下:
f ( m 1 , m 2 , m 3 , . . . ) = D ( f ( E ( m 1 ) , E ( m 2 ) , E ( m 3 ) , . . . ) ) f(m_1,m_2,m_3, ...) = D(f(E(m_1),E(m_2), E(m_3), ...)) f(m1,m2,m3,...)=D(f(E(m1),E(m2),E(m3),...))
若 $f(m_1,m_2,m_3, …) $存在有效的加法运算或乘法运算,称该加密算法支持半同态加密;若存在有效的加法运算和乘法运算,称该加密算法支持全同态加密
二、DGHV算法构建
思路:通过对称加密改进出一种非对称/公钥加密算法
对称加密方法
定义一套对称加密方法:
k e y G e n ( λ ) keyGen(\lambda) keyGen(λ)根据安全参数 λ \lambda λ生成一个大奇数 p p p密钥, η ( b i t ) \eta \ (bit) η (bit)是生成密钥 p p p的位数
E n c r y p t o ( p k , m ) Encrypto(pk, m) Encrypto(pk,m)表示加密,其中 p k pk pk表示公钥, m是明文,根据Dijk中的规定 m ∈ { 0 , 1 } m \in \{0,1\} m∈{ 0,1}也即明文m只有一位;
r , q r, q r,q都是正随机数, 长度分别为 ρ 、 γ \rho、 \gamma ρ、γ , 其中的要求是 q > p q>p q>p 且 q q q是公开的 , r r r是一个随机小整数(可为负数)
则加密过程为:
E n c r y p t o ( p k , m ) = m + 2 r + p q Encrypto(pk, m) = m + 2r + pq Encrypto(pk,m)=m+2r+pq
对应的解密过程 D e c r y p t o ( s k , c ) Decrypto(sk, c) Decrypto(sk,c), 其中 s k sk sk表示私钥、 c c c表示密文:
D e c r y p t o ( s k , c ) = ( c m o d p ) m o d 2 = ( c − p ∗ ┌ c p ┘ ) m o d 2 = L s b ( c ) X O R L s b ( ┌ c p ┘ ) Decrypto(sk, c) = (c \ mod \ p) \ mod \ 2 = (c - p* \ulcorner\dfrac{c}{p}\lrcorner)mod \ 2 = Lsb(c) \ XOR \ Lsb(\ulcorner\dfrac{c}{p}\lrcorner) Decrypto(sk,c)=(c mod p) mod 2=(c−p∗┌pc┘)mod 2=Lsb(c) XOR Lsb(┌pc┘)
约定:
- 一个实数模 p p p为: a m o d p = a − p ∗ ┌ a p ┘ a \ mod \ p = a - p * \ulcorner\dfrac{a}{p}\lrcorner a mod p=a−p∗┌pa┘ ,其中 ┌ x ┘ \ulcorner x\lrcorner ┌x┘表示** x x x的最近整数**,即有唯一整数在 ( x − 1 2 , x + 1 2 ] (x-\frac{1}{2}, x+\frac{1}{2}] (x−21,x+21]范围中,所以 a m o d p a \ mod \ p a mod p 的范围就是 ( − p 2 , p 2 ] (-\frac{p}{2}, \frac{p}{2}] (−2p,2p]
注意这里的取模与一般的取模的不同,一般的取模计算是向下取整 a − p ∗ ⌊ a p ⌋ a - p* \left\lfloor\dfrac{a}{p}\right\rfloor a−p∗⌊pa⌋,范围也就是 [ 0 , p − 1 ] [0, p-1] [0,p−1]
- L s b Lsb Lsb是最低有效位,因为最后是模2运算,所以结果就是这个二进制数的最低位
很多学者将这里的加解密的2替换为 2 k 2^k 2k使之能适应k位的明文
注意:这里是对称加密,所以公钥和私钥是相同的,即 p k = s k = p pk =sk = p pk=sk=p
正确性的验证:
对于解密算法显然可以看出 m o d p mod \ p mod p将 p q pq pq项消除, m o d 2 mod2 mod2将随机数 r r r项消除,最后的结果就是 m m m
公钥加密方法
通过上面的对称加密, 下面考虑将其改造成为一个公钥算法:
直接将 p q pq pq看作是公钥,但是因为随机数 q q q是公开的,所以私钥 p p p立即就会被知晓,这样是不安全的
可以通过使用私钥生成一系列零密文(输入为0)的方式来生成公钥:
p k i = E n c r y p t o ( s k , 0 ) = 2 r i + p q i pk_i = Encrypto(sk,0) = 2r_i + pq_i pki=Encrypto(sk,0)=2ri+pqi
可以将上面的公式运行的结果做成一个集合即: { x i ; x i = 2 r i + p q i } \{x_i;x_i=2r_i+pq_i\} { xi;xi=2ri+pqi}, 公钥 p k pk pk就是这个集合 { x i } \{x_i\} { xi}
加密时从 { x i } \{x_i\} { xi}中选取一个子集记为 S S S,则按如下公式进行加密:
E n c r y p t o ( p k , m ) = m + 2 r + s u m ( S ) Encrypto(pk, m) = m + 2r+sum(S) Encrypto(pk,m)=m+2r+sum(S) 其中 s u m ( S ) sum(S) sum(S)表示对 S S S中的 x i x_i xi求和
由于 s u m ( S ) sum(S) sum(S)是一些0的加密密文的和,所以对于解密来说并无影响,所以解密过程不变
观察上面生成 p k i pk_i pki的式子,不管在其后添加多少这样的式子,解密时都会被求余消去
如此就可以得到如下密钥对:
- 公钥: p k ⊆ { x i } pk \subseteq \{xi\} pk⊆{ xi}
- 私钥: p p p
安全性
1. 已知明文长度攻击
当攻击者事先知道明文的长度时, 在数位较少时, 可以直接猜想每一个位(50%的正确率)
所以一般采用大整数的方式,防止类似的攻击
2. 已知密文攻击
抛开其中的随机数 r r r (噪音) 不谈,DCHV的安全性主要依赖于数学困难问题—“近似GCD问题”
简单来说,给出一系列 x i x_i xi,无法在有效的时间内解得 p p p, 因为根据 x i = 2 r i + p q i x_i=2r_i+pq_i xi=2ri+pqi,所以 x i x_i xi可以看作是一系列近似 p p p的倍数,通过一系列近似 p p p的倍数求 p p p的过程就是近似最大公约数问题(approximate—GCD problem),目前还是计算困难的
噪音的干扰
由于公钥是公开的,所以知道密文c之后就可以减去公钥得到: c − p k = m + 2 r c-pk = m + 2r c−pk=m+2r (可以把 p k pk pk看作是 p q pq pq)
由于存在 r r r的干扰,所以无法识别明文m, 所以 m + 2 r m+2r m+2r 就称为噪音
噪音是能否正确解密的关键!
- 当 c m o d p = m + 2 r ≤ p 2 c \ mod \ p = m+2r \leq \frac{p}{2} c mod p=m+2r≤2p时,再进行模2运算可以得到正确的明文m即 ( m + 2 r ) m o d 2 = m (m + 2r) \ mod \ 2 = m (m+2r) mod 2=m成立
- 当 c m o d p = m + 2 r > p 2 c \ mod \ p = m+2r > \frac{p}{2} c mod p=m+2r>2p时,第一步模 p p p运算就会失败,结果不在等于 m + 2 r m+2r m+2r,后面再模2自然也解密失败
为何是以p/2为标准?因为求余采用的最近整数其范围就是 ( − p 2 , p 2 ] (-\frac{p}{2}, \frac{p}{2}] (−2p,2p]
同态性证明
假设密钥为 p p p,1位的明文 m 1 , m 2 m_1,m_2 m1,m2,则有:
同态加法
D e c r y p t o ( s k , ( c 1 + c 2 ) ) = m 1 + m 2 Decrypto(sk, (c_1+c_2)) = m_1 + m_2 Decrypto(sk,(c1+c2))=m1+m2
满足加法同态
同态乘法
D e c r y p t o ( s k , ( c 1 c 2 ) ) = m 1 m 2 Decrypto(sk, (c_1c_2)) = m_1m_2 Decrypto(sk,(c1c2))=m1m2
在噪音影响范围内满足乘法同态(不理解见下文分析)
噪音分析
加法的噪音: $(c_1+c_2) \ mod \ p = (m_1+m_2) + 2(r_1 + r_2) $
乘法的噪音: $ c_1c_2 \ mod \ p = m_1m_2 + 2(m_1r_2+m_2r_1+2r_1r_2)$
可知:密文之和的噪音是各自密文的噪音之和,而密文乘积的噪音是噪音之积
所以在同态乘法中运算,噪音会被放到很大
一个例子:
对密文运算会造成噪音的增大,当噪音超出范围,解密就失败,这意味着对密文运算不可能是无限次的
所以可以得出结论:
此方案是类全同态方案,因为噪音的原因只适用于少量的加密计算
推广
这两部分目前本人也在学习中。。。所以后续再更新
1. 真-全同态加密
类全同态不是我们想要的结果,我们要实现的是真的全同态加密方案:
已有的思路:密文刷新
既然噪声会不断的扩大,那么就在中途将其刷新,即每次在对密文运算之前先将密文进行解密,就会得到一个新鲜的密文,这个噪音是很小的,然后再对密文做运算,就可以保证其同态性 (当然计算复杂度也提升了很多)
2. 加解密电路
有了基础比特的同态运算,结合类似电路组合可以实现多种算术上的同态
学习资料来源
知乎:https://zhuanlan.zhihu.com/p/71583737
http://blog.sciencenet.cn/blog-411071-617182.html
[1] M. Dijk, C. Gentry, S. Halevi, and V.Vaikuntanathan. Fully homomorphic encryption over the integers[J]. Applications of Cryptographic Techniques: Springer, Berlin, 2010, 24-43.
觉得不错的话,请点赞关注呦~~你的关注就是博主的动力
关注公众号,查看更多go开发、密码学和区块链科研内容: