随着zk的兴起,出现了一大批zk友好且面向算术化(Arithmetization-Oriented)的哈希函数,如MiMC-Hash, Rescue–Prime, Poseidon等等,本文要介绍的Anemoi是今年新出的一种zk友好且面向算术化的哈希函数,与其他哈希函数相比,Anemoi具有以下特点:
Flystel结构是butterfly和Feistel的结合:butterfly + Feistel = Flystel
图(a)是开放的Flystel结构,图(b)是封闭的Flystel结构,图(a)通过一次旋转即可得到图(b),这样做的好处是消除了逆运算。
在实际运算中Flystel一般定义在 F q F_q Fq中,并且 Q r ( X ) = β x 2 + γ Q_r(X) = \beta x^2 +\gamma Qr(X)=βx2+γ, Q δ ( X ) = β x 2 + δ Q_{\delta}(X) = \beta x^2 +\delta Qδ(X)=βx2+δ, E ( X ) = X α E(X) = X^{\alpha} E(X)=Xα
所以对于封闭的Flystel结构,我们有下面等式成立
u = ( y − v ) α + β v 2 + δ x = ( y − v ) α + β y 2 + γ u = (y-v)^{\alpha} + \beta v^2 + \delta \\ x = (y-v)^{\alpha} + \beta y^2 + \gamma u=(y−v)α+βv2+δx=(y−v)α+βy2+γ
Anemoi每轮主要由 constant addition 、linear layer M和 S-box layer这三步构成:
如果 l l l很小,那么域则需要很大,一般用于基于配对的证明系统,如groth16,plonk等
如果 l l l很大,则域不需要很大,一般用于基于FRI的证明系统
我们知道
u = ( y − v ) α + β v 2 + δ x = ( y − v ) α + β y 2 + γ u = (y-v)^{\alpha} + \beta v^2 + \delta \\ x = (y-v)^{\alpha} + \beta y^2 + \gamma u=(y−v)α+βv2+δx=(y−v)α+βy2+γ
一般 β \beta β取生成元 g g g, γ \gamma γ取零, δ \delta δ取 g − 1 g^{-1} g−1,则
u = ( y − v ) α + g v 2 + g − 1 x = ( y − v ) α + g y 2 u = (y-v)^{\alpha} + g v^2 + g^{-1} \\ x = (y-v)^{\alpha} + g y^2 u=(y−v)α+gv2+g−1x=(y−v)α+gy2
一式减二式,可得
u − x = g ( v 2 − y 2 ) = > u = x + g v 2 − g y 2 + g − 1 u -x = g(v^2 -y^2) => u = x + gv^2 - gy^2 + g ^{-1} u−x=g(v2−y2)=>u=x+gv2−gy2+g−1
以及由二式,可得
x − g y 2 = ( y − v ) α = > v = y − ( x − g y 2 ) α − 1 x-gy^2 = (y-v)^{\alpha} => v = y -(x-gy^2)^{\alpha^{-1}} x−gy2=(y−v)α=>v=y−(x−gy2)α−1
从而可得输出 u , v u,v u,v,与上图中的S-box输出对应
v = y − ( x − g y 2 ) α − 1 u = x + g v 2 − g y 2 + g − 1 v = y -(x-gy^2)^{\alpha^{-1}} \\ u = x + gv^2 - gy^2 + g ^{-1} v=y−(x−gy2)α−1u=x+gv2−gy2+g−1
当 l ∈ { 1 , 2 , 3 , 4 } l \in \{1,2,3,4\} l∈{1,2,3,4}时,我们可以使用矩阵 M x l M_x^l Mxl来表达,如
M x 1 = M x 2 = [ 1 g g g 2 + 1 ] M_x^1=M_x^2 = \left[ \begin{array}{cc|r} 1 & g\\g & g^2+1 \end{array} \right] Mx1=Mx2=[1ggg2+1]
输出等于
[ x 0 , x 1 ] ⋅ M x 2 [x_0,x_1] \cdot M_x^2 [x0,x1]⋅Mx2
令H是Flystel结构,则
S ( X , Y ) = ( H ( x o , y o ) , . . . , H ( x l − 1 , y l − 1 ) ) S(X,Y) = (H(x_o,y_o),...,H(x_{l-1},y_{l-1})) S(X,Y)=(H(xo,yo),...,H(xl−1,yl−1))
我们使用封闭的Flystel结构,得到如下S-Box验证等式
( y − v ) α + β v 2 + δ − u = 0 ( y − v ) α + β y 2 + γ − x = 0 (y-v)^{\alpha} + \beta v^2 + \delta -u = 0\\ (y-v)^{\alpha} + \beta y^2 + \gamma -x = 0 (y−v)α+βv2+δ−u=0(y−v)α+βy2+γ−x=0