EKT多链技术丨区块链的密码学之二

EKT多链技术丨区块链的密码学之二_第1张图片

 

     前言:谈区块链离不开密码学。从凯撒密码到维吉尼亚密码,从单表位移到多表代换,从对称加密,到非对称加密,密码学已经走过了漫长的三千年。作为一门古老的学科,如今却又因为互联网和区块链技术重新闪耀光彩。传统互联网离不开密码学来保护一切可能被攻击的信息传输,区块链则利用块链式数据结构来验证与存储数据、利用分布式节点公式算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。区块链的核心是它按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。我们对此做一个总结,可以发现区块链中有四项不可缺的核心技术,分别是分布式存储、共识机制、密码学原理和智能合约。今天我们将延续上周的话题,继续从密码学的角度聊一聊区块链的起源问题。

 

【失灵的SHA-1】

​      区块链玩家应该都对一个词非常的熟悉——哈希。

 

      Hash,一般学术界翻译做“散列”,程序员直接音译为“哈希”,它的操作是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

 

      所有散列函数都有一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,这种情况称为“散列碰撞(collision)”,这通常是两个不同长度的输入值,刻意计算出相同的输出值。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。

 

      哈希函数需要满足下述条件:

 

      a.确定性:哈希函数的算法是确定性算法,算法执行过程不引入任何随机量。这意味着相同消息的哈希结果一定相同。

      b.高效性:给定任意一个消息m,可以快速计算HASH(m) 。

      c.目标抗碰撞性:给定任意一个消息m0 ,很难找到另一个消息m1,使得HASH(m0)= HASH(m1) 

      d.广义抗碰撞性:很难找到两个消息m0不等于m1 ,使得HASH(m0)= HASH(m1)。

 

      在密码学上,一般认为如果d条件不满足,那么此哈希函数就不再安全。在实际中,一般认为如果在某种程度上c条件不满足,那么此哈希函数就不再安全。当然了,如果c个条件完全不满足,那么此哈希函数已经彻底不安全,应该被直接弃用。

 

      哈希一般的实际应用被称为安全散列算法,(英语:Secure Hash Algorithm,缩写为SHA),它是FIPS认证的安全散列算法,是一个密码散列函数家族。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高(以前被认为无限趋近于99.99999999%,为啥是以前,稍后解释)。

 

      密码学作为一门古老的学科,有着悠久而奇妙的历史。它用于保护军事和外交通信可追溯到几千年前文字刚刚产生的上古时期。几千年来,密码学一直在不断地向前发展。从凯撒密码开始,人们在发展新密码学算法的时候也在孜孜不倦的破解已有的密码学算法,因为对于破解者来说,密码难度越高,意味着其背后守护的秘密价值就越大。SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,后几个一般也可以统称为SHA-2,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。也是众多互联网和电子产品的密钥门神。

 

      SHA系列Hash函数家族是最为知名的Hash函数家族,MD5,SHA-1和SHA-2都一直被广泛的使用,比特币使用的就是属于SHA-2系列里的SHA-256凑杂算法。1990年MD4算法被提出,但是被很快发现了严重的安全问题,在1992年被MD5算法取代。MD5算法在之后的十几年内被软件行业广泛使用,直到2004年我国密码学家王小云在国际密码讨论年会(CRYPTO)上展示了MD5算法的碰撞并给出了第一个实例。该攻击复杂度很低,在普通计算机上只需要几秒钟的时间。在2005年王小云教授与其同事又提出了对SHA-1算法的碰撞算法(Finding Collisions in the Full SHA-1, CRYPTO 2005),不过计算复杂度为2的69次方,在实际情况下难以实现。

 

      直到去年(2017年)的2月24日,谷歌抛出了他们惊人的实验结果——公布第了一例SHA-1哈希碰撞实例,这项发表甚至使密码学界最为著名的顶会CRYPTO为等其论文修改结果延期了19个小时。因为简单来说,Google的工作基本宣判了SHA-1的死刑。在这项工作公布前,大多数网站https的证书都涉及使用SHA-1算法,包括GitHub在内的众多版本控制工具以及各种云同步服务都是用SHA-1来区别文件,很多安全证书或是签名也使用SHA-1来保证唯一性。长期以来,人们都认为SHA1是十分安全的,至少大家还没有找到一次碰撞案例, 不过如今不得不为用户安全考虑开始升级至SHA-2或者其他算法了。

 

      CWI和Google的研究人员们成功找到了一例SHA1碰撞,而且很厉害的是,发生碰撞的是两个真实的、可阅读的PDF文件。这两个PDF文件内容不相同,但SHA1值完全一样。

 EKT多链技术丨区块链的密码学之二_第2张图片

 

      为什么这一研究结果的发表如此引人注目?这是因为大家都知道散列算法可能存在碰撞, 但只要这种碰撞难以创造,散列算法所支撑的系统就是安全的——而大家之前一直认为SHA1的碰撞案例很难实现。Google证明这一说法是站不住的,尤其是在现在GPU并行计算得到大范围应用的情况下。Google使用110块GPU,经过一年的计算,总共进行了9百亿亿次计算(总共9,223,372,036,854,775,808次)创造了这一碰撞案例——这一计算过程的时间开销固然庞大,但就现在非常普遍的大规模计算中心来说,并不是难以实现的。这意味着目前实现对于SHA1的碰撞攻击仍然需要海量的计算时间

 EKT多链技术丨区块链的密码学之二_第3张图片

 

      MD5和SHA-1虽然已经不建议被使用,但并不能说它们就已经完全过时。事实上,现有的各种更优秀的密码算法都是在旧算法的基础上建立起来的,而旧的算法体系往往也并不是因为存在固有漏洞而被人们抛弃——计算能力的飞速发展导致我们的基础算法必须不断改进,才能适应生产环境的需要同时避免潜在的安全风险。我们也必须保持以最新的眼光来看待和处理工作,当新的技术突破出现时及时关注,切勿墨守成规,固步自封。SHA-1和SHA-2是SHA算法不同的两个版本,它们的构造和签名的长度都有所不一样,但可以把SHA-2理解为SHA-1的继承者。比特币采用的SHA-256属于SHA-2的256位用法,当年(2008年)中本聪构写比特币时,未曾考虑到SHA算法这么快就能被破解,不过所幸后来的各类数字货币采用了更多更难破解的加密算法,具体大家可以往回翻翻我之前写的《加密货币如何加密》系列。不过从SHA-1被Google攻破来看,所有承载巨大市值的加密货币都应该引起警觉,因为共利共识的维护,还是必须建立在加密算法的基石之上。

 

