高中生如何理解比特币加密算法
密码学历史悠久,几乎每个人都可以构造加密和解密的方法,比如简单的循环移位。旧的或简单的方法需要秘密的加密算法和密钥。但从历史上长期的攻防战来看,基于加密的保密并不可靠。同时,密钥的传输一直是个大问题,经常面临密钥泄露或中间人攻击的风险。
20世纪70年代,密码学迎来了突破。Ralph C. Merkle在1974中首先提出了非对称加密的思想。两年后,Whitfield Diffie和Whitfield Diffie两位学者提出了基于单向函数和单向暗门函数的具体思想。随后,大量的研究和算法涌现出来,其中最著名的是RSA算法和一系列椭圆曲线算法。
无论哪种算法,都是在前人的肩膀上,主要基于数论、群论和以素数为研究对象的有限域理论的发展。内容加密的密钥不再需要传输,而是通过运算生成,这样即使在不安全的网络中,通信也是安全的。密文的解密依赖于密钥的解密,但是密钥的解密面临一个难题。对于RSA算法,这个问题是大数的因式分解,对于椭圆曲线算法,这个问题是准离散对数解。两者目前都没有多项式时间的解,也就是说当位数增加时,难度呈指数级增加。
那么在公钥和私钥系统中,加密和解密是如何工作的呢?总之是在有限的领域内通过运算进行的,因为加密和解密必须准确。有限域是由有限个元素组成的集合。加密是将一个元素映射到另一个元素,而解密是再次映射。有限域的合成与素数的性质有关。
前段时间,黎曼猜想(与素数定理密切相关)被炒得沸沸扬扬的时候,区块链项目的一个技术总监说椭圆曲线算法与素数无关,不受黎曼猜想的影响,完全是扯淡。可以看出,区块链项目是喜忧参半,需要好好洗一洗。
比特币和大多数区块链项目采用的公钥系统是椭圆曲线算法,而不是RSA。在介绍椭圆曲线算法之前,先了解一下离散对数问题对于它的安全性是有帮助的。
我们先来看看费马大定理:
原始根定义:
设(a,p)=1 (a和p互质),满足
的最低正整数L称为A的模P的阶,模P阶为(最大)p-1的整数A称为模P的本原根。
两个定理:
基于此,我们可以看到{1,2,3,… p-1}是一个有限域,定义的运算gi (mod p)落在这个有限域内。同时,当I从0到p-2取不同的数时,运算结果也不同。这和我们高中学的幂运算基本相同,只是多了一层模运算。
还有一点需要注意的是,g的指数可以不限于0~p-2,实际上可以全是自然数,但是因为
因此,所有的函数值都在一个有限域内,它们是连续循环的。
离散对数定义:
设g是模p的本原根,(a,p) = 1,
我们称I为a的指数(对于模p的本原根g),表示为:
这里ind是索引的前三个字母。
这个定义是不是很像log的定义?其实这是我们高中学过的对数定义的延伸,只是现在应用于有限域。
但这不同于实数域的对数计算,实数域是一个连续的空间,对数计算有公式和规律可循,但往往很难精确。我们的加密系统需要准确性,但在有限域上操作极其困难。当你知道了幂值A和对数底数G,就很难求出它的离散对数值I。
当选取的素数p足够大时,在时间和计算上都变得不可能找到I。所以,我们可以说我是不能被计算的,也就是安全的,不能被破解的。
比特币的椭圆曲线算法具体采用secp256k1算法。网上有很多关于椭圆曲线算法的介绍,这里就不细说了。只要知道它其实是一条三次曲线(不是椭圆函数),定义如下:
然后是参数a和b;不同的椭圆曲线有不同的值。当然,X和Y是在实数域定义的,这在密码体制中是不可行的。真正用到的时候,X和Y应该定义在一个有限域上,都是自然数,小于一个素数p,那么定义这个椭圆曲线的时候,它的响应只是坐标系中的一些离散点,一点也不像曲线。但是,在集合有限域中,它的各种运算是完备的。也就是说,通过加密运算可以找到对应的点,通过解密运算可以得到加密前的点。
同时,和上面提到的离散对数问题一样,我们希望在这条椭圆曲线的离散格中找到一个有限子群,它具有上面提到的遍历性和循环性。我们所有的计算都会用到这个子群。这样就建立了一个我们需要的有限域。那么这里我们需要子群的阶(一个素数n)和子群中的基点g(一个坐标,可以通过加法运算遍历n阶子群)。
根据上面的描述,我们知道椭圆曲线的定义包含了一个五行祖先(P,A,B,G,N,H);具体定义和概念如下:
p:大素数,用来定义椭圆曲线的有限域(群)。
a,b:椭圆曲线的参数,定义椭圆曲线函数。
g:循环子群中的基点,运算的基础。
n:循环子群的阶(另一个大素数,
h:子群的相关因子,即一个群的阶除以子群的阶的整数部分。
好了,是时候看看比特币的椭圆曲线算法是什么样的椭圆曲线了。简单来说,它是一条椭圆曲线,上面的参数取值如下:
椭圆曲线定义了加法,表示两点相连,关于X轴与图像第三点相交的对称点为两点之和。网上已经有很多内容了,这里就不细说了。
但是,细心的同学可能会有一个疑问。离散对数的问题是,求幂很容易,但求它的指数很难。但是,在椭圆曲线算法中,没有幂,只有积。这如何体现离散对数问题?
其实这是一个定义的问题。一开始椭圆曲线算法把这个运算定义为求和,但是只要你把这个运算定义为乘积,整个系统就没问题了。而且如果定义乘积,会发现所有的运算在形式上都符合离散对数问题和选择有限域的原理。所以,这本质上是一个离散对数问题。但它不是一个简单的离散对数问题,实际上比一般的离散对数问题更难,因为它不是简单的求一个数的离散对数,而是在一个自定义的计算上求一个与离散对数相似的值。这就是为什么椭圆曲线算法非常安全,因为它使用的私钥位(256位)比RSA需要的(通常为2048位)少得多。