以太坊学习一:密码学

  密码学作为区块链最基础的的技术之一,这些知识既包括对信息的转换、加解密,以及校验过程,也包括以太坊地址和交易Hash,交易信息RLP编码、基于椭圆曲线公私钥签名、区块Merkle树交易。

Hash

   Hash在数学上也被成为"散列", 是指将任意长度的二进制(明文)转换为较短的固定长度的二进制(Hash值)。Hash算法的特点如下。

  1. 输出长度小于输入长度
  2. 对于任何输入都能进行快速和高效的计算
  3. 强抗冲突性:任何输入改变都会影响大量的输出位。输入数据只要稍有变化,就会得到一个千差万别的结果,且结果无法事先预知。
  4. 单向值:输入不由输出决定

   当然,不同的输入有时候也可能产生相同的输出,出现相同输出值的概率成为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公开密钥认证或是数字签名等用途。

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算法

   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个显著特点:

  1. 安全性能更高,160位ECC密钥与1024位RAS安全强度相当
  2. 处理速度更快,在私钥的处理速度上,ECC比RSA快得多
  3. 带宽要求更低
  4. 存储空间更小

猜你喜欢

转载自blog.csdn.net/weixin_43839871/article/details/124115682
今日推荐