În primul rând, codul tău este aproape corect pentru înmulțire în $GF(2^{32})$ cu conditia ca $p$ reprezintă coeficienții de biți pentru monomii $x^{31},x^{30},\ldots,x^2,x,1$ într-un polinom ireductibil de gradul 32. Există o problemă cu stâlpul de gard care $i$ ar trebui să ruleze de la 31 la 0.
Acum, modul de multiplicare fără transport $2^k$ nu corespunde înmulțirii într-un câmp ci în schimb inelului $\mathbb Z[x]/x^k\mathbb Z[x]$. Acesta nu este un obiect matematic bun pentru a face criptografia. De exemplu, bitul scăzut al ieșirii este doar o funcție a biților inferiori ai intrărilor. Prin comparație înmulțirea în $GF(2^k)$ toți biții de ieșire sunt o funcție a tuturor biților de intrare. O altă proprietate a înmulțirii câmpului este că este inversabilă pentru intrări diferite de zero, dar în inelul nostru funcția nu este inversabilă pentru intrări fără setul de biți scăzut.
Dacă luăm în considerare toate perechile de intrări, atunci ieșirile nu sunt distribuite uniform. De exemplu, doar 25% din intrări vor produce o ieșire cu bitul scăzut setat. Dacă reparăm una dintre intrări și ne asigurăm că bitul său scăzut este setat, atunci ieșirile sunt distribuite uniform, dar biții mici de ieșire vor depinde doar de biții de intrare mici. Pe scurt, nu este o alternativă bună.
În ceea ce privește întrebarea dvs. anterioară, există câteva posibile accelerări. Dacă precalculați codul pentru $c$ luând valori 1<<32, 1<<33,..., 1<<63 și stocați aceste valori ca $x[0],\ldots,x[31]$ atunci codul poate fi înlocuit cu
pentru (int i = 31; i-- >= 0; )
{
dacă (c & (1L << (i + 32)))
c ^= x[i];
}
c %= 1<<32;
Dacă doriți ceva și mai rapid, este posibil să doriți să priviți modalități alternative de reprezentare a câmpurilor, cum ar fi baze normale optime sau logaritmi Zech