参考文献:
KECCAK−p[b,nr]KECCAK-p[b,n_r]KECCAK−p[b,nr] 置换函数,这里的 nrn_rnr 是轮数(round), 而 b∈{25,50,100,200,400,800,1600}b \in \{25,50,100,200,400,800,1600\}b∈{25,50,100,200,400,800,1600} 是宽度(width)
状态 state 是大小 5×5×w5 \times 5 \times w5×5×w 的三维数组,它的两维的子数组叫做 sheets, planes, slices,一维子数组叫做 rows, columns, lanes.
KECCAK−p[b,nr]KECCAK-p[b,n_r]KECCAK−p[b,nr] 包括 nrn_rnr 次迭代,每次迭代中对状态数组 AAA 依次执行 θ,ρ,π,χ,ι\theta,\rho,\pi,\chi,\iotaθ,ρ,π,χ,ι 变换,
Rnd(A,ir)=ι(χ(π(ρ(θ(A)))),ir)Rnd(A,i_r) = \iota(\chi(\pi(\rho(\theta(A)))),i_r) Rnd(A,ir)=ι(χ(π(ρ(θ(A)))),ir)
具体的各个变换本人没有探究,读者感兴趣可以自行查看 SHA-3 标准文档。
另外定义
KECCAK−f[b]=KECCAK−p[b,12+2l]KECCAK-f[b] = KECCAK-p[b,12+2l] KECCAK−f[b]=KECCAK−p[b,12+2l]
特别地,KECCAK−f[1600]=KECCAK−p[1600,24]KECCAK-f[1600] = KECCAK-p[1600,24]KECCAK−f[1600]=KECCAK−p[1600,24]
海绵结构(sponge construction)包括吸收(sbsorbing)和挤压(squeezing)两个步骤,定义为 SPONGE[f,pad,r](N,d)SPONGE[f,pad,r](N,d)SPONGE[f,pad,r](N,d),
如图所示,在吸收阶段,输入比特流 NNN 做填充后被分成 rrr 长的若干块,与链接变量异或后作为置换函数的输入;在挤压阶段,每次直接将链接变量作为输入,将输出的链接变量截取 rrr 比特作为一个输出块(block);最后,截取 ddd 比特的前缀作为最终的输出。
KECCAK 是一族 KECCAK−f[b]KECCAK-f[b]KECCAK−f[b] 置换下的海绵结构,填充规则使用 pad10∗1pad10^*1pad10∗1(即填充 1∥0⋯0∥11\|0\cdots0\|11∥0⋯0∥1 比特串)。它的 bbb 可以从 {25,50,100,200,400,800,1600}\{25,50,100,200,400,800,1600\}{25,50,100,200,400,800,1600} 中任意选择,如果设置 b=1600b=1600b=1600 那么有:
KECCAK[c](N,d)=SPONGE[KECCAK−p[1600,24],pad10∗1,1600−c](N,d)KECCAK[c](N,d) = SPONGE[KECCAK-p[1600,24],\,\, pad10^*1,\,\, 1600-c](N,d) KECCAK[c](N,d)=SPONGE[KECCAK−p[1600,24],pad10∗1,1600−c](N,d)
密码学哈希函数(cryptographic hash functions):SHA3-224
, SHA3-256
, SHA3-384
, SHA3-512
.
使用 KECCAK 函数,并设置 c=2dc=2dc=2d,再设置 N=M∥01N=M\|01N=M∥01(两比特后缀),
可扩展输出函数(extendable-output functions, XOF):SHAKE128
, SHAKE256
.
使用 KECCAK 函数,并设置 N=M∥1111N=M\|1111N=M∥1111(四比特后缀),
上一篇:Python父类方法重写
下一篇:带你手撕排序算法