什么是 Keccak?以太坊用的哈希函数
在区块链技术的世界里,哈希函数扮演着至关重要的角色。它们是确保数据完整性、安全性和不可篡改性的基础。在众多哈希函数中,Keccak 函数家族脱颖而出,特别是被以太坊选为其核心加密算法之一。本文将深入探讨 Keccak 是什么,它的工作原理,以及为什么以太坊选择它作为其哈希函数。
Keccak 的起源与背景
Keccak 是一种加密哈希函数,由 Guido Bertoni、Joan Daemen、Michele Peeters 和 Gilles Van Assche 设计,最初于 2007 年发表。2012 年,Keccak 算法被美国国家安全局(NSA)选中作为新的哈希标准 SHA-3 的基础。这一选择标志着密码学领域的一个重要里程碑,因为 SHA-3 是自 2002 年以来第一个被纳入 NIST 密码算法标准的新哈希算法。
Keccak 的设计团队来自 STMicroelectronics 和比利时鲁汶大学,他们致力于创建一种具有全新设计理念的哈希函数,区别于之前广泛使用的 Merkle-Damgård 结构(如 MD5、SHA-1 和 SHA-2 系列算法所使用的结构)。
Keccak 的技术原理
海绵结构
Keccak 最显著的特点是其基于"海绵结构"(sponge construction)的设计。与传统的 Merkle-Damgård 结构不同,海绵结构能够更灵活地处理输入数据,并产生任意长度的输出。
海绵结构的工作原理可以想象成一个海绵:吸收(absorb)和挤压(squeeze)两个阶段。在吸收阶段,输入数据被"吸收"到内部状态中;在挤压阶段,从内部状态中"挤压"出哈希值。
状态排列
Keccak 的核心是一个三维排列函数,称为 f[1600](用于标准 Keccak-256)。这个排列函数在 5×5×20 的状态数组上操作,每个元素是一个 64 位的字。排列函数由多个轮组成,每轮包括五个步骤:θ(theta)、ρ(rho)、π(pi)、χ(chi)和 ι(iota)。
参数配置
Keccak 函数家族具有高度的可配置性,通过两个主要参数来定义:
- 容量(capacity,c):决定算法的安全性
- 速率(rate,r):决定处理数据的速度
这两个参数满足 c + r = b,其中 b 是状态的大小(对于标准 Keccak-256,b = 1600 位)。较大的容量提供更高的安全性,但会降低处理速度。
Keccak 与 SHA-3 的关系
2012 年,NIST 举办了一场哈希函数竞赛,旨在寻找 SHA-2 的继任者。经过多年的评估和测试,Keccak 算法被选为获胜者,并被标准化为 SHA-3。
然而,值得注意的是,最终标准化的 SHA-3 与原始的 Keccak 算法存在一些细微差别。最显著的变化是"吸收-挤压"模式:原始的 Keccak 使用"海绵填充"(pad101),而 SHA-3 使用"pad101"填充方案,并在输出前增加了"1"位。
尽管存在这些差异,SHA-3 的核心构造和安全性保证仍然基于 Keccak 的设计理念。
为什么以太坊选择 Keccak?
以太坊在 2015 年推出时,选择了 Keccak-256(即 SHA-3 的一个变体)作为其核心哈希函数,而不是当时更普遍使用的 SHA-256。这一选择有几个重要原因:
-
安全性考虑:在以太坊开发期间,SHA-2 系列算法虽然尚未被严重破解,但密码学界已经对其长期安全性表示担忧。Keccak 作为新一代哈希算法,提供了更强大的安全保证。
-
设计理念:Keccak 的海绵结构提供了比传统的 Merkle-Damgård 结构更强的抗碰撞性,特别是在长度扩展攻击方面表现优异。
-
性能特点:Keccak 在软件实现中表现良好,特别适合以太坊虚拟机(EVM)的执行环境。
-
前瞻性:选择当时尚未被广泛采用的 Keccak,表明以太坊团队致力于采用最先进的密码学技术,而非仅仅依赖已经被广泛验证但可能过时的算法。
Keccak 在以太坊中的应用
在以太坊中,Keccak-256 被广泛用于各种关键功能:
-
地址生成:以太坊地址是通过对公钥进行 Keccak-256 哈希计算,然后取最后 20 个字节生成的。
-
交易签名:交易数据的哈希使用 Keccak-256 计算,然后使用私钥进行签名。
-
区块哈希:每个区块的哈希值也是通过 Keccak-256 计算得出的。
-
智能合约:智能合约中的哈希函数操作通常基于 Keccak-256 实现。
-
状态根和交易根:以太坊的状态树和交易树的根哈希值使用 Keccak-256 计算。
Keccak 的安全性与优势
Keccak/SHA-3 凭借其独特的设计,提供了多项安全优势:
-
抗碰撞性:Keccak 的结构使其能够有效抵抗碰撞攻击,即找到两个不同输入产生相同哈希值的攻击。
-
抗长度扩展攻击:与 Merkle-Damgård 结构不同,Keccak 不容易受到长度扩展攻击的影响,这是一种针对许多传统哈希函数的特定攻击。
-
灵活性:Keccak 可以生成任意长度的哈希值,并且可以通过调整参数来平衡安全性和性能。
-
简洁性:与 SHA-2 相比,Keccak 的设计相对简洁,减少了实现错误的可能性。
-
广泛的攻击分析:经过多年的密码学分析,Keccak/SHA-3 已经证明了对各种攻击方法的抵抗力。
Keccak 与其他哈希函数的比较
与 SHA-2 的比较
SHA-2(包括 SHA-256、SHA-512 等)是基于 Merkle-Damgård 结构的哈希函数,长期以来是密码学领域的标准。然而,SHA-2 存在一些潜在问题:
- 结构相似性:所有 SHA-2 变体使用相似的结构,发现一个漏洞可能影响整个家族。
- 性能问题:在硬件实现中,SHA-2 的性能不如 Keccak。
- 安全担忧:虽然 SHA-2 目前仍然安全,但其设计年代较早,可能面临未知的攻击方法。
相比之下,Keccak/SHA-3 提供了更现代的设计和更强的安全保证。
与 SHA-1 的比较
SHA-1 已经被证明存在严重的安全漏洞,不再推荐用于安全应用。Keccak/SHA-3 在设计时就考虑了这些漏洞,提供了更强的安全性。
结论
Keccak 作为一种创新的哈希函数,凭借其独特的海绵结构和强大的安全特性,已经成为密码学领域的重要成员。被以太坊选为核心哈希函数,进一步证明了其在区块链技术中的重要性。
随着区块链技术的不断发展,对安全、高效哈希函数的需求将持续增长。Keccak/SHA-3 凭借其前瞻性的设计和经过验证的安全性,将继续在这一领域发挥关键作用。无论是开发者还是用户,了解 Keccak 的工作原理和应用,都有助于更好地理解和使用以太坊等区块链平台。
在未来,随着量子计算等新兴技术的发展,密码学领域将面临新的挑战。Keccak 的设计理念为其提供了良好的基础,使其有可能通过进一步的扩展和改进来应对这些挑战,继续保护数字世界的安全。