1、内容简介
略
 5-可以交流、咨询、答疑
2、内容说明
 
 Spongent 是一种轻量级 Hash 算法,其原理与“海绵”类似,分为“吸收”  
 
 
 和“榨取”两个阶段,所以又可以称之为“海绵结构”算法。  
 
 
 Hash 函数之所以有广泛的应用,是因为它具有以下几个性质:  
 
 
 (1)单向性,对于任意的 Hash 码 h,找到能使 H(x)=h 成立的 x 在计算上是  
 
 
 不可行的。  
 
 
 (2)抗弱碰撞性,对于任意的 x,找到能使 H(x)=H(y)成立的 y 在计算上是不  
 
 
 可行的。  
 
 
 (3)抗强碰撞性,对于任意指定的 Hash 算法,想找到不同的输入得到相同的  
 
 
 输出是不可行的。  
 
 
 下面简单的介绍一下 Spongent 算法的原理。  
 
 
 Spongent 算法是 Bogdanov 等人在 CHES 2011 上提出的轻量级 Hash 函数。  
 
 
 Spongent 算法用 Spongent-n/c/r 表示,是由迭代函数 Spongent- 
 ߨ  
 ܾ  
 、比特率 r、  
 
 
 容量 c、轮数 R 等组成的海绵结构的算法。给定有限数量的输入位,它将产  
 
 
 生一个 n 位的哈希值。在 Spongent- 
 ߨ  
 ܾ  
 中,b 作为置换位的宽度,即 state 结  
 
 
 构的容量,b=c+r。Spongent 算法的加密步骤如图 1 所示 
 
 
 
  从图中可以看出 Spongent 算法的“吸收”和“榨取”过程。具体加密步骤  
 
 
  
  及各模块内部结构及运算方法如下:  
 
 
  
  1、初始化阶段:  
 
 
  
  该输入数据将由一个单一的位 1 填充,后跟必要数量的 0 位,位数  
 
 
  
  直 到 达 到 r 位 的 倍 数 ( 例 如 , 如 果 r=8, 则 1 位 消 息 “0”将 转 换 为  
 
 
  
  “01000000”)。然后将其切成 r 位的块。简单举例来说,如果 r=8,而  
 
 
  
  有一个输入数据是 10 位,那么在此数位最右边补上一个单一的 1 后,  
 
 
  
  用 0 来将其填充至 r=8 的最小倍数数位 16。因为 r=8,所以位数为 16  
 
 
  
  的数据不能一次性输入(为什么不能一次性输入后面详谈),应该分为  
 
 
  
  数据块依次输入。因为是 8 的整倍数,所以将其分为 p=16/8=2 数据块  
 
 
  
  来进行输入。其他位数的数据同样是这种处理方法。简单来说就是,令  
 
 
  
  |m|为经过填充处理的数据 m 的长度,则 p=|m|/r。  
 
 
  
  2、吸收阶段:  
 
 
  
  如图 1 所示,比特率 r 和容量 c 初始数据都为 0,图 1 中所示的 
  ݉  
  ͳ  
  、 
  ݉  
  ʹ  
  、 
  ǥ  
  、  
 
 
  
  ݉  
  ݅  
  为初始化阶段中对处理后的输入数据 m 分块处理后的结果,例如初始化阶段所  
 
 
  
  举例子经过填充处理位数为 16 的数据经过分块处理后,分为了两个数据块,那  
 
 
  
  么位数为 16 的数据在输入阶段就对应着 
  ݉  
  ͳ  
  、 
  ݉  
  ʹ  
  两段输入,以此类推。如图 1  
 
 
  
  所示,很清楚的可以知道,被分块后 
  ݉  
  ͳ  
  首先与状态值(state)的前 r 位的值进  
 
 
  
  行异或运算(state 的位数为 b,而 b=r+c,此处前 r 位的值为 0,前面举例 r=8  
 
 
  
  是指 r 的位数为 8,而 r 的初值都是 0,如果说 r=8,就是指 r 为 8 位的全 0 数  
 
 
  
  据,即“00000000”),而后 c 位的值不与 
  ݉  
  ͳ  
  进行异或运算,如图 1 所示,经过  
 
 
  
  异或运算后 b 位的新状态值(state)被送入 
  ߨ  
  ܾ  
  中进行运算( 
  ߨ  
  ܾ  
  中的运算很复杂, 
  后面进行讲解),得出运算过后的新 b 位状态值,同样,重复前一个步骤,因为  
 
 
  
  的分得的数据块的位数相同都是 r 位,再将新的状态值的前 r 位与数据块第二块  
 
 
  
  ݉  
  ʹ  
  进行异或运算,后 c 位仍然不参加运算,得到的新状态值后再送入下一个 
  ߨ  
  ܾ  
 
 
  
  中(注:在 n/c/r 都相同的一个 Spongent 算法中,每一个 
  ߨ  
  ܾ  
  中的运算都是不一  
 
 
  
  样的,并不是相同的,不过他们的运算轮数都是一样的,后面会在对 Spongent- 
  ߨ  
  ܾ  
 
 
  
  的介绍中提到),以此类推,直到将 m 所分的块全部都进行输入完为止,即若分  
 
 
  
  块为 
  ݉  
  ͳ  
  、 
  ݉  
  ʹ  
  、 
  ǥ  
  、 
  ݉  
  ݅  
  ,则一直到 
  ݉  
  ݅  
  输入并进行运算后,吸收阶段才会结束,如  
 
 
  
  图 1 所示。  
 
 
  
  3、榨取阶段:  
 
 
  
  如图 1 所示,榨取阶段的原理其实和吸收阶段的原理近似相同,对数据进行  
 
 
  
  置换的函数依旧是 Spongent- 
  ߨ  
  ܾ  
  ,只不过没有吸收阶段的异或过程,榨取阶段的  
 
 
  
  第一个输入为吸收阶段的最后一个置换函数 
  ߨ  
  ܾ  
  的输出,因为吸收与榨取阶段的置  
 
 
  
  换函数类型相同(内部运算不同),所以其输入输出都是 b 位的状态值,榨取阶段  
 
 
  
  每次 
  ߨ  
  ܾ  
  输出 b 位状态值,取其前 r 位作为输出 
  ݄  
  ݅  
  ,同时将此次置换函数输出的 b  
 
 
  
  位状态值作为下一个置换函数 
  ߨ  
  ܾ  
  的输入,以此类推。对于不同的 Spongent 算法  
 
 
  
  类型,榨取阶段输出 r 位的组数也不同,已知 Spongent-n/c/r 中的 n 为算法的  
 
 
  
  最终输出数据的位数,所以需要 j=|n|/|r|组置换函数的输出。例如,对于  
 
 
  
  Spongent-88/80/8 来说,r=8,n=88,则榨取阶段应该输出 j=|n|/|r|=88/8=11  
 
 
  
  个 r=8 比特的数据组再将每一次的输出 
  ݄  
  ͳ  
  、 
  ݄  
  ʹ  
  、 
  ǥ  
  、 
  ݄  
  ͳ ͳ  
  整合为 n=88 位的输出数  
 
 
  
  据,如图  
 
 
3、仿真分析

4、参考论文
略



















