加密哈希与认证加密技术解析
1. SipHash 算法介绍
Poly1305 虽然快速且安全,但存在一些缺点:
- 多项式评估难以高效实现,尤其对于不熟悉相关数学概念的人来说。
- 若不使用 Wegman–Carter 构造,它仅对一条消息安全;使用该构造时需要随机数,且随机数重复会导致算法不安全。
- 它针对长消息进行了优化,处理短消息(少于 128 字节)时会造成资源浪费。
SipHash 于 2012 年由我和 Dan Bernstein 设计,最初是为了解决哈希表的拒绝服务攻击问题。哈希表在编程语言中用于高效存储元素,此前哈希表依赖非加密的键控哈希函数,容易找到碰撞,攻击者可通过拒绝服务攻击使使用哈希表的远程系统变慢。SipHash 是一个适用于哈希表的伪随机函数(PRF),针对短消息进行了优化,也可用于其他场景,是一个成熟的 PRF 和消息认证码(MAC),在处理短输入时表现出色。
2. SipHash 的工作原理
SipHash 采用了一种比基本海绵函数更安全的技巧:在置换前后都对消息块进行异或操作,而不是仅在置换前进行一次异或。其 128 位密钥被视为两个 64 位字 K1 和 K2,与一个 256 位的固定初始状态(视为四个 64 位字)进行异或。之后丢弃密钥,计算 SipHash 主要是迭代一个名为 SipRound 的核心函数,然后对消息块进行异或操作以修改四字节的内部状态,最后将四个状态字异或在一起得到一个 64 位的标签。
SipRound 函数使用一系列异或、加法和字旋转操作来确保函数的安全性。它对四个 64 位字(a, b, c, d)的状态进行如下操作: