2

私は C# で AES を実装していますが、ある時点 (MixColumns 関数) で、GF(2^8) 有限体で 2 バイトを乗算する必要があります。

したがって、次の 3 つのオプションがあります。

  • dotNet が持っているデフォルトの関数を使用します (そのようなものはありますか?)
  • それを行うカスタム関数を書く
  • ルックアップ テーブルを使用する

カスタム関数については、C# 用に書き直そうとした C コードの一部を見つけましたが、機能しません (間違った結果が得られます)。(*)

元の C コード ( source ) は次のとおりです。

/* Multiply two numbers in the GF(2^8) finite field defined 
 * by the polynomial x^8 + x^4 + x^3 + x + 1 */
uint8_t gmul(uint8_t a, uint8_t b) {
        uint8_t p = 0;
        uint8_t counter;
        uint8_t hi_bit_set;
        for (counter = 0; counter < 8; counter++) {
                if (b & 1) 
                        p ^= a;
                hi_bit_set = (a & 0x80);
                a <<= 1;
                if (hi_bit_set) 
                        a ^= 0x1b; /* x^8 + x^4 + x^3 + x + 1 */
                b >>= 1;
        }
        return p;
}

そして、これは私が書き直したものです:

public Byte GMul(Byte a, Byte b) { // Galois Field (256) Multiplication
   Byte p = 0;
   Byte counter;
   Byte hi_bit_set;
   for (counter = 0; counter < 8; counter++) {
      if ((b & 1) != 0) {
         p ^= a;
      }
      hi_bit_set = (Byte) (a & 0x80);
      a <<= 1;
      if (hi_bit_set != 0) {
         a ^= 0x1b; /* x^8 + x^4 + x^3 + x + 1 */
      }
      b >>= 1;
   }
   return p;
}

また、いくつかのルックアップ テーブルを見つけました ここ、それは単純で優れたアプローチのように見えましたが、私はそれらを使用する方法をよく知りません。(**)

要するに、どのオプションを選択する必要があり、どのように機能させることができるかということです.これまでに書いたことがすべてであり、数学の知識を深く掘り下げたいとは思っていません.

アップデート:

*)その間、C# で書き直したコードが正しい答えを生成していることに気付きました。それは、検証時に失敗したため、私のせいでした。

**)テーブルは Byte[256] 配列として使用できます。たとえば、テーブル配列のインデックスとして使用するx*3table_3[x]xHEX から DECIMAL に変換されます。

4

1 に答える 1

4

GF(2) で x * 3 を乗算するには、x=table_3[x] にアクセスするだけです。

おそらく、対数アプローチを使用する 3 つのルックアップ テーブル メソッドが利用可能です。

通常の数値 a*b = 2^(log2(a)+log2(b)) と同様に、GF(2) でも同じことが起こりますが、浮動小数点や丸め誤差はありません。

于 2012-11-05T20:49:13.507 に答える