本文主要是介绍海绵结构:Hash as RO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考文献:
- [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′ 就不再影响安全性。
这篇关于海绵结构:Hash as RO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!