密码学作为区块链最基础的的技术之一,这些知识既包括对信息的转换、加解密,以及校验过程,也包括以太坊地址和交易Hash,交易信息RLP编码、基于椭圆曲线公私钥签名、区块Merkle树交易。
HashHash在数学上也被成为"散列", 是指将任意长度的二进制(明文)转换为较短的固定长度的二进制(Hash值)。Hash算法的特点如下。
输出长度小于输入长度对于任何输入都能进行快速和高效的计算强抗冲突性:任何输入改变都会影响大量的输出位。输入数据只要稍有变化,就会得到一个千差万别的结果,且结果无法事先预知。单向值:输入不由输出决定当然,不同的输入有时候也可能产生相同的输出,出现相同输出值的概率成为Hash的碰撞率。本质上,Hash是一种将不同信息通过一种恰当的方法产生消息摘要,以便于在后续使用时得到较好的识别,Hash函数的实现,经过多年的发展已经包含了非常多的种类和实现,有的强调实现简单快速,有的注重Hash结果的较小的碰撞率,还有的则关注算法以实现较高的安全性,总之要根据不同的应用场景,选择不同且恰当的Hash算法。目前的一些知名的Hash函数包括MD5,SHA系列,以及PBKDF2等
MD5: Message-Digest Algorithm,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
Keccak算法SHA家族的系列Hash算法是在全球范围内被广泛使用的安全Hash算法,常常应用在数字签名和校验的场景中,其中SHA-1使用尤其广泛。但是2005年2月,山东大学王小云等发表了完整版的对SHA-1的攻击,只需小于2的69次方的计算复杂度,就能找到一组碰撞,根据摩尔定律,随着计算机计算能力的提高,SHA-1很快被认为是一种不安全的Hash算法。这之后,NIST又相继发布了SHA-224、SHA-256、SHA-384和SHA-512,后四者成为SHA-2,SHA-256和SHA-512是很新的Hash函数,实际上二者的结构是相同的,只在循环次数上有差异,SHA-224和SHA-384是前面两种Hash函数的截短版,利用不同的初始值做计算
Keccak是一种被选定为SHA-3标准的单向散列函数算法,在设计上与SHA-2存在极大差别,之前针对SHA-2的攻击方法无法有地攻击Keccak。
Keccak算法采用了一种称之为海绵的结构,海绵结构由两个阶段,一个是吸收阶段,另外一个称之为压缩阶段。在海绵函数中,输入数据被分为固定长度的数据分组。每个分组逐次作为迭代的输入,同时上轮迭代的输出也反馈至下轮的迭代中,最终产生输出哈希值,其输入数据没有长度限制,输出哈希值的比特长度分为:224,256,384,512。
r:比特率(比特 rate),其值为每个输入块的长度
c:容量(capacity),其长度为输出长度的两倍
b:向量的长度,b=r+c
填充:对数据填充的目的是使填充后的数据长度为r的整数倍,因为迭代压缩是对r位数据块进行的,如果数据的长度不是r的整数倍,最后一块数据将是短块,这将无法处理。
以算法Keccak-256,输入abc为例显示补位的过程. a, b, c对应的ASCII码分别是97, 98, 99;于是原始信息的二进制编码为:01100001 01100010 01100011。此时r = 1088。
① 补一个“1” :0110000101100010 01100011 1
② 补1062个“0”:
01100001 01100010 01100011 10000000 00000000 … 00000000
③ 补一个“1” ,得到1088比特的数据:
Keccak算法的整体结构如下图:
椭圆曲线(Ellipse Curve Cryptography , ECC)和签名算法(Ellipse Curve Digital Signature Algorithm , ECDSA)在数字货币和区块链场景中被普遍采用。ECC与基于大质数因子分解困难性的加密算法不同,其依赖的数学原理是求解椭圆曲线上离散对数问题的困难性。
在椭圆曲线加密(ECC)中,利用了某种特殊形式的椭圆曲线,即定义在有限域上的椭圆曲线。其方程如下:
y²=x³+ax+b(mod p)
这里p是素数,a和b为两个小于p的非负整数,它们满足:4a³+27b²(mod p)≠0 其中,x,y,a,b ∈Fp,则满足式的点(x,y)和一个无穷点O就组成了椭圆曲线E。
在数学中,一个椭圆曲线群可以看做曲线上所有点和无穷原点O组成的集合。对于椭圆曲线上的不同的两点P和Q,若有P+Q =R,则说明P和Q的直线与椭圆曲线相交与一点(-R) , -R在x轴对称的点即为R,如下图所示。
从上图可以看出,椭圆曲线上的加法运算,相加得到的点,依然在椭圆曲线上。在椭圆曲线的两个点P和Q之间,存在一个等式kP = P+P+P+…+P = Q。如果已知k和P,求解Q点比较简单,但是如果已知Q点和P点, 要求解有多少个k,使得kP =Q ,就极其不容易。椭圆曲线的密码学,这是利用求解k的困难性作为安全性的理论基础。在应用层面一般是将k作为私钥,Q作为公钥。
椭圆曲线离散对数问题ECDLP定义如下:给定素数p和椭圆曲线E,对 Q=kP,在已知P,Q的情况下求出小于p的正整数k。可以证明,已知k和P计算Q比较容易,而由Q和P计算k则比较困难,至今没有有效的方法来解决这个问题,这就是椭圆曲线加密算法原理之所在。
以太坊上使用的椭圆曲线和比特币一致,都采用了Certicom这家密码学领域的专业公司推荐的曲线-secp256k1。椭圆曲线secp256k1在二维空间表示为y²=x³+ax+b,满足六元组关系D=(p,a,b, G, n, h)
secp256k1由于其自身构造的特殊性,经过优化实现,在性能上比其它曲线提高了大概30%,也可以有效抵御破解攻击。
在区块链技术中,普遍使用椭圆曲线而非RSA,是因为椭圆曲线相当于RSA,具有如下4个显著特点:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)