私は 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*3
とtable_3[x]
、x
HEX から DECIMAL に変換されます。