【量子计算的隐忧】

      但如果现有加密方式全部失灵,数字货币世界会变成什么样子?

 

      这个听起来有点天方夜谈的想法其实离我们并不遥远。当十几年后实用量子计算机出现,算力大幅提升,现有的依靠数学复杂度来保证安全性的非对称密钥的加密方式很可能会全部失灵。郭光灿院士在演讲中就曾提到,基于2000qubit的量子计算机使用shor算法可以在1s完成RSA算法安全性依赖的大数分解计算。

 

      首先简单讲一下什么是量子计算。量子比特可以制备在两个逻辑态0和1的相干叠加态,换句话讲,它可以同时存储0和1。考虑一个 N个物理比特的存储器,若它是经典存储器,则它只能存储2^N个可能数据当中的任一个,若它是量子存储器,则它可以同时存储2^N个数,而且随着 N的增加,其存储信息的能力将指数上升,例如,一个250量子比特的存储器(由250个原子构成)可能存储的数达2^250,比现有已知的宇宙中全部原子数目还要多。 由于数学操作可以同时对存储器中全部的数据进行,因此,量子计算机在实施一次的运算中可以同时对2^N个输入数进行数学运算。其效果相当于经典计算机要重复实施2^N次操作,或者采用2^N个不同处理器实行并行操作。可见,量子计算机可以节省大量的运算资源(如时间、记忆单元等)。

 

      量子计算机并不是一种更快的计算机。它在逻辑、输出方式等方面与经典计算机根本不同,其中最本质的就是量子纠缠的存在。在量子信息学的观点中,量子纠缠是与物质、能量、信息并列的一种自然资源,利用好这种资源能使量子计算机发挥出巨大威力。但是,如何用它设计更快的算法,在理论上就是很大的挑战。目前,对绝大多数计算问题,理论家们都还没有找到超过经典算法的量子算法;但在一些特殊问题上确实有了新的发现。哪些问题呢?最早发现的主要有两类:一类可以归结为质因数分解(Shor 算法),比已知最快经典算法有指数加速(准确说是超多项式加速);另一类可以归结为无序搜索(Grove 算法),比经典算法有多项式加速。

 

      Shor 算法和 Grove 算法分别于1994年和1996年被提出,可以说是它们的发现引起了科学界对量子计算的真正重视——尽管量子计算的初步概念在80年代初就已出现,但十几年来都只是很小圈子内的理论游戏,被认为既无法实现也没有用处;Shor 算法和 Grove 算法终于为量子计算机找到了可能的实际应用。其中 Shor 算法的影响尤其大——现代密码学中,几类常用的公钥系统包括 RSA (Rivest–Shamir–Adleman) 和 ECC (elliptic-curve cryptography) 等的基本加密原理就是大数分解的计算复杂度。因此量子计算机一旦出现,将给现有的信息安全带来巨大威胁,加密货币现有的算法也几乎全部不堪一击。顺带一提,ECC就是比特币使用的加密方式。

