Во-первых, ваш код почти верен для умножения в $GF(2^{32})$ при условии, что $р$ представляет битовые коэффициенты для мономов $х^{31},х^{30},\ldots,х^2,х,1$ в неприводимом многочлене степени 32. Есть проблема с ограждением, которое $я$ должен работать от 31 до 0.
Теперь мод умножения без переноски $2^к$ соответствует не умножению в поле, а кольцу $\mathbb Z[x]/x^k\mathbb Z[x]$. Это не лучший математический объект для криптографии. Например, младший бит выходных данных является функцией только младших битов входных данных. Сравнительным умножением в $GF(2^k)$ все выходные биты являются функцией всех входных битов. Другое свойство умножения полей состоит в том, что оно обратимо для ненулевых входных данных, но в нашем кольце функция необратима для входных данных без установленного младшего бита.
Если рассматривать все пары входов, то выходы распределены неравномерно. Например, только 25% входных данных будут давать выходные данные с установленным младшим битом. Если мы зафиксируем один из входов и установим его младший бит, то выходы будут распределены равномерно, но младшие биты вывода будут зависеть только от младших битов входа. Короче не лучшая альтернатива.
Что касается вашего предыдущего вопроса, есть некоторые возможные ускорения. Если предварительно вычислить код для $с$ принимая значения 1<<32, 1<<33,..., 1<<63 и сохраняя эти значения как $x[0],\ldots,x[31]$ то код можно заменить на
для (int i = 31; i-- >= 0; )
{
если (с & (1L << (i + 32)))
с ^ = х[я];
}
с %= 1<<32;
Если вам нужно что-то еще более быстрое, вы можете рассмотреть альтернативные способы представления полей, такие как оптимальные нормальные базы или же Логарифмы Цеха