В чем ошибка при умножении на 3 в полях галуа 2^8
Я написал функцию для умножения на 3 в полях галуа 2^8
uint8_t gmull(uint8_t value)
{
uint8_t byte = value;
for(int i = 0;i < 2;i++)
{
byte <<= 1;
if(byte >= 0x80) { byte ^= 0x1b; }
}
return byte;
}
При вызове функции gmull(0xd4) возвращает 102(если в десятичной системе) но если полагаться на данную функцию(взято с гитхаба)
unsigned char gmul(unsigned char a, unsigned char b) {
unsigned char p = 0;
unsigned char counter;
for(counter = 0; counter < 8; counter++) {
unsigned char hi_bit_set;
if((b & 1) == 1)
p ^= a;
hi_bit_set = (a & 0x80);
a <<= 1;
if(hi_bit_set == 0x80)
a ^= 0x1b;
b >>= 1;
}
return p;
}
Должно возвращать 103 а не 102 так в чем моя ошибка?
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
byte <<= 1;
if(byte >= 0x80) { byte ^= 0x1b; }
условие if(byte >= 0x80) у вас идёт после изменения переменной byte <<= 1;. А в оригинале спрашивается прошлое значение :
hi_bit_set = (a & 0x80);
a <<= 1;
if(hi_bit_set == 0x80)
a ^= 0x1b;
Тяжело найти минимальное исправление в вашей функции. Написал свою :
uint8_t gmull(uint8_t value) {
uint8_t b = ( value << 1 ) ^ value ;
if ( value >= 0x80 )
return (b ^ 0x1b);
return b ;
}