滑铁卢大学量子计算学院的联合创始人Michele Mosca(也是圆周理论物理研究所的研究人员)认为我们现在所用的部分加密工具,到2026年就有1/7的概率遭破解;到了2031年,这个数字又会上升到50%。也就是说,到那个时候,如果我们还在用现在的加密机制,那么即便网络传输的数据经过了加密,也可通过暴力破解来解密——这也是量子计算能够带来的“便利”。

 

      有人想到既然量子计算可以带来算力提升破解加密算法,那么可不可以用量子算法来直接加密呢?答案是可行但目前一切未知。量子加密设备中必不可少的、同时也是最昂贵的部件是光子探测器,在现有(或者不远的将来)条件下,发起一次量子计算攻击可以带来巨大收益而有人愿意为此买单,但如果说使用量子加密算法的数字货币都采用这个类型的矿机,那又是不可能承受的成本之痛了,不过未来一二十年会发什么样神奇的事情,谁又能预测呢?

 

     【EKT的思考】

      在20世纪70年代,英国情报部门和学术机构的研究人员各自独立发明了非对称加密方法。它使用两个不同的密钥:一个公钥和一个私钥。在一次交易的加密过程中,两个密钥都是必需的。例如,在进行线上购物时,供应商的服务器把公钥发送到消费者的电脑,这个密钥是公开的,可以被所有消费者获取并使用。消费者的电脑用该公钥加密一个密钥,后者将作为与供应商共享的对称密钥。在收到经过加密的对称密钥之后,供应商的服务器将用一个自己独有的私钥对之进行解密。一旦双方安全地共享了对称密钥,就可以用其完成后续交易的加解密。

 

      非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。

 

      另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。

 

      在EKT中,我们就使用了公私钥结合的非对称加密和路由策略的机制实现拜占庭容错。我们EKT的多链,采用“多链分而治之”的新方案重新设计了一个保障每个合约都能正常运行的公链,其中就使用到了非对称加密对用户的信息进行保存,同时主链和子链信息共享但是功能隔离。这一创新极大程度上简化了架构,降低了数据处理压力,确保一条链上流量激增不会影响到另一条链的效率,在链上进行的任何业务都不会收到其他业务干扰,有效实现了资源隔离。

 

      在EKT中Token链是一个并行多链的结构,多链多共识,共享用户基础。EKT的Token是链上的一个属性,就像使用了utxo模型的链utxo有其他Token一样,我们的转账事件也是内置的。

 

      其实EKT解决的一个核心问题是,目前Dapp的开发难度的问题如果使用以太坊的Solidity开发,需要学习以太坊的一整套逻辑,在复杂应用开发的时候需要考虑各种优化方案,同一个功能使用传统C/S结构一天写完的,用以太坊可能要写几周时间,对开发者来说很不友好。这一套流程若要Dapp/公链开发者写出来,势必在真正开发区块链功能之前就已经被这些繁琐但其实通用的步骤耗费过多精力和资源。

 

       在EKT中,坚持了这样一个理念,一个货币系统中不需要图灵完备的开发语言,不同的应用间尽可能实现隔离的原则。因此我们在设计的时候,把token的处理和DApp的处理分开了,也就是说在EKT上存在两种类型的链:token链和DApp链。

 

       token链就是专门用于处理token交易的一条链,鉴于ERC20代币不断曝出的各种漏洞(虽然漏洞的产生是智能合约开发者的问题,但是我们认为是有更好的方案来实现的),在EKT上内置了token对象,开发者只需要定义自己要发的token的数量即可。另外,EKT的token链是一个多链多共识的结构,也就是说不同的token可以放在不同的token链上进行打包,多链并行极大提高交易处理速度。

 

       EKT的DApp链是供不同开发者开发DApp的一条链。我们从智能合约开发语言、数据存储(带有默克尔证明的和私有的不带默克尔证明的存储空间)、效率三个方面进行了优化。EKT的DApp链基本上可以实现与现在的互联网应用相同甚至更快的开发速度,可实现的功能性也与互联网应用没有太大差异,最重要的是,我们可以实现大部分事件的1秒执行和确认,安全性要求比较高的事件可以实现3秒的确认。

 

       EKT的中心思想就是设计一个社区的机制,让开发者可以轻易的开发一个可以承载DAPP的主链,其他的交给EKT来处理, EKT 的“一链一主币,多链多共识”的机制为后来的区块链项目开发提供了很大的便利,可以使用于任何区块链适用的应用场景。 EKT 提供了一套底层的区块链机制,其他的区块链项目可以很容易的基于 EKT 的主链代码部署一套自己的主链。在EKT上编写的区块链项目将无需过于担心安全性问题,因为每一个接口都是非常简单并且在许多条并行主链上部署和运行的。部署主链时可以灵活的发行自己主链的代币以及选择共识算法。新部署的主链也可以加入到 EKT 的整个生态,共享 EKT 生态的用户资源,代币也可以和EKT 主币以及其他主链的代币进行交换和流通。

 

      在设计EKT的加密制度时,我们团队也曾经认真考虑过SHA-1破解以及未来量子计算技术大发展之后对区块链世界的影响,甚至一度想要立马着手实现这个看似fancy的功能。不过经过深思熟虑之后,我们团队还是决定将现在有限的资源尽可能投入到平台的开发工作当中,同时我以及几个同事都会密切关注加密货币安全方面的进展,保持可以参考和跟紧最新最安全的学术界新动向。

 

      以上就是我对区块链密码学的一些思考,和一些在设计EKT的多链多共识时对建设非对称加密底层的考虑。欢迎大家提出疑问,共同探讨。

 

      End

 

参考阅读:

20160519 计算文件SHA-1值原理

20161225 加密算法之:对称加密与非对称加密扫盲贴

20170119 区块链 - 比特币的共识机制

20170223密码学大事件!研究人员公布第一例SHA-1哈希碰撞实例

20170313 比特币中的SHA256是何方神圣?

20170418 Hash算法总结

20170919 散列算法:SHA-1,SHA-2和SHA-256之间的区别

20180414详解“多链多共识”机制

20180202 区块链和比特币 不过是密码学历史上的一次小高潮?

《History of cryptography》

《BTC whitepaper》

《EKT whitepaper》

 


END

 

今天关于“区块链&密码学二”的文章就这里

如果有任何技术上的问题想与我讨论

欢迎关注微信公众号:EKT多链技术

你可能感兴趣的:(技术分析)