参考文献:
- [BDPA07] Bertoni G, Daemen J, Peeters M, et al. Sponge functions[C]//ECRYPT hash workshop. 2007, 2007(9).
- [GPP11] Guo J, Peyrin T, Poschmann A. The PHOTON family of lightweight hash functions[C]//Advances in Cryptology–CRYPTO 2011: 31st Annual Cryptology Conference, Santa Barbara, CA, USA, August 14-18, 2011. Proceedings 31. Springer Berlin Heidelberg, 2011: 222-239.
- Secure Hash Algorithm-3 (SHA-3) family
文章目录
- Hash as RO
- Sponge Function
- Collisions
- Random Sponge
- Extended Sponge Functions
[BDPA07] 提出了海绵结构(sponge),这是 MD 结构之外的另一种 Hash 构造方法。
Hash as RO
Merkle-Damgard Construction,
- compression function:压缩函数是一个 block cipher,使用 message block 作为秘钥,去加密 chaining value
- feedforward loop:将输入的消息切分为 message blocks,迭代计算压缩函数,将它的输出作为当前的 chaining value
- message 被填充到分组密码的秘钥长度的整数倍,digest 就是最后一次迭代得到的 chaining value
- 只要 compression function 抗碰撞,那么 MD Construction 就抗碰撞
但是在不同的应用中,我们要求 Hash 实例具有多种不同的安全性(不仅仅是抗碰撞性)。事实上很多密码方案中要求 Hash 表现的像是一个 Random Orcale(预期会满足任意的安全性要求)。确切地说,RO 将一个变长的输入映射为一个无限长的完全随机串,而 Hash 应当表现为某个 RO 的截断。
所有的 Iterated hash functions(例如 MD 结构)都存在 state collisions(有限的状态)。假如 M 1 ≠ M 2 ∈ Σ ∗ M_1 \neq M_2 \in \Sigma^* M1=M2∈Σ∗ 会导致 chaining value 出现碰撞,那么对于任意的后缀 N ∈ Σ ∗ N \in \Sigma^* N∈Σ∗,总有 M 1 ∥ N ≠ M 2 ∥ N M_1\|N \neq M_2\|N M1∥N=M2∥N 具有相同的 digits,这个性质是 RO 不应该具有的。其实状态碰撞是被允许的,但它不应该表现出外部可见的行为。因此 Iterated hash functions 都不是好的 RO 实例。
有两种解决办法,
- 避免迭代过程,例如 non-streamable hash functions
- 依旧使用迭代结构,但是需要消除状态碰撞的坏影响。根据这个策略,[BDPA07] 提出了海绵结构
Sponge Function
首先,定义字母表、内部状态集、编码函数:
[BDPA07] 定义了如下的海绵函数,
定义两个参数,比率和容量,
由于上述的 Sponge Function 被映射
f
f
f 确定,状态被输入
p
p
p 确定,我们简记
S
f
=
(
S
A
,
f
,
S
C
,
f
)
S_f=(S_{\mathcal A,f}, S_{\mathcal C,f})
Sf=(SA,f,SC,f) 是对应的海绵函数,
S
f
[
p
]
S_f[p]
Sf[p] 是吸收后的状态,并将
p
p
p 称为到达此状态的路径。定义
S
+
a
=
(
S
A
+
a
,
S
C
)
S+a = (S_\mathcal A + a, S_\mathcal C)
S+a=(SA+a,SC),那么海绵函数可以递归地定义:
S
f
[
∅
]
=
(
0
,
0
)
S
f
[
x
∥
a
]
=
f
(
S
f
[
x
]
+
a
)
z
j
=
S
A
,
f
[
p
∥
0
j
]
\begin{aligned} S_f[\empty] &= (0,0)\\ S_f[x\|a] &= f(S_f[x] + a)\\ z_j &= S_{\mathcal A,f}[p\|0^j] \end{aligned}
Sf[∅]Sf[x∥a]zj=(0,0)=f(Sf[x]+a)=SA,f[p∥0j]
注意,
- 字母表 A \mathcal A A 可以是任意的有限集合,不仅仅是布尔值
- 内部状态集 C \mathcal C C 是有限的,因此必然会发生碰撞
- 编码函数将消息
m
∈
Σ
∗
m \in \Sigma^*
m∈Σ∗ 编码到字母
p
(
m
)
∈
A
p(m) \in \mathcal A
p(m)∈A
- 由于它是单的,且最后一个字符非凡,这导致 ( m 1 , j ) ≠ ( m 2 , k ) ⇒ p ( m 1 ) ∥ 0 j ≠ p ( m 2 ) ∥ 0 k (m_1,j) \neq (m_2,k) \Rightarrow p(m_1)\|0^j \neq p(m_2)\|0^k (m1,j)=(m2,k)⇒p(m1)∥0j=p(m2)∥0k,于是它们的成为了不同的路径
- 由于编码长度非凡(包括空串 m = ∅ m=\empty m=∅ 的编码),因此海绵函数中的 f f f 至少执行一次,于是输出总是依赖于 f f f 的选取
- 根据 Squeezing 过程的定义,海绵函数的输出是无限长的(具有和 RO 一样的接口),可以作为 stream cipher
Collisions
[BDPA07] 定义了两种碰撞类型,
- 状态碰撞(state collision):不同的路径
p
≠
q
p \neq q
p=q,使得
S
f
[
p
]
=
S
f
[
q
]
S_f[p] = S_f[q]
Sf[p]=Sf[q]
- 它将导致 S f [ p ∥ 0 j ] = S f [ q ∥ 0 j ] , ∀ j ≥ 0 S_f[p\|0^j] = S_f[q\|0^j], \forall j \ge 0 Sf[p∥0j]=Sf[q∥0j],∀j≥0
- 假如 q = p ∥ 0 k , ∃ k ≥ 1 q=p\|0^k, \exist k\ge1 q=p∥0k,∃k≥1,则会输出周期序列 S f [ p ∥ 0 j ] = S f [ p ∥ 0 k + j ] , ∀ j ≥ 0 S_f[p\|0^{j}] = S_f[p\|0^{k+j}], \forall j \ge 0 Sf[p∥0j]=Sf[p∥0k+j],∀j≥0
- 内部碰撞(inner collision):不同的路径
p
≠
q
p \neq q
p=q,使得
S
C
,
f
[
p
]
=
S
C
,
f
[
q
]
S_{\mathcal C,f}[p] = S_{\mathcal C,f}[q]
SC,f[p]=SC,f[q]
- 很明显,状态碰撞导致了内部碰撞,反之不成立
- 但是,假如发生了内部碰撞,那么可以构造 p ∥ a ≠ q ∥ b p\|a \neq q\|b p∥a=q∥b,使得 a , b a,b a,b 满足 S A , f [ p ] + a = S A , f [ q ] + b S_{\mathcal A,f}[p]+a = S_{\mathcal A,f}[q]+b SA,f[p]+a=SA,f[q]+b(公开计算,没有秘密),这就是一个状态碰撞
Random Sponge
假设 ∣ A ∣ = A |\mathcal A| = A ∣A∣=A 以及 ∣ C ∣ = C |\mathcal C| = C ∣C∣=C,由于转换函数 f f f 的定义域和值域都是 A × C \mathcal A \times \mathcal C A×C,
- 共有 ( A C ) A C (AC)^{AC} (AC)AC 个不同的转换函数
- 共有 ( A C ) ! (AC)! (AC)! 个不同的置换函数
[BDPA07] 定义了两族随机的海绵函数,
接着,他们证明了:在黑盒归约下,唯一的区分 Random Sponge 以及 Random Oracle 的方式,就是内部碰撞的存在与否。
只要容量 c c c 足够大,那么它就和 RO 统计不可区分(从而抵御各种的攻击)。注意到比率 r r r 对于安全性没有影响。经典的 MD 结构是假设了底层原语(也就是 block cipher)抵御某些攻击,从而给出安全归约。然而 Sponge 结构则是自身就不存在可被敌手利用的属性。[BDPA07] 还分析了 Sponge 对于多种攻击的抵抗性,包括:抗碰撞、抗原像、抗第二原像、抗长度延展、输入输出的相关性免疫。
当然,这里的安全性是关于 Random Sponge Function 的,但是 SHA3 标准使用的是一些固定的 Keccak 置换函数。如果存在设计缺陷(比如可以将 Keccak 对应的多元高次多项式的次数严重降低),那么它也将不是安全的 Hash 函数。注意,给定对称密码的某个实例,它的安全性分析只能利用已有的攻击方法,给出安全强度的上界,但无法给出其安全强度的下界。而公钥密码中的安全归约,在困难假设下,它给出的是安全强度的下界。
Extended Sponge Functions
[GPP11] 为了轻量化 Hash 函数,给出了扩展的海绵结构,
对于某个
n
n
n-bit extended sponge hash function with capacity
c
,
c
′
c, c'
c,c′ and bitrate
r
,
r
′
r, r'
r,r′,在最著名的通用攻击下,安全强度为
其中
t
=
c
+
r
=
c
′
+
r
′
t=c+r=c'+r'
t=c+r=c′+r′ 是内部状态的大小。随着比率
r
′
r'
r′ 的增加,挤压阶段的运行时间减小,同时抗原像的能力减弱,两者有个权衡。为了完美的抗(第二)原像,可以要求
c
≥
2
n
c \ge 2n
c≥2n,此时
r
′
r'
r′ 就不再影响安全性。