1

我必须写一个表格查找GF (2 4 ) 中的乘法逆。我已经写出了乘法表,我不期待再这样做了。这是我作为示例编写的表格。我希望没有人再写这个了。我觉得很愚蠢。

GF (2 4 )上的乘法表

// Multiplication table over Galois Field 2^4 
byte mulTable[][] = {
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0,   0,   0,   0},
        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf}, 
        {0, 2, 4, 6, 8, 0xa, 0xc, 0xe, 3, 1, 7, 5, 0xb, 9, 0xf, 0xd},
        {0, 3, 6, 5, 0xc, 0xf, 0xa, 9, 0xb, 8, 0xd, 0xe, 7, 4, 1, 2},
        {0, 4, 8, 0xc, 3, 7, 0xb, 0xf, 6, 2, 0xe, 0xa, 5, 1, 0xd, 9},
        {0, 5, 0xa, 0xf, 7, 2, 0xd, 8, 0xe, 0xb, 4, 1, 9, 0xc, 3, 6},
        {0, 6, 0xc, 0xa, 0xb, 0xd, 7, 1, 5, 3, 9, 0xf, 0xe, 8, 2, 4},
        {0, 7, 0xe, 9, 0xf, 8, 1, 6, 0xd, 0xa, 3, 4, 2, 5, 0xc, 0xb},
        {0, 8, 3, 0xb, 6, 0xe, 5, 0xd, 0xc, 4, 0xf, 7, 0xa, 2, 9, 1},
        {0, 9, 1, 8, 2, 0xb, 3, 0xa, 4, 0xd, 5, 0xc, 6, 0xf, 7, 0xe},
        {0, 0xa, 7, 0xd, 0xe, 4, 9, 3, 0xf, 5, 8, 2, 1, 0xb, 0xc, 6},
        {0, 0xb, 5, 0xe, 0xa, 1, 0xf, 4, 7, 0xc, 2, 9, 0xd, 6, 8, 3},
        {0, 0xc, 0xb, 7, 5, 9, 0xe, 2, 0xa, 6, 1, 0xd, 0xf, 3, 4, 8},
        {0, 0xd, 9, 4, 1, 0xc, 8, 5, 2, 0xf, 0xb, 6, 3, 0x3, 0xa, 7},
        {0, 0xe, 0xf, 1, 0xd, 3, 2, 0xc, 9, 7, 6, 8, 4, 0xa, 0xb, 5},
        {0, 0xf, 0xd, 2, 9, 6, 4, 0xb, 1, 0xe, 0xc, 3, 8, 7, 5, 0xa}
    };   

我不想再为倒数做那种事了!
有谁知道适合复制和粘贴的表(最好是 Java 或 C 16x16 数组)?我搜索了 github 试图找到一个已经写好的,但没有任何乐趣。

动机/理性
我不必严格地进行表格查找,但我不想添加一百行代码只是为了动态生成字段(这只是一个估计,但我怀疑我可以少做)。

4

2 回答 2

1

乘法表表示二元运算“*”:x * y = z 当且仅当 mulTable[x][y] == z

元素 x 的逆元素是另一个元素 y,使得 x * y = 1,等效于 mulTable[x][y] == 1。有时逆元素不存在。对于这个二元运算,不存在 0 的倒数。在此背景下,以下代码仅使用您提供的乘法表计算逆表。

public static byte[] computeInverseTable() {
    byte [] inverseTable = new byte[16];
    inverseTable[0] = 0; // the inverse of 0 doesn't exist.

    for (int x = 1; x<16; x++) {
        for (int y = 1; y<16; y++) {
            if (mulTable[x][y] == 1) {
                inverseTable[x] = (byte) y;
                break;
            }
        }
    }
    return inverseTable;
}
于 2014-11-04T00:05:41.770 回答
0

这个问题表明你没有正确理解这个问题。在您的标签中,您提到了加密。

但那是一个很小的领域,你在那里......

只有一种加密算法(据我所知)使用GF(2 4)。该算法是由圣克拉拉大学的Edward Schaefer 教授和他的几个学生开发的 Simplified-AES 算法。您应该研究该材料并了解算法。

无论如何,你需要一张逆数表来做什么!?

您可能已经从您在 YouTube 上花费的时间研究该算法从不包括除法中注意到。所以你不需要 inverses。算法做乘法的唯一地方是在 mixColums 函数中,你已经有一个乘法表。mixColumns 的倒数不需要除法,也不需要倒数,它只是使用不同的 2x2 矩阵。

如果你必须除法,你不能使用乘法表来求逆吗?
......这个倒数表会是什么样子?会是 16x16 吗?

现在下车,回去学习。

于 2014-11-03T07:26:31.473 回答