版权归原作者所有,如有侵权,请联系我们

[科普中国]-海绵函数

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

海绵函数,在密码学,海绵函数(sponge function)或者海绵建构(sponge construction)是一种算法。它使用有限的状态,接收任何长度的输入位元流,然后可以满足任何长度的输出。海绵函数可以在理论上面或者实做上面应用,用来架构或者实做密码学的原始函数,像是加密杂凑函式(cryptographic hash,参考杂凑函数)等等。

操作海绵功能操作如下:

1、状态S初始化为零

2、填充输入字符串。这意味着使用填充函数P将输入转换为r位块。

3、对于填充输入的每个r位块B:

a.R被R XOR B替换(使用按位异或)

b.S被f(S)取代

这个过程“吸收”(在海绵比喻中)填充输入字符串的所有块。

海绵功能输出可以生成(“挤出”),如下所示:

1、输出状态存储器的R部分。

2、重复直到输出足够的位:

a.S被f(S)取代。

b.输出状态存储器的R部分

如果剩余少于r位要输出,则R将被截断(仅输出R的一部分)。

另一个比喻将状态记忆描述为“熵池”,输入“涌入”池中,转换函数称为“搅动熵池”。

注意,输入位永远不会异或进入状态存储器的C部分,也不会直接输出任何C位。输入改变C的程度完全取决于变换函数f。在哈希应用中,对碰撞或前像攻击的抵抗力取决于C,并且其大小(“容量”c)通常是所需阻力水平的两倍。

结构海绵函数是由三个部份组成:

1.一个内存状态S,包含b个位元

2.一个能置换或者转换内存状态,固定大小的转换函式f

3.一个填充函式(padding function)P

内存状态会分成两个区块,R(大小为r位元)与C(大小为b - r位元)。这里的参数r又叫做转换率(bitrate),而c叫做容量(capacity)。

填充函式会在输入里面增加足够的长度,让输入的位元流长度变成r的整数倍。因此填充过后的输入可以被切成长度为r的数个分段。

然后,海绵函数运作如下:

1.S先初始化为零

2.输入经过填充函式处理

3.填充后输入的前面r个位元会与R进行XOR运算

4.S经过函式f转换成f(S)

5.如果填充后输入还有剩余,下一r位元的分段与R进行XOR运算

6.S转换成f(S)

这过程一直重复到所有的输入都用完为止(在海棉的譬喻里面,被函数"吸收"了)。

海绵函数可以依照如下的过程输出("挤出"内容):

1.此时R里面的资料是输出的前面r个位元

2.如果需要更多输出,先把S转换成f(S)

3.此时R里面的资料是输出的下面r个位元

这过程会重复到满足输出所需要的长度为止。

这里值得注意的地方是,输入绝对不会与C这部份的内存作XOR运算,而且C这一部份内存也不会直接被输出。C这一部份的内存仅仅只和转换函式f相关。在杂凑里面,防止撞击攻击(Collision attack)或者原像攻击(preimage attack)是依靠C这段内存作到的。一般实做上C的大小会是所希望防止等级的两倍。

应用海绵函数可以在理论上面或者实做上面应用。在密码分析理论上,随机海绵函数(random sponge function)是一个转换函式f为随机置换的海绵函数。随机海绵函数比起经常使用的随机预言(有关预言的部份请参考预言机)满足更多加密基元(cryptographic primitives)的限制,像是有限大小的内存状态1。

海绵函数也可以用来建造实际的加密基元。例如,Keccak杂凑函数就是以海绵函数的方式建立的。Keccak杂凑函数使用1600位元大的版本被国家标准技术研究所(NIST)在SHA-3竞赛之中选为赢家。Keccak算法的特点在于作者所开发复杂、多次的置换函数。

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所