KECCAK 的海绵构造:SHA-3 吸收再挤压的那台压面机 图 1
KECCAK 的海绵构造:SHA-3 吸收再挤压的那台压面机 · 图 1

SHA-1 被碰撞攻击逐个击破、SHA-2 还在扛但结构老旧的年代,美国国家标准与技术研究院公开征集新一代哈希标准。胜出者 Keccak 带来的是一个和 MD5、SHA-2 那条『压缩函数链条』完全不同的骨架:海绵构造。它不像传统哈希那样把消息一块块折进一个越来越乱的链值,而是把消息『吸』进一块固定的内部状态,用置换函数反复搅拌,最后从同一块状态里『挤』出结果。名字里的海绵不是修辞——吸收、搅拌、再吸收、再搅拌,挤出的长度可以任意,这正是它的卖点。

状态怎么分:rate 管吞吐,capacity 管安全

海绵的内部状态是一串固定位数的比特(Keccak-f 排列的实例里有 25 到 1600 比特等档位),使用前按用途切成两段:靠前的 rate 段负责和输入消息做异或——每次吸进来一个 rate 大小的分组,就异或进这段,然后对全状态跑一轮置换;靠后的 capacity 段从不与消息直接碰面,专职充当安全余量。输出阶段同样规则:状态不搅拌的话,可以从 rate 段反复挤出比特流,每挤一段补一轮置换。rate 越大吞吐越快,capacity 越大安全强度越高,一个哈希实例的安全上限基本由 capacity 决定——SHA3-256 的那 512 比特 capacity 就是它对原像抵抗与碰撞抵抗双目标折中后的定价。理解了这条切分,你会发现一个微妙事实:海绵的状态机可以无限喂、无限挤,它本质上是一个由置换函数撑起来的确定性随机源,哈希只是它最顺手的一种用法。

一台机器兼任哈希、加密、随机数与派生

因为输入输出解耦,海绵构造天然长出一套全家桶:定长挤压当哈希;把密钥先吸进去、之后持续挤压当流加密(SHAKE 扩展输出函数配成 PRG 就是这个玩法);吸进口令挤出密钥当密钥派生;甚至构造消息认证码(KMAC)和可延长输出的确定性填充。传统链式哈希做这些事都需要外挂脚手架,海绵在结构层面就把『一个状态吸收所有输入、按需输出任意长』变成一等公民。这种灵活性的代价也实在:状态大、置换轮数多,软件实现比 SHA-2 慢,硬件侧也没有 SHA-256 那种被专用挖矿芯片多年打磨出来的生态红利——这解释了为什么比特币没有换掉 SHA-256,而 SHA-3 更多出现在需要变长输出或 KMAC 的协议里。

Keccak、SHA-3 与 keccak256:三个名字两件事

命名容易踩坑。Keccak 是原始算法家族;NIST 2015 年标准化时改写了填充规则(补一笔域分隔比特,防某些构造学攻击),标准化后的版本才叫 SHA-3,所以严格说 SHA-3 是 Keccak 经过填充修订的子集。以太坊踩的坑更出名:它的底层哈希在标准定稿前就选定了原始 Keccak 的填充规则,并一路以 keccak256 的名字沿用至今——它和 SHA3-256 只差最后那段填充,却永远互不兼容。在以太坊生态长大的代码里迁移或对接时,不要把两个名字当同义词混用,哈希对不上的第一嫌疑就是这对孪生兄弟拿反了。

海绵的安全性到底说什么

海绵的安全证明走的是海绵理论:假设置换函数足够理想(随机置换模型),任何区分器或碰撞的代价都和 capacity 的一半成指数关系。这不是『已破解』也不是『已证明安全』——它把安全归约到『这轮置换函数表现得像真随机』这一可检验失败的假设上,密码学界把这视为可接受的归约方式,Keccak 的公开分析多年没能把 24 轮的置挤压出比生日界更低的攻击。评估哈希标准时,比背轮数更重要的是分清三层:算法结构(海绵)、置换实例(Keccak-f 的轮数与常量)、以及归约假设——大多数『某某哈希更安全』的争论,争的其实是第三层。

快速问答

海绵构造比默克尔-达姆加德链好在哪?不是单纯的强弱,而是功能形状不同:链式只能压出固定长度,海绵可以变长输入变长输出,一个状态支持哈希、派生、MAC、流加密多种角色。

我现有系统用 SHA-256,需要迁移到 SHA-3 吗?没有需求信号就不必。迁移的真正驱动力是结构需求(需要 KMAC、变长输出或哈希无关性),而不是单纯换口味。

风险提示:本文仅作密码学机制科普,不构成任何投资建议。算法标准的选择应跟随权威平台的官方推荐,不要依据单一文章做安全决策。