区块链的数学基础——椭圆曲线加密原理
2013年起,比特币这种既没有政府背书也没有实体价值支撑的虚拟货币突然从每个三十几美元炒到近两万美元,很多人开始学习区块链技术,之后发行各种虚拟货币圈钱,到2017年,各种虚拟货币的总值高达5000亿美元,相当于2008年全球金融危机时中国政府的四万亿救市计划,不过后来很多虚拟货币的价值几乎清零了,只有少数有实际用途的虚拟货币能维持一个基本价格,如帮助大家换汇和转移财产的比特币和为个人发币提供技术支持的以太坊,但其价格也忽高忽低。
无论虚拟货币前景如何,它的底层技术区块链未来大有可为,因为它有很多其他技术难以实现的用途,比如从根本上解决信息安全问题,支持合约的自动执行。下面从工作机制和设计思路分析它是如何做到这一点的。
1 不对称、不透明之美
虽然人们通常喜欢对称、透明,但黄金分割就是不对称的,而对信息安全而言,透明会带来很多安全隐患。用户不希望别人获得自己的私密信息,只是为了便利不得不开放许多信息的访问权限,让对方验证身份,或者让对方进行统计,以提供更个性化的服务。很多事必须要开放信息才能完成,比如申请贷款就要把个人和财务信息开放给银行。
在完全开放信息的社会里,彻底保护信息安全是不现实的,要保护私有信息(特别是隐私)必须有一套不对称的机制,做到在特定授权的情况下,不需要拥有信息也能使用信息。比特币的意义正在于它利用区块链能做到这点。
区块链由block和chain组成,block即模块、单元或数据块,像一个存储信息的保险箱,chain是链条,表示信息内容和交易记录,存储交易细节,因此有些地方把区块链比喻成一个不断更新的账本,它还有三个普通账本不具备的优点:1、当一个比特币被创造时就产生了记录其原始信息的区块链,这个区块链里的信息无法篡改,以后在交易过程中可以添加它的流通和交易信息,但不能覆盖原有信息,具有传统账本无法拥有的防伪性;2、外界可以确认相应区块链的某些信息的真伪,但不知道内容,比如比特币最重要的信息是认证比特币的密钥,即一长串密码数字,这个密码不对外开放,也称私钥,比特币所有者可以通过私钥产生一个公钥,交给比特币的接受者,接受者根据公钥验证比特币真伪和所属权,而私钥是保密的,保证了比特币的交易安全和各种信息安全。
比特币由一个人交易给另一个人时,区块链账本记录交易过程,之后新的主人可以向其他人发放公钥验证区块链真伪。如果我们用区块链存储个人信息,就可以在不给对方信息的前提下让对方验证真伪。比如现在我们卖房子要给买方看房产证,并且由有关机构证明房产证是真的,未来可以通过区块链保存数字化的房产证,作为房主我们有一个私钥,可以产生一个公钥给购房者验证所有权,避免了其它信息的泄露,把拥有信息和认证信息切割开来。买方购买后获得房契,原私钥作废生成新的私钥,由区块链账本记录这个过程。
3、区块链可以成为一种按约定自动执行的智能合约,这种合约一旦达成,就不能更改,可以解决一些商业纠纷如三角债、拖欠农民工工资等问题。
从以上三点可以看出,区块链能提供超出原先信息加解密范围的应用场景,过去理解的信息安全是:用密钥对信息加密,得到加密信息,进行传输或存储,再用另一把密钥解密,恢复原信息,在之前提到密码学的数学原理时已提到这种加解密的不对称性,它能保证信息的传输安全,但区块链提供了新的应用场景:用密钥对信息加密后,让拿到解密钥匙(公钥)的人只能验证信息真伪,而看不到信息本身,利用信息的不对称性保护信息拥有者的隐私,因为大部分使用者只需要验证信息,不需要拥有信息(如核实身份)。
比特币用到的区块链协议和今天多数改进的协议通常采用椭圆曲线加密法,相比RSA加密,椭圆曲线加密法可以用更短的密钥达到同等或更好的加密效果。
2 椭圆曲线加密原理
椭圆曲线形如:,曲线形状如下图:
曲线特点是上下对称,非常平滑,从曲线上任一点画一条直线,最多和直线有三个交点(包括该点本身)。
从A点出发画一条直线过B点,和曲线交于C点,利用这条性质我们定义一种运算叫点乘“·”,用A·B=C表示三点间关系(从A点向B连线,交曲线于C点),由于椭圆曲线关于X轴对称,作C的镜像点D再与A相连,和曲线交于E点,有A·D=E,可以重复该过程K次得到Z点。
这个过程中:1、点乘运算满足交换率和结合律,先算哪步后算哪步的结果是一样的;2、可能点乘计算若干次后,某个交点的x值(横坐标)非常大,为了防止不断迭代后计算结果发散,在右边某个x值很大的地方设置边界Max,超过max后让直线反射回来;3、虽然图中曲线是连续的,每个点的取值为实数域,但实际使用时通过某种变换将它离散化,所有点都是整数值(应该是x取整数值吧);4、可能有人担心经过多次计算会回到之前某个点,但这个操作类似两个巨大素数相乘后再对某个素数相除取余数(模运算mod),只要算法设计得好,和之前某个点重复的可能性几乎为0。
如果把点乘想象为乘法,经K次点乘相当于做了K次方,给定A和Z后K相当于以A为底Z的对数,因此这种计算过程被称为椭圆曲线的离散对数计算。再定义叉乘计算“×”,类似运算中的乘方,将上述过程记为K×A=Z。
如果已知一开始是A先经过B再到C,一共走了K步,可以推算出Z点,但如果已知的是起点A终点Z,要猜出K是多少步是几乎不可能的,计算量很大。这种不对称性方便验证结果,想破解密码则难上加难。
基于椭圆曲线对数方法的密码系统设计如下:1、曲线方程本身和起始点A公开,如比特币使用SECP256K1标准,是采用椭圆曲线:;2、选择私钥K即运算次数,由此计算得到Z;3、把Z作为公钥公开。
假设AB要用椭圆曲线加密传递信息,彼此之间需要一套密码用来对信息编解码,这套密码仅限2人通信使用。区块链系统会为AB各自产生私钥Ka和Kb(均为随机数),再根据公式从私钥得到公钥Za和Zb,然后交给对方。由Za和Zb无法倒推出Ka和Kb。
发送方A知道自己的私钥Ka,也知道对方公钥Z,因此能计算出Ka×Zb,接收方B能计算Kb×Za,因为Ka×Zb=Kb×Za,因此可以解密,而第三方既不知道Ka也不知道Kb,无从得知AB通信的密码。于是AB就可以加密通信了。
证明中用到叉乘运算的可交换性,来自于原来点乘运算的可交换性。对以上加解密方法稍加修改,就能实现B对A传送信息的验证。
椭圆曲线加密有多种方法,它们的算法和密钥长度各不相同,原理大同小异。美国国家标准与技术局规定这类算法的最小密钥长度为160位,往上还有192位、224位,比RSA要求的1024位短很多。2003年一个团队用一万台PC花了一年半时间破解了109位的密钥,而破译时间随密钥长度指数增长,破解160位密钥需要约1亿倍计算量,破译192位、224位就更难了。除非计算机速度再发生百万倍提升,否则很难破译椭圆曲线加密信息。
小结
比特币展现了不对称性的优点,不仅解决了信息安全问题,而且将信息访问和信息确认分开,从根本上保护隐私。区块链加密利用简单的椭圆曲线(简单吗。。。),从在椭圆曲线上一次次求点中发明加密算法,区块链发明人又利用这种加密算法发明一整套信息验证机制。