有一种观点认为,比特币(和类似的虚拟货币)最大的目的/作用是解决了任何人可以匿名转移资产给任何人的难题。这个观点某种程度上是正确的。这篇文章就是来介绍一下区块链的私密实现技术,存在的问题以及解决的方法等。版权所有,转载请注明出处。不得用于商业出版。
1 密码学基础
密码学在信息技术领域的重要地位无需多言。如果没有现代密码学的研究成果,人类社会根本无法进入信息时代。区块链/分布式账本技术运用了许多的密码学技术,并且直接推动着现代密码学的发展。
我们首先来介绍一下密码学领域中跟区块链相关的一些基础知识,包括哈希算法、加密算法、数字签名等,以及如何使用这些技术实现区块链的机密性、完整性和不可抵赖性。
1.1 哈希算法
Hash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能将任意长度的明文映射为较短的固定长度的哈希值,并且不同的明文很难(基本不可能)映射为相同的哈希值。
目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。SHA-2包括SHA-224、SHA-256、SHA-384 和 SHA-512。SHA = Secure Hashing Algorithm. SHA-256的意思是它的输出结果是256位二进制字节长的。
下面是一个SHA-256哈希运算的例子,输出结果是16进制的:
可以发现两个特点:
1、任何小的改动(黄色高亮部分)都会使哈希值变动很大。
2、无论输入长度如何变化,哈希值都是定长的。实际上你用相同的哈希算法来运算的话,无论输入数据时一个很短的字符串、一个文件、一个硬盘的数据、甚至一个数据中心的数据,得出的结果都是定长的。
除此之外,哈希运算还有三个重要的特点:
3、给定明文和哈希算法,在有限时间和有限资源内能计算出哈希值。
4、给定(若干)哈希值,在有限时间内很难(基本不可能)逆推出明文。
5、很难找到两段内容不同的明文,使得它们的哈希值一致(发生冲突)。
虽然哈希运算结果的有限长度意味着理论上同一个输出可以找到很多不同的输入,但实际上很难这样去倒推。给定一个SHA-256运算结果,使用穷举法找出一个相同的输入的几率是1/2^256 =115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936分之一。所以如果我们收到两个信息它们的哈希值是一样的话,我们可以很有信心地说它们是一样的。
一般的哈希算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行哈希运算的速度也越快。
1.2 加解密
加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文;解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。
下面总结了对称加密和非对称加密的一些特点和区别:
非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。其优点是公私钥分开,不安全通道也可使用。
缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。
非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。
非对称加密一般适用于签名场景或密钥协商,不适于大量数据的加解密。RSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。
1.3 数字签名
类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。
黎明要发给慧敏一个合同文件,怎么证明文件确实是黎明发出来而不是学友呢?黎明用自己的私钥给文件签名,把文件和签名同时发给慧敏。慧敏用黎明的公钥对签名进行验证。验证通过证明了文件只能是黎明发出来的,因为其他人没有黎明的私钥。这就证明了来源或不可抵赖性。
同时黎明的签名还可以加入合同文件的摘要作为输入参数。慧敏对签名解密后得到文件的摘要,和收到的合同文件摘要进行对比,如果一致,就可以证明文件的一致性和完整性了。
1.4 同态加密
同态加密(Homomorphic Encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理再加密,得到的结果相同。从代数的角度讲,即同态性。
如果定义一个运算符∆,对加密算法 E,满足: E(X ∆ Y) = E(X) ∆ E (Y)
则意味着对于该运算满足同态性。
同态性在代数上包括:加法同态、乘法同态、减法同态和除法同态。同时满足加法同态和乘法同态,则意味着是 代数同态,即 全同态。同时满足四种同态性,则被称为 算数同态。
仅满足加法同态的算法包括 Paillier 和 Benaloh 算法;仅满足乘法同态的算法包括 RSA 和 ElGamal 算法。
1.5 算术电路
开发软件的时候,一个单独的算术运算一般被称为一个算术门。它一般包括两个输入和一个输出。
算术电路是由很多个算术门连接组成的,每个算术门包含一个单独的算术运算(如加或乘),以完成一个复杂的算术运算。下图是一个简单的例子:
算术电路可以和同态加密一起使用,来完成加密后数据的复杂计算。
2. 比特币和以太坊的私密性问题
比特币和以太坊是现在第一和第二大的公共区块链平台。两个平台都是完全公开、透明、使用匿名身份的区块链平台。任何人都可以无障碍地从任何地方连入平台,并且所有的交易数据对于任何人都是可见的。平台通过参与者的公钥(对应比特币里的地址/以太坊里的帐号)来识别身份。平台无法识别公钥和真实的公钥持有人的关系。简单来说,比特币和以太坊通过以下方法达到了数据的完整性和一定的私密性:
完整性:
用secp256kl椭圆曲线加解密方法来实现交易验证
基于工作量证明(比特币用SHA-256哈希算法计算工作量,以太坊用Etash)的共识算法
只有51%拜占庭攻击问题
高可用性:
完全去中心化的结构来避免单点故障
身份保密:
交易只记录公钥,不直接记录身份。公钥具有匿名性。
UTXO的数据机构允许使用混合交易等方法进一步加强匿名性
数据保密:
所有的交易数据(交易方的公钥、时间、金额等)都是明文全网可见的。
这种模型最大的私密问题是,如果公钥的持有人(如黎明)因为某个原因泄露或被识别了,那么他的所有交易信息都会变得对所有人完全透明。并且所有和黎明有交易的公钥也可以被全部列出来。这些交易信息包括时间、金额,转出方/转入方等。并且这些信息永远没有办法删除或改变。比如,2009年某些时候,黎明从一些特殊人士那里得到了一笔比特币,他转了520给当时的女朋友嘉欣。嘉欣出嫁前把比特币全部卖了(新郎不是黎明),并且声称没有认识过黎明。在区块链的世界里,只要有一点蛛丝马迹,就可以完全把嘉欣和黎明的账号挖出来,然后这些旧账就全部暴露了。
现在已经有很多的研究是关于如何识别比特币交易者的身份的,包括如何在网络里追踪交易,并把交易和资金根据它们在网络的扩散规律联系起来,或者根据不同资金发送方和接收方的模式来识别身份。
3. 区块链私密性的改进方法
3.1 改进方法
下面先简介已知的一部分公开的区块链私密性的改进方法:
环签名(Ring signature):一组人构成一个环,任何人以自己的私钥对外签名,等同于该环的签名。其他人就不知道签名是环内哪个人发出的。
隐身地址或一次性公钥:资金接收方每次交易都把一个新的公钥交给发送方。可以隐藏接收方的身份。
佩德森承诺(Pedersen Commitments):使用同态加密把交易金额加密来达到私密交易。
混合币(Coinjoin / Mixing):把自己的交易和其它人的交易混合在一起以达到隐藏身份和金额的目的。
零知识证明:把金额和发送者信息隐藏起来
把交易具体信息放在链下存储:以实现信息的物理或逻辑隔离。
把交易信息加密后储存在链上:可以隐藏交易金额。
下面这个表总结了几种最重要的技术可以提供的私密性区别:
不同的技术可以一起使用来提供更好的私密性。下面表格总结了现在一些已经在使用的产品所用到的技术和提供的私密性:
相对应的,提高系统私密性的技术也会对系统提出更高的要求,或者说对系统的效率造成影响,包括需要更多的存储空间/内存/CPU资源等。下表对比了不同平台下单个典型交易的存储空间要求:
特别需要指出的是,Zcash虽然提供了最好的私密性,但现在它生成一个有零知识证明的交易要花费非常大的计算资源 --一台普通的台式电脑需要约48秒才能完成。作为对比,同样的电脑生成一个私密交易或门罗币交易只需要若干毫秒。因此要根据不同的业务需求和成本做出不同的技术选择。
今天先写到这里。希望接下来有时间可以写写不同的私密解决方案的细节。
领取专属 10元无门槛券
私享最新 技术干货