中间的AES加密如何在Go运行时工作?

时间:2018-04-22 11:14:30

标签: go encryption cryptography runtime aes

我了解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中定义的预先计算的数组。

有人可以向我解释这些阵列是如何预先计算的吗?非常感谢你的帮助。