В чем ошибка при умножении на 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 ;
}
→ Ссылка