Java或C数组中的乘法逆表GF(2 ^ 4)

时间:2014-11-03 02:46:55

标签: java encryption galois-field

我必须在 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试图找到一个已经写好的,但没有快乐。

动机/理性
我不必严格查看表格,但我不想添加一百行代码只是为了动态生成字段(这只是一个估计,但我怀疑我能不能做到这一点。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

但那是你到达那里的一个非常小的领域......

只有一种加密算法(我知道)使用 GF (2 4 )。该算法是圣克拉拉大学的Simplified-AES algorithm developed by Professor Edward Schaefer和他的几个学生。你应该研究那些材料并理解算法。

无论如何,你还需要一张反转表?

你可能已经注意到你在上花费的时间了解该算法从未包含分词。 所以你不需要反转。算法进行乘法运算的唯一地方是mixColums函数,你已经有了一个乘法表。 mixColumns的反转不会分割或需要反转,它只是使用不同的2x2矩阵。

如果你确实需要划分你不能使用乘法表来找到逆
......这个反转表会是什么样子?它会是16x16吗?

现在下车,然后回去学习。