Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java或C数组中的乘法逆表GF(2^4)_Java_Encryption_Galois Field - Fatal编程技术网

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

Java或C数组中的乘法逆表GF(2^4),java,encryption,galois-field,Java,Encryption,Galois Field,我必须在GF(24)中写一个查找乘法逆的表格。我已经把乘法表写出来了,我不想再写了。这是我写的表格作为例子。我希望没有人再写这篇文章了。我觉得自己很愚蠢 GF(24)上的乘法表 // 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

我必须在GF(24)中写一个查找乘法逆的表格。我已经把乘法表写出来了,我不想再写了。这是我写的表格作为例子。我希望没有人再写这篇文章了。我觉得自己很愚蠢

GF(24)上的乘法表

// 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,试图找到一个已经写好的,但没有乐趣

动机/理性

严格来说,我不必进行表查找,但我不想添加100行代码来动态生成字段(这只是一个估计,但我怀疑我能用更少的时间完成)。

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

但这是一个相当小的领域… 只有一种加密算法(据我所知)使用GF(24)。该算法是圣克拉拉大学和他的几个学生的研究成果。你应该学习这些材料并理解算法

你到底需要一张什么样的反比表 你可能已经注意到,从你花在YouTube上研究的时间来看,该算法从未包含除法因此您不需要反转。算法执行乘法的唯一位置是在mixColums函数中,您已经有了一个乘法表。mixColumns的逆矩阵不需要除法或求逆,它只是使用不同的2x2矩阵

如果必须除法,难道不能用乘法表求逆吗?
…那么这张倒数表会是什么样子呢?会是16x16吗


现在,让我们开始学习吧。

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

一个元素x的逆元素是另一个元素y,使得x*y=1,相当于多个[x][y]=1。有时相反的情况并不存在。对于这个二进制操作,0的倒数不存在。在这种背景下,下面的代码仅使用您提供的乘法表来计算逆表

公共静态字节[]计算转换表(){
字节[]反向表=新字节[16];
inverseTable[0]=0;//0的倒数不存在。

对于(int x=1;x)这是一个更好的答案。很明显,当shakabra说他想要一个16x16矩阵时,他想要的不是一个反比表。谢谢你的回答。我在考虑了更多问题后写了几乎相同的函数(尽管我真的不需要反比)。祝所有这些人好运!
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;
}