什么是同态加密
早在1978年,Ron Rivest, Leonard Adleman, 以及Michael L. Dertouzos就以银行为应用背景提出了同态加密(Homomorphic Encryption)这个概念。在这个概念中,允许对密文进行特定的代数运算后依然能得到加密的结果,将该结果解密以后的结果与对明文进行同样运算的结果会保持一致。
具体的定义如下,假设存在明文m
,加密函数E
,解密函数D
,密文c
,则有
c = E(m)
m = D(c)
假设现在需要对明文m
做一些处理,处理过程可以用函数f
表示,如果存在下面关系
f(m) = D(f(c))
则称加密算法为同态加密算法。
用途
上面的一些公式究竟有什么用?下面我们来假设一个场景。某小银行A
有一批交易私密的数据处理,比如说要提取用户交易信息给用户画像进行相应的理财产品推荐之类,定义了特征提取方法函数F
,但计算量很大,A
并不想投太多钱在基础建设上,而是想使用廉价的云计算服务。这个业务有几个特征:
- 需要处理的数据是私密数据
- 处理函数特别耗计算力
- 银行
A
不是土豪,并不愿意投太多钱到机器和运维费用上。
而使用其他公司提供的云计算平台就会存在服务不可信的问题,这时候同态加密就开始发挥威力了。
从图中可以看到引入同态加密之后,云计算平台拿到加密数据,处理完的数据其实也是加密数据,这样很好地防止云计算平台获取到原始私密数据,同时保证在传输过程中就算给拦截拦截者也无法看到原始数据和处理结果。从图中可以看到,同态计算方式流程中,由云计算平台返回的处理结果cr
,通过解密后D(cr)
得到的结果r
与原始数据m
直接经过F(m)
得到的结果一致。
实际上这个方案有一个难点,就是选择的同态算法是否支持任意处理函数F
。其实按支持力度算法可分成两类,支持任意处理函数F
的同态加密算法被称为全同态加密算法(Fully Homomorphic Encryption),而只支持特定函数F
的就是微同态加密算法(Somewhat Homomorphic Encryption)。第一个全同态算法由Craig Gentry在2009年提出,但由于复杂度太高,暂时无法商用。
所以,同态加密在这个场景中只是理论可行,毕竟不能支持任意处理函数F
能支持的应用场景比较有限。
匿名投票系统设计
实际在我们生活上,有很多场景只需要特定的处理函数F
既可,比如匿名投票系统。在介绍匿名投票系统之前,先稍微深入了解微同态加密算法。
微同态加密算法表示该算法至少满足以下几个条件中一个:
- 加法同态
- 乘法同态
- 减法同态
- 除法同态
比如说我们经常用到的RSA算法就是乘法同态,而在投票系统中,由于票数统计都是加法累加,只要找到具备加法同态的算法既可,比如Paillier算法,有兴趣自行搜索一下,这里讲一下Paillier算法的同态等式
D(E(m1,r1)*E(m2,r2) mod n^2) = m1+m2 mod n
其中m1
和m2
是原文,r1
和r2
是算法的随机因子(主要是为了针对同样的明文加密出来的不同密文),n
是算法所选择出来的两个大素数的乘积。
为了最简要说明同态算法使用,我们简化匿名投票系统的模型,模型定义如下
- 只两个候选人
Bertrand
和Lynn
- 只两个投票者
Obama
和Cliton
,两者有算法公钥,他们都是有身份的人,可以保证只投一票。 - 一个记票人
Satan
,他可能是个坏蛋,但需要他运行处理算法进行记票。 - 一个公布结果人
Athena
,她有算法私钥
投票流程如下所示:
其中投票原文m1如下所示:
{
"Bertrand": 1,
"Lynn": 0
}
表示Obama
投了Bertrand
一票,投票密文cm1可能如下所示:
{
"Bertrand": 1283192381..., //一个很大的整数
"Lynn": 23432423... //也是一个很大的整数
}
Satan
拿到两个投票密文后需要统计票数,比如说统计Bertrand
的票数,他需要把两个投票密文Bertrand
对应的票数相乘(根据上面Paillier同态等式)来获取票数,但实际上他并不知道Obama
是否投了Bertrand
一票。
而Athena
拿到的加密票数可能如下所示:
{
"Bertrand": 89812371293..., //一个很大的整数
"Lynn": 218308213... //也是一个很大的整数
}
使用解密算法解密后就可以得到最终结果
{
"Bertrand": 1,
"Lynn": 1
}
至于Bertrand
的那一票是谁投的,只有投票人知道了。