同态加密(Homomorphic Encryption)是很久以前密码学界就提出来的一个OpenProblem。早在1978年,Ron Rivest,Leonard Adleman, 以及Michael L. Dertouzos就以银行为应用背景提出了这个概念。Ron Rivest和Leonard Adleman分别就是著名的RSA算法中的R和A。至于中间的S,Adi Shamir,现在仍然在为密码学贡献新的工作。】

什么是同态加密?提出一个构造出全同态加密(Fully Homomorphic Encryption)的Craig Gentry给出的直观定义最好:A way to delegate processing of your data, without giving awayaccess to it.


这是什么意思呢?一般的加密方案关注的都是数据存储安全。即,我要给其他人发个加密的东西,或者要在计算机或者其他服务器上存一个东西,我要对数据进行加密后在发送或者存储。没有密钥的用户,不可能从加密结果中得到有关原始数据的任何信息。只有拥有密钥的用户才能够正确解密,得到原始的内容。我们注意到,这个过程中用户是不能对加密结果做任何操作的,只能进行存储、传输。对加密结果做任何操作,都将会导致错误的解密,甚至解密失败。
Gentry在实现全同态加密方案时,注意到可以在Evaluate算法中执行自己的解密函数,那么输入的数据是什么呢?
解密函数当然输入的是密钥sk和密文c。但是不要忘了Evaluate算法是如何定义的。Evaluate算法是对输入的密文c1,c2,…执行函数 f 的操作,也就是对密文进行计算,其实隐含在其中的本质是对密文做同态计算,即计算后的密文解密后要等于对明文做同样的计算,如果这点做不到,那么Evaluate算法即使能对密文做很多次运算,也是没有意义的,这点一定要清楚。
同态加密方案最有趣的地方在于,其关注的是数据处理安全。同态加密提供了一种对加密数据进行处理的功能。也就是说,其他人可以对加密数据进行处理,但是处理过程不会泄露任何原始内容。同时,拥有密钥的用户对处理过的数据进行解密后,得到的正好是处理后的结果。

有点抽象?我们举个实际生活中的例子。有个叫Alice的用户买到了一大块金子,她想让工人把这块金子打造成一个项链。但是工人在打造的过程中有可能会偷金子啊,毕竟就是一克金子也值很多钱的说…因此能不能有一种方法,让工人可以对金块进行加工(delegate processing of your data),但是不能得到任何金子(without giving away access to it)?当然有办法啦,Alice可以这么做:
Alice将金子锁在一个密闭的盒子里面,这个盒子安装了一个手套。
工人可以带着这个手套,对盒子内部的金子进行处理。但是盒子是锁着的,所以工人不仅拿不到金块,连处理过程中掉下的任何金子都拿不到。
加工完成后。Alice拿回这个盒子,把锁打开,就得到了金子。
这个盒子的样子大概是这样的:
这里面的对应关系是:
1)盒子:加密算法
2)盒子上的锁:用户密钥
3)将金块放在盒子里面并且用锁锁上:将数据用同态加密方案进行加密
4)加工:应用同态特性,在无法取得数据的条件下直接对加密结果进行处理
5)开锁:对结果进行解密,直接得到处理后的结果
在近期的一篇名为《有关加密技术的温馨提示》的博文中,R3CEV(区块链联盟)的KathleenBreitman 就简单地给出了一个不错的工作性定义:
“加密指的是给纯文本作伪装来隐藏信息这一举措。对文本进行加密的这套规则叫做加密算法。算法的原有功能取决于加密密钥,或者是以信息作为算法的输入项。用户想要从算法输出中获取信息,就必须有一套解密算法,在解码密钥的辅助下,还原原来的文本。”
如果这个加密法采用密码文本来解译纯文本,那么你得到的就是同态加密(结合数字签名字数),而这个也正是本文将讨论的加密技术的技术。同态加密可以在无需先进行解密的情况下,在加密数据上完成计算。也就是说,这项技术允许在保护数据/交易隐私的同时,在不披露数据/交易的前提下进行计算。只有这些拥有解码密钥的人才能访问真实数据/交易。
同态加密就是解码(加密(A) +加密(B))=A+B,即D(E(A)+E(B))=A+B,也就是加法同态。
因此在加密数据上进行的解密计算,也就等于加密数据的计算。
随着云计算将在未来变得越来越普及,同步加密技术将允许公司将敏感的信息储存在远程服务器里,既避免从当地的主机端发生泄密,又依然保证了信息的使用和搜索。用户也得以使用搜索引擎进行查询并获取结果,而不用担心搜索引擎会留下自己的查询记录。
同态加密在区块链隐私保护中的应用
基于加法同态加密的区块链隐私保护方法的特征在于,包括如下步骤:
1)同态密钥生成,由一个可信任的第三方机构生成一对同态密钥作为全网的同态密钥,公开其同态公钥,私钥保存在第三方机构中。用户的账户余额有两种存在形式:一种是用全网同态公钥加密后存储在区块链公共账本上的真实余额,一种是以明文形式存储在用户本地只供用户自己可见的可见余额。
2)拆分交易发送方的账户可见余额,发送方须将自己的可见余额值拆分为需要转账的交易金额和剩余余额,需要转账的交易金额不得大于可见余额,且任何金额不得小于零;
3)用全网同态公钥加密交易金额和剩余余额,同态加密后的密文分别记为X1和X2,此操作采用加法同态加密算法;
4)用接收方的公钥加密步骤2)中的交易金额,加密后的密文记为Y1;
5)发送者发起交易,交易内容包含步骤3)中的密文X1、密文X2以及步骤4)中的密文Y1三个字段,发送者将交易信息发送至全网节点进行验证;
6)交易确认,区块链全网的验证节点进行交易信息的验证,并维护公共账本。由于公共账本上以同态加密密文形式存储全网账户的真实余额,验证节点进行交易验证时应当确认,①密文X1和密文X2对应的真实金额不小于零;②密文X1和密文X2的同态加法和与发送者的公共账本余额一致;交易信息验证成功后,验证节点对公共账本上的用户真实余额进行修改。
7)更新接收者的可见余额:接收者上线接收交易信息,利用自己的私钥解密交易信息中的密文Y1得到交易金额明文,直接更新自己的可见余额。或者,接收者向可信的第三方机构申请查询真实余额,然后更新自己的可见余额。
本文转载自「井通区块链」


