区块链技术的基础是计算机密码学,可以说***“没有计算机密码学,就没有区块链技术”***,区块链在如下方面用到了计算机密码学:
区块链应用国密算法的重要性
为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。
其中:
目前,这些算法已广泛应用于国家各个领域中,其中金融领域比如PBOC3.0中国密是国家标准。在国内区块链应用采用国密算法作为标准是必然的。
国密算法对应表
前面所述区块链功能及所采用的密码学算法,国密中都有对应的部分,见如下表格
完全用国密去建立起一套区块链框架,理论上是有可能的,且所用到的国密算法主要是SM2,SM3,SM4
国密替代方案
完全用国密建立起一套区块链框架,虽然理论上是有可能的,但是实际实现时需要考虑兼容性问题,我们知道以太坊的账户就是基于ECDSA椭圆曲线算法生成的,私钥是32位,公钥是65位,公钥压缩成地址后是20位。国密的对应算法是SM2,虽然同样属于椭圆曲线算法体系,但是曲线参数的不同,造成其并不兼容以太坊账户。
因此国密替换的重点放在了用SM4算法替换AES算法。
SM4算法介绍:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。
回头看我们为北京银行网贷资金存管项目所做的加密流程:
其中设计加密算法的如下:
-
对业务明文加密是用对称算法进行的,此处可以用国密SM4,现在是DES -
对交易密钥本身的加密,也是采用对称算法的,此处可以用国密SM4,现在是AES -
对交易密钥加密的密钥是通过ECDSA椭圆曲线算法生成的,此处不替换,但是由于做了缓存,这种运算只有程序初始化的时候用到
也就是说如果前2种情况采用国密,就相当于覆盖了99%的加密需求
替换国密后性能对比测试
使用国密算法后,性能问题要重点考虑,因为:
考虑到如上情况,所以设计了一个实验
-
环境为工作笔记本,4C8G,其中CPU是i5-5200U,2.2Ghz -
明文长度是16字节,密钥长度16字节,密文长度16字节 -
基于Junit,每个循环经历一次加密,一次解密,且解密结果和原文进行核对,如果对不上中断退出 -
每次测试,发起100万个加密解密请求 -
同样地,加密过程中所用的哈希算法也替换成国密(比如密钥交换后得到的大数用hash变为32位以便后续运算),同样是每次测试发出100万个哈希请求,比对原有算法和国密的速度
对称加密测试结果对比表格:(红色为最长耗时,蓝色为最短耗时)
测试期间CPU占用情况比对:(前者AES,后者SM4)
SM4算法调用的代码:
SM3哈希算法调用的代码:
哈希算法测试结果对比表格:
测试情况说明:
-
Java中加密算法的实现,可以由不同的第三方去实现;本次测试所用3种,分布是JDK自带的标准实现,著名第三方提供商SpongyCastle包中提供的AES和SM4算法。 -
JDK自带的AES实现,速度比较慢,经过代码分析,该实现代码较为简单,没有为了提升速度将一些中间过程中可能用到的变量全部以静态方式预存;相反地SpongyCastle AES算法,采用**“以空间换时间”**的方法,定义了大量的空间用于对称加密过程中的比特变化,大大提升了速度。 -
SongyCastle SM4实现上和SpongyCastle AES算法较为相似,也采用了类似“以空间换时间”的方法,速度较快。同样地,哈希算法使用以太坊Util类中自带的哈希算法,和采用国密SM3哈希算法,速度也差不多,甚至国密还快点。预计区块链换用国密SM3和SM4后,速度不会因此下降。 -
目前单单计算加密解密的TPS,可以达到十万次每秒的水平级别,而我们区块链的TPS还在千次每秒的水平级别,目前加密解密还不成为瓶颈
|