我了解AES的实现如何在Go中工作,而我不了解https://github.com/golang/go/blob/master/src/crypto/aes/block.go中加密块时中间轮如何工作:
// Middle rounds shuffle using tables.
// Number of rounds is set by length of expanded key.
nr := len(xk)/4 - 2 // - 2: one above, one more below
k := 4
for r := 0; r < nr; r++ {
t0 = xk[k+0] ^ te0[uint8(s0>>24)] ^ te1[uint8(s1>>16)] ^ te2[uint8(s2>>8)] ^ te3[uint8(s3)]
t1 = xk[k+1] ^ te0[uint8(s1>>24)] ^ te1[uint8(s2>>16)] ^ te2[uint8(s3>>8)] ^ te3[uint8(s0)]
t2 = xk[k+2] ^ te0[uint8(s2>>24)] ^ te1[uint8(s3>>16)] ^ te2[uint8(s0>>8)] ^ te3[uint8(s1)]
t3 = xk[k+3] ^ te0[uint8(s3>>24)] ^ te1[uint8(s0>>16)] ^ te2[uint8(s1>>8)] ^ te3[uint8(s2)]
k += 4
s0, s1, s2, s3 = t0, t1, t2, t3
}
据我所知,这段代码执行了AES的SybButes,ShiftRows,MixColumns和AddRoundKey,但我不明白这段代码是如何通过使用它来实现的 “te0”,“te1”,“te2”,“te3”阵列。它是在https://github.com/golang/go/blob/master/src/crypto/aes/const.go中定义的预先计算的数组。
有人可以向我解释这些阵列是如何预先计算的吗?非常感谢你的帮助。