比特币背后的算法与数学

以比特币为代表的各种区块链币,之所以被称之为加密数字货币,是因为密码学是比特币设计的重要安全基石,用以确保货币流通各个环节安全性。比特币使用的加密算法被称之为椭圆曲线算法(ECC),是一种著名的非对称算法。相较于另一种著名的非对称算法RSA,ECC算法的数学理论非常深奥和复杂,在工程应用中比较难于实现,但它的单位安全强度相对较高。

哈希算法

可以说比特币的整个实现就是建立在已有的甚至存在多年的计算机科学领域里的技术或概念的整合,其中哈希算法在比特币中的应用几乎是方方面面,主要包括SHA256和RIPEMD160,比特币将这两个哈希算法的应用组合成两个函数:hash256(d)=sha256(sha256(d))和hash160(d)=ripemd160(sha256(d)),其中d为待哈希的字节数组,两者分别生成256位(32字节)和160位(20字节)的16进制数值。hash256主要用于生成标志符,如区块ID,交易ID等,而hash160主要用于生成比特币地址。

值得一提的是,为什么两个函数都是做两次哈希呢?对于hash160比较认同的答案是ripemd160可以使得生成的地址更短,但是只做ripemd160一次哈希可能会存在安全漏洞所以同时使用sha256起到安全加固;至于hash256使用两次sha256哈希算法的原因来源于sha1算法,由于一次sha1哈希存在被生日攻击(birthday attack)的风险,所以当使用sha1运算时一种有效方式就是做两次sha1哈希,sha256本身并不存在生日攻击漏洞,但是防御性的使用两次sha256哈希借鉴于sha1.

默克树

默克树的基本原理就是将叶子节点两两配对做哈希运算(如果叶子节点为奇数,那么将最后一个叶子复制)生成父节点,不断迭代这一过程最终生成唯一的根节点merkle root。如果要验证一个叶子节点是否存在于默克树中只需要传入一个该节点到根节点路径merkle path,而SPV比特币节点只需保存root节点即可。例如,依上图如果想验证k交易是否在于该区块,我们只需要传递路径HL, HIJ, HMNOP和 HABCDEFGH。
比特币背后的算法与数学

椭圆曲线函数ECC(Elliptic Curve)

椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大素数 分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。

椭圆曲线的数学表达式为y2=x3+ax+b,椭圆曲线有两个重要特性,1.任意一条非垂直的直线与曲线相交于两点,那该直线必与曲线相交于第三点;2.任意一条非垂直的曲线的切线必与曲线相交于另一点。

依据这两个特性,令点Q与P为曲线上的点,得到如下定义,加操作:经过Q和P的直线与曲线相交于第三点R’,那么Q+P=R,其中R为R’点对于x坐标轴的对称点;同理当移动直线使得Q与P点不断逼近并重合为一点D,那么此时直线相切与曲线,根据特征2,与曲线交于一点R’,不难得出D+D=R,其中R为R’点对于x坐标轴的对称点。乘操作:令Q=aP,假设a=3就有:
Q = 3P
Q = P + 2P
比特币背后的算法与数学
ECC的主要优势体现在:

第一,安全性更高。160位的椭圆**与1024位的RSA**安全性相同。

第二,处理速度更快。在私钥的加密解密速度上,ECC算法比RSA、DSA速度更快。

第三,存储空间占用小、带宽要求低。

ECC的这些特点使它必将取代RSA,成为通用的公钥加密算法。比如SET协议的制定者已把它作为下一代SET协议中缺省的公钥密码算法。

RSA 算法

1977年,罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)共同设计了一种非对称加密算法,被称为RSA 算法。RSA 实际上是三位发明人的名字首字母缩写。RSA 算法的加密流程如下:

第一,乙方生成两把**(公钥和私钥),公钥是公开的,私钥是保密的,只有乙方知道。

第二,甲方获取乙方的公钥,然后用它对信息进行加密。

第三,乙方使用私钥对加密信息进行解密。

RAS 算法的安全性依赖于大数分解。大数分解是一个数学上公认的难题,比如说对于数字4, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001=1, 199, 481, 995, 446, 957x3, 334, 772, 856, 269, 093,要找到2个素数来计算得出前面的数字式非常难。对于一些大数的分解,即使借助于计算机的运算,依然要非常长的时间。比如:对于200位的非特殊数字RSA200,2005年计算机花了18个月时间才把它分解成两个素数。可以看出RSA 算法的强度是非常高的,比较难以**。