From here:
IBM研究员Craig Gentry最近刚刚找到了一种全同态加密算法。
记加密操作为 E,明文为 m,加密得 e,即 e = E(m),m = E’(e)。已知针对明文有操作 f,针对 E 可构造 F,使得 F(e) = E(f(m)),这样 E 就是一个针对 f 的同态加密算法。
假设 f 是个很复杂的操作,有了同态加密,我们就可以把加密得到的 e 交给第三方,第三方进行操作 F,我们拿回 F(e) 后,一解密,就得到了 f(m)。第三方替我们干了活,对 m 却仍一无所知,——多么融洽的关系啊。
找到这样的 E 并不容易,单纯从数学角度看,E(x) = x,就是同态的,但是可惜没有加密效果,说了等于白说。RSA 算法对于乘法操作是同态的,对应的操作 F 也是乘法,对别的比如加法就无法构造出对应的 F;而 Paillier 算法则是对加法同态的。如果一种加密算法,对于乘法和加法都能找到对应的操作,就称其为全同态加密算法。目前还没有真正可用的全同态加密算法,虽然 Craig Gentry 已经前进了一大步。
考虑一个匿名投票系统,投票方、计票方、宣布方三权分立,采用公钥加密,只有宣布方拥有私钥。投票方将加密的票送到计票方,计票方利用同态特性进行操作 F,得到汇总的结果,宣布方拿到该结果后解密之,即得总票数。宣布方不知道单独每张票的情况,从而实现了匿名;计票方解不出票面信息,于是可以防止计票方从中作梗。选择对加法同态的加密算法:投谁的票给谁记“1”,不投计“0”;也可选择对乘法同态的算法:投谁的票给谁记“N”,不投计“1”。大致原理如上所述,实现起来还有其它一些难点:1. 赞成/反对票加密出来的结果应该多种多样,以防计票方胡乱推测;2. 能在不解密的情况下对票的有效性进行校验,不能允许一个人一下子投 10000 票。
全同态加密的意义对于允许任意复杂的 f,都能构造出相应的 F。这样,就能得到一些匪夷所思的应用:我能解决你的问题,即使我并不知道你的问题。——这是个不太恰当的比喻。
参考了这里。