我在C#中实现AES,并且在某些时候(MixColumns函数)我必须在GF(2 ^ 8)有限域上乘以两个字节。
所以,我有三个选择:
对于自定义函数,我找到了一段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;
}
我还找到了一些查找表here,这似乎是一种简单而精细的方法,但我真的不知道如何使用它们,尽管我有一种预感。 (**)
底线:我应该选择哪个选项,以及如何让它工作,鉴于我上面所写的内容是我到目前为止所做的全部内容,而且我并不是真的想深入了解数学知识。 / p>
更新
*)
同时我意识到我的C#重写代码产生了正确的答案,这只是我的错,因为当我验证它时我搞砸了。
**)
这些表可以用作Byte [256]数组,而且,x*3
的答案是table_3[x]
,x
是从HEX转换而来的当用作表数组的索引时为DECIMAL。
答案 0 :(得分:2)
为了在GF(2)中乘以x * 3,只需访问x = table_3 [x];
可能有一种使用对数方法的3种查找表方法。
正如常规数a * b = 2 ^(log2(a)+ log2(b))一样,GF(2)也是如此,但没有浮点或舍入误差。