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を検索しましたが、喜びはありませんでした。

動機/合理性
テーブルのルックアップを厳密に行う必要はありませんが、その場でフィールドを生成するためだけに 100 行のコードを追加したくありません (これは単なる見積もりですが、できるとは思えません)より少ない時間でそれを行います)。

4

2 に答える 2

1

乗算表は二項演算 "*" を表します: x * y = z mulTable[x][y] == z の場合のみ

要素 x の逆要素は、x * y = 1、同等に mulTable[x][y] == 1 となる別の要素 y です。逆要素が存在しない場合もあります。この二項演算では、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 )を使用する (私が知っている) 暗号化アルゴリズムは 1 つだけです。そのアルゴリズムは、Santa Clara University のEdward Schaefer 教授と数人の学生によって開発された Simplified-AES アルゴリズムです。その資料を研究し、アルゴリズムを理解する必要があります。

とにかく、逆数の表が必要なのは一体何ですか!?

YouTubeで学習に費やした時間から、アルゴリズムに除算が含まれていないことに気付いたかもしれません。したがって、 inverses は必要ありません。アルゴリズムが乗算を行う唯一の場所は mixColums 関数であり、そのための乗算テーブルが既にあります。mixColumns の逆数は、別の 2x2 行列を使用するだけであるか、逆数を分割する必要はありません。

割り算をしなければならなかった場合、掛け算の表を使って逆数を見つけられませんか?
...では、この逆数の表はどのようになりますか? 16x16でしょうか?

SOを降りて、勉強に戻りましょう。

于 2014-11-03T07:26:31.473 に答える