在区块链技术的宏伟蓝图中,以太坊(Ethereum)无疑占据了举足轻重的地位,作为全球第二大加密货币和最具活力的智能合约平台,以太坊的安全性和可靠性离不开其底层密码学技术的坚实支撑,摘要算法(也称为哈希算法)扮演着至关重要的角色,它贯穿于区块创建、交易验证、账户管理、智能合约执行乃至共识机制的方方面面,以太坊所采用的摘要算法是Keccak-256,它不仅是以太坊安全的第一道防线,也是理解其工作原理的关键一环。

什么是摘要算法?

在深入探讨Keccak-256之前,我们首先需要理解什么是摘要算法,摘要算法是一种将任意长度的输入数据(也称为“消息”)通过特定的数学变换,生成固定长度输出的单向函数,这个输出值被称为“(Digest)、“哈希值”(Hash Value)或“指纹”(Fingerprint),优秀的摘要算法应具备以下核心特性:

  1. 确定性:相同的输入数据总是产生相同的摘要。
  2. 快速计算:能够迅速地从输入数据生成摘要。
  3. 单向性:从摘要反推原始输入数据在计算上是不可行的。
  4. 抗碰撞性
    • 弱抗碰撞性:给定一个数据和其摘要,找到另一个具有相同摘要的数据在计算上是不可行的。
    • 强抗碰撞性:找到任何两个不同数据,使其具有相同摘要在计算上是不可行的。
  5. 雪崩效应:输入数据的微小变化(如修改一个比特),会导致摘要发生巨大且不可预测的变化。

这些特性使得摘要算法在密码学领域被广泛应用于数据完整性校验、数字签名、密码存储和区块链技术等。

以太坊的选择:Keccak-256与SHA-3的渊源

以太坊最初选择的摘要算法是Keccak,Keccak是由Guido Bertoni、Joan Daemen、Michaël Peeters和Gilles Van Assche设计的一组密码学哈希函数,在2012年赢得了美国国家标准与技术研究院(NIST)的SHA-3竞赛,NIST随后将Keccak的标准版本命名为SHA-3。

以太坊并没有完全采用NIST最终确定的SHA-3标准(FIPS 202),而是使用了Keccak算法的一个早期版本,通常被称为“Keccak-256”,这个版本与SHA-3的主要区别在于“填充方案”(Padding Scheme):

  • Keccak-256(以太坊使用):在输入数据末尾填充的附加常数是0x01,并且填充后的数据长度需要满足一定的模运算条件。
  • SHA-3(NIST标准):填充方案更为复杂,使用0x060x80的组合,并涉及不同的位填充规则。

以太坊团队选择Keccak-256而非最终的SHA-3标准,部分原因是基于对算法安全性、实现效率以及社区早期共识的考量,尽管存在这种细微差别,Keccak-256和SHA-3在核心算法结构上是相同的,都具备极高的安全性。

随机配图