-1

尝试在组合电路中实现 AES Sbox 和 InSbox。对于 Sbox,这里完成了两个操作,即乘法逆和仿射变换。对于仿射变换,使用同构变换将有限域转换为复合域,我不知道这是如何完成的。需要帮助从提到的不可约多项式 p(x) 中获取图像中显示的矩阵增量(附有问题)。

进行同构函数变换的论文的参考。

4

1 回答 1

2

问题中的矩阵用于反转(1/x)步骤。仿射变换是一个单独的步骤,通常涉及矩阵乘法,后跟 AES 算法指定的列异或。链接到 wiki 文章,请注意 wiki 文章在顶部具有最低有效位,而您引用的文章和其他文章在顶部具有最高有效位。

https://en.wikipedia.org/wiki/Rijndael_S-box

回到如何创建这些矩阵,我找到了几篇文章,但它们不仅没有解释这些矩阵是如何创建的,而且还缺少关键信息,例如为基于 GF(2^8) 选择的原始元素在具有 1 位系数的多项式 x^8 + x^4 + x^3 + x + 1 (0x11b) 上,这是不可约的,但不是原始的,因为它的原始元素不是 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

通常 β = 10000 2,并且对 3 个常数 α、φ、δ 进行强力搜索,这会导致兼容的映射和最小化门数,其中 α 是 GF(2^8) 的原始元素,φ 是常数GF((2^2)^2) = x^2 + x + φ 的项,δ 是 GF(((2^2)^2)^2) = x^2 + x + δ 的常数项. 在这种情况下,α = 11111 2,φ = 10 2,δ = 1100 2

于 2019-12-19T12:49:54.213 回答