海绵结构:Hash as RO

2024-04-21 21:52
文章标签 结构 hash ro 海绵

本文主要是介绍海绵结构:Hash as RO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文献:

  1. [BDPA07] Bertoni G, Daemen J, Peeters M, et al. Sponge functions[C]//ECRYPT hash workshop. 2007, 2007(9).
  2. [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.
  3. 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 M1N=M2N 具有相同的 digits,这个性质是 RO 不应该具有的。其实状态碰撞是被允许的,但它不应该表现出外部可见的行为。因此 Iterated hash functions 都不是好的 RO 实例

有两种解决办法,

  1. 避免迭代过程,例如 non-streamable hash functions
  2. 依旧使用迭代结构,但是需要消除状态碰撞的坏影响。根据这个策略,[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[xa]zj=(0,0)=f(Sf[x]+a)=SA,f[p0j]
注意,

  • 字母表 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] 定义了两种碰撞类型,

  1. 状态碰撞(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[p0j]=Sf[q0j],j0
    • 假如 q = p ∥ 0 k , ∃ k ≥ 1 q=p\|0^k, \exist k\ge1 q=p0k,k1,则会输出周期序列 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[p0j]=Sf[p0k+j],j0
  2. 内部碰撞(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 pa=qb,使得 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 c2n,此时 r ′ r' r 就不再影响安全性。

这篇关于海绵结构:Hash as RO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924119

相关文章

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.2 Milking Cows(类hash表)

第一种思路被卡了时间 到第二种思路的时候就觉得第一种思路太坑爹了 代码又长又臭还超时!! 第一种思路:我不知道为什么最后一组数据会被卡 超时超了0.2s左右 大概想法是 快排加一个遍历 先将开始时间按升序排好 然后开始遍历比较 1 若 下一个开始beg[i] 小于 tem_end 则说明本组数据与上组数据是在连续的一个区间 取max( ed[i],tem_end ) 2 反之 这个

uva 10029 HASH + DP

题意: 给一个字典,里面有好多单词。单词可以由增加、删除、变换,变成另一个单词,问能变换的最长单词长度。 解析: HASH+dp 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

POJ 1198 双广+Hash

此题采用双广可从bfs的O(16^8)降低到O(2*16^4); 坐标0-7,刚好3位存储, 需要24位存储四个坐标(x,y),也就是[0,2^24) 。 很好的一题。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import