同态加密是一种加密形式,它允许人们对密文进行特定形式的代数运算得到仍然是加密的结果,将其解密所得到的结果与对明文进行同样的运算结果一样。换言之,这项技术令人们可以在加密的数据中进行诸如检索、比较等操作,得出正确的结果,而在整个处理过程中无需对数据进行解密。其意义在于,真正从根本上解决将数据及其操作委托给第三方时的保密问题,例如对于各种云计算的应用。

如果我们有一个加密函数 $$$f$$$ , 把明文A变成密文 $$$A'$$$, 把明文B变成密文 $$$B'$$$,也就是说 $$$f(A) = A'$$$$$$f(B) = B'$$$ 。另外我们还有一个解密函数 $$$f^{−1}$$$ 能够将 $$$f$$$ 加密后的密文解密成加密前的明文。

如果 $$$f$$$ 是个可以进行同态加密的加密函数, 我们对$$$C'$$$使用 $$$f^{−1}$$$ 进行解密得到结果$$$C$$$, 这时候的$$$C = A + B$$$。这样,数据处理权与数据所有权可以分离。

如果满足 $$$f(A)+f(B)=f(A+B)$$$ , 我们将这种加密函数叫做加法同态
如果满足 $$$f(A)×f(B)=f(A×B)$$$ ,我们将这种加密函数叫做乘法同态。

如果一个加密函数同时满足加法同态和乘法同态,称为全同态加密。那么这个使用这个加密函数完成各种加密后的运算(加减乘除、多项式求值、指数、对数、三角函数)。

同态加密之所以被称为同态加密是因为这种加密方法跟抽象代数中的同态很像。在抽象代数中,如果 $$$G$$$$$$H$$$ 是两个交换环,如果函数 $$$f:G \to H$$$ 使得:

$$$f(e_G) = e_H$$$ , 其中 $$$e_G$$$ , $$$e_H$$$ 分别是$$$G$$$$$$H$$$中的幺元
$$$\forall x,y \in G,\ f(x \times y) = f(x) \times f(y)$$$
$$$\forall x,y \in G,\ f(x + y) = f(x) + f(y)$$$
均成立,那么我们把 $$$f$$$ 称为一个同态(Homomorphism)。一般的加密函数都是双射的,双射的同态又称为同构(Isomorphism)。所以这么说来,同态加密被称为同构加密更加贴切。

https://github.com/shaih/HElib - An Implementation of homomorphic encryption
https://github.com/diegode/thep - The Homomorphic Encryption Project
https://github.com/mhe/jspaillier - Javascript proof-of-concept implementation of the Paillier cryptosystem