问题中的矩阵用于反转 (1/x) 步骤。仿射变换是一个单独的步骤,通常涉及矩阵乘法,后跟 AES 算法指定的列异或。链接到 wiki 文章,注意 wiki 文章在顶部有最低有效位,而您引用的文章和其他文章在顶部有最高有效位。
https://en.wikipedia.org/wiki/Rijndael_S-box
回到这些矩阵是如何创建的,我找到了几篇文章,但它们不仅没有解释这些矩阵是如何创建的,而且还缺少关键信息,例如为 GF(2^) 选择的原始元素8) 基于
多项式 x^8 + x^4 + x^3 + x + 1 (0x11b),系数为 1 位,不可约,但不是原始的,因为它的原始元素不是 x (0x02)。
GF(2^8) 映射到 GF(((2^2)^2)^2)。从问题信息来看,GF(2^2) 使用 x^2 + x + 1(十六进制 7)和 1 位系数来生成一个 2 位字段,其中原始元素 x = 0x2。 GF((2^2)^2) 使用 x^2 + x + 2(十六进制 16)和来自 GF(2^2) 的 2 位系数来生成原始元素 x = 0x4 的 4 位字段。 GF(((2^2)^2)^2) 使用 x^2 + x + c (hex 11c) 和来自 GF((2^2)^2) 的 4 位系数来生成具有原始 x 的 8 位字段= 0x10。
对于 GF(2^8),有 128 个可能的原始元素:{0x03, 0x05, 0x06, ... , 0xff}。矩阵 δ 可用于识别为 GF(2^8) 选择了哪个原始元素,在本例中为 x^4 + x^3 + x^2 + x + 1 (hex 1f)。
矩阵 δ 的列对应于从 GF(2^8) 到 GF(((2^2)^2)^2) 逐位映射:第 1 列映射 0x80,第 2 列映射 0x40,.. .,第 7 列映射 0x02,第 8 列映射 0x01。这些列是 GF(((2^2)^2)^2) 中 0x10 的幂。例如第 7 列是 0x5f,即 GF(((2^2)^2)^2) 中的 0x10^0xa0。由于第 7 列用于映射 GF(2^8) 中的 0x02,这意味着 GF(2^8)log??(0x02) = 0xa0,并且选择的原始元素是 0x1f,因为 GF(2^8) log1f(0x02) = 0xa0。第6列是0x7c,即GF(((2^2)^2)^2)中的0x10^0x41,GF(2^8)log1f(0x04) = 0x41。
下表显示了所有 8 列的数据。
GF(2^8) log1f(0x80) = 0x64, GF(((2^2)^2)^2) 0x10^0x64 = 0xfc (1st column of matrix)
GF(2^8) log1f(0x40) = 0xc3, GF(((2^2)^2)^2) 0x10^0xc3 = 0x4b (2nd column of matrix)
GF(2^8) log1f(0x20) = 0x23, GF(((2^2)^2)^2) 0x10^0x23 = 0xb0 (3rd column of matrix)
GF(2^8) log1f(0x10) = 0x82, GF(((2^2)^2)^2) 0x10^0x82 = 0x46 (4th column of matrix)
GF(2^8) log1f(0x08) = 0xe1, GF(((2^2)^2)^2) 0x10^0xe1 = 0x74 (5th column of matrix)
GF(2^8) log1f(0x04) = 0x41, GF(((2^2)^2)^2) 0x10^0x41 = 0x7c (6th column of matrix)
GF(2^8) log1f(0x02) = 0xa0, GF(((2^2)^2)^2) 0x10^0xa0 = 0x5f (7th column of matrix)
GF(2^8) log1f(0x01) = 0x00, GF(((2^2)^2)^2) 0x10^0x00 = 0x01 (8th column of matrix)
逆映射矩阵可以使用相同的逻辑:
GF(((2^2)^2)^2) log10(0x80) = 0x67, GF(2^8) 0x1f^0x67 = 0x84 (1st column of matrix)
GF(((2^2)^2)^2) log10(0x40) = 0xbc, GF(2^8) 0x1f^0xbc = 0xf1 (2nd column of matrix)
GF(((2^2)^2)^2) log10(0x20) = 0xab, GF(2^8) 0x1f^0xab = 0xbb (3rd column of matrix)
GF(((2^2)^2)^2) log10(0x10) = 0x01, GF(2^8) 0x1f^0x01 = 0x1f (4th column of matrix)
GF(((2^2)^2)^2) log10(0x08) = 0x66, GF(2^8) 0x1f^0x66 = 0x0c (5th column of matrix)
GF(((2^2)^2)^2) log10(0x04) = 0xbb, GF(2^8) 0x1f^0xbb = 0x5d (6th column of matrix)
GF(((2^2)^2)^2) log10(0x02) = 0xaa, GF(2^8) 0x1f^0xaa = 0xbc (7th column of matrix)
GF(((2^2)^2)^2) log10(0x01) = 0x00, GF(2^8) 0x1f^0x00 = 0x01 (8th column of matrix)
请注意,在问题图像中,逆矩阵第 1 列和第 6 列的最低有效位被翻转。下面链接的 pdf 文件具有正确的矩阵。
https://github.com/bpdegnan/aes/blob/master/aes-sbox/documentation/aessbox.pdf
我创建了一个小型 pdf 文件,解释了第 4 页矩阵 (8) 和第 5 页矩阵 (10) 中看到的映射矩阵是如何生成的以及它们背后的逻辑。
https://github.com/jeffareid/finite-field/blob/master/Composite%20Field%20Mapping%20Example.pdf
为了使子字段(即复合字段数学)发挥作用,有两个主要要求。用 map() 表示从 GF(2^8) 到 GF(((2^2)^2)^2) 的映射,然后在 GF(((2^2)^2)^2)
map(a + b) = map(a) + map(b) // addition (xor) is isomorphic
map(a · b) = map(a) · map(b) // multiplication is isomorphic
这也可以重述为:用α表示GF(2^8)的原始元素,用β表示GF(((2^2)^2)^2)的原始元素。
if α^i + α^j = α^k, then β^i + β^j = β^k // addition (xor) is isomporhic
if α^i · α^j = α^k, then β^i · β^j = β^k // multiplication is isomorphic
通常 β = 100002,对 3 个常数 α、φ、δ 进行蛮力搜索,这会产生兼容的映射并最小化门数,其中 α 是 GF 的原始元素(2^8),φ 是 GF((2^2)^2) = x^2 + x + φ 的常数项,δ 是 GF(((2^2)^2)^ 的常数项2) = x^2 + x + δ。在这种情况下,α = 111112,φ = 102,δ = 11002。