??密码学作为区块链最基础的的技术之一,这些知识既包括对信息的转换、加解密,以及校验过程,也包括以太坊地址和交易Hash,交易信息RLP编码、基于椭圆曲线公私钥签名、区块Merkle树交易。
Hash
?? Hash在数学上也被成为"散列", 是指将任意长度的二进制(明文)转换为较短的固定长度的二进制(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公开密钥认证或是数字签名等用途。
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算法的整体结构如下图:
|