参考文献:
- Bertoni G, Daemen J, Peeters M, et al. Keccak[C]//Advances in Cryptology–EUROCRYPT 2013: 32nd Annual International Conference on the Theory and Applications of Cryptographic Techniques, Athens, Greece, May 26-30, 2013. Proceedings 32. Springer Berlin Heidelberg, 2013: 313-314.
- Dworkin M J. SHA-3 standard: Permutation-based hash and extendable-output functions[J]. 2015.
文章目录
- 置换函数
- 海绵结构
- Hash & XOF
2012年10月2日,Keccak 被选为 NIST(National Institute of Standards and Technology)散列函数竞赛的胜利者。SHA-3 并不是要取代 SHA-2,因为 SHA-2 并没有出现明显的弱点。由于对 MD5 和 SHA-1 出现成功的破解,NIST 感觉需要一个与之前算法不同的、可替换的加密散列算法,也就是 SHA-3。
置换函数
K E C C A K − p [ b , n r ] KECCAK-p[b,n_r] KECCAK−p[b,nr] 置换函数,这里的 n r n_r nr 是轮数(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 × w 5 \times 5 \times w 5×5×w 的三维数组,它的两维的子数组叫做 sheets, planes, slices,一维子数组叫做 rows, columns, lanes.
K
E
C
C
A
K
−
p
[
b
,
n
r
]
KECCAK-p[b,n_r]
KECCAK−p[b,nr] 包括
n
r
n_r
nr 次迭代,每次迭代中对状态数组
A
A
A 依次执行
θ
,
ρ
,
π
,
χ
,
ι
\theta,\rho,\pi,\chi,\iota
θ,ρ,π,χ,ι 变换,
R
n
d
(
A
,
i
r
)
=
ι
(
χ
(
π
(
ρ
(
θ
(
A
)
)
)
)
,
i
r
)
Rnd(A,i_r) = \iota(\chi(\pi(\rho(\theta(A)))),i_r)
Rnd(A,ir)=ι(χ(π(ρ(θ(A)))),ir)
具体的各个变换本人没有探究,读者感兴趣可以自行查看 SHA-3 标准文档。
另外定义
K
E
C
C
A
K
−
f
[
b
]
=
K
E
C
C
A
K
−
p
[
b
,
12
+
2
l
]
KECCAK-f[b] = KECCAK-p[b,12+2l]
KECCAK−f[b]=KECCAK−p[b,12+2l]
特别地, K E C C A K − f [ 1600 ] = K E C C A K − p [ 1600 , 24 ] KECCAK-f[1600] = KECCAK-p[1600,24] KECCAK−f[1600]=KECCAK−p[1600,24]
海绵结构
海绵结构(sponge construction)包括吸收(sbsorbing)和挤压(squeezing)两个步骤,定义为 S P O N G E [ f , p a d , r ] ( N , d ) SPONGE[f,pad,r](N,d) SPONGE[f,pad,r](N,d),
- 固定长度的置换函数 f f f
- 比率(rate) r < b r < b r<b,而 c = b − r c = b-r c=b−r 叫做容量(capacity)
- 填充规则 p a d pad pad
- 输入的比特流 N N N
- 输出的比特长度 d d d
如图所示,在吸收阶段,输入比特流 N N N 做填充后被分成 r r r 长的若干块,与链接变量异或后作为置换函数的输入;在挤压阶段,每次直接将链接变量作为输入,将输出的链接变量截取 r r r 比特作为一个输出块(block);最后,截取 d d d 比特的前缀作为最终的输出。
KECCAK 是一族
K
E
C
C
A
K
−
f
[
b
]
KECCAK-f[b]
KECCAK−f[b] 置换下的海绵结构,填充规则使用
p
a
d
1
0
∗
1
pad10^*1
pad10∗1(即填充
1
∥
0
⋯
0
∥
1
1\|0\cdots0\|1
1∥0⋯0∥1 比特串)。它的
b
b
b 可以从
{
25
,
50
,
100
,
200
,
400
,
800
,
1600
}
\{25,50,100,200,400,800,1600\}
{25,50,100,200,400,800,1600} 中任意选择,如果设置
b
=
1600
b=1600
b=1600 那么有:
K
E
C
C
A
K
[
c
]
(
N
,
d
)
=
S
P
O
N
G
E
[
K
E
C
C
A
K
−
p
[
1600
,
24
]
,
p
a
d
1
0
∗
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)
Hash & XOF
密码学哈希函数(cryptographic hash functions):SHA3-224
, SHA3-256
, SHA3-384
, SHA3-512
.
使用 KECCAK 函数,并设置 c = 2 d c=2d c=2d,再设置 N = M ∥ 01 N=M\|01 N=M∥01(两比特后缀),
- SHA3-224 ( M ) = K E C C A K [ 448 ] ( M ∥ 01 , 224 ) \text{SHA3-224}(M) = KECCAK[448](M\|01,224) SHA3-224(M)=KECCAK[448](M∥01,224),摘要的长度为 224 224 224 比特
- SHA3-256 ( M ) = K E C C A K [ 512 ] ( M ∥ 01 , 256 ) \text{SHA3-256}(M) = KECCAK[512](M\|01,256) SHA3-256(M)=KECCAK[512](M∥01,256),摘要的长度为 256 256 256 比特
- SHA3-384 ( M ) = K E C C A K [ 768 ] ( M ∥ 01 , 384 ) \text{SHA3-384}(M) = KECCAK[768](M\|01,384) SHA3-384(M)=KECCAK[768](M∥01,384),摘要的长度为 384 384 384 比特
- SHA3-512 ( M ) = K E C C A K [ 1024 ] ( M ∥ 01 , 512 ) \text{SHA3-512}(M) = KECCAK[1024](M\|01,512) SHA3-512(M)=KECCAK[1024](M∥01,512),摘要的长度为 512 512 512 比特
可扩展输出函数(extendable-output functions, XOF):SHAKE128
, SHAKE256
.
使用 KECCAK 函数,并设置 N = M ∥ 1111 N=M\|1111 N=M∥1111(四比特后缀),
- SHAKE128 ( M , d ) = K E C C A K [ 256 ] ( M ∥ 1111 , d ) \text{SHAKE128}(M,d) = KECCAK[256](M\|1111,d) SHAKE128(M,d)=KECCAK[256](M∥1111,d),参数为 b = 1600 , c = 256 b=1600,c=256 b=1600,c=256,每个输出的 block 长度为 r = 1344 r=1344 r=1344 比特
- SHAKE256 ( M , d ) = K E C C A K [ 512 ] ( M ∥ 1111 , d ) \text{SHAKE256}(M,d) = KECCAK[512](M\|1111,d) SHAKE256(M,d)=KECCAK[512](M∥1111,d),参数为 b = 1600 , c = 512 b=1600,c=512 b=1600,c=512,每个输出的 block 长度为 r = 1088 r=1088 r=1088 比特