Puncte:2

Înmulțire fără transfer față de înmulțire în $GF(2^k)$

drapel tf
Tom

Am implementat multiplicarea fără transport folosind setul de instrucțiuni CLMUL. Acest lucru este la fel de rapid cu înmulțirea modulo simplă. Dar calcularea modului rezultat al unui polinom este încă foarte lentă. O fac asa:

pentru (unsigned int i = 32; i-- > 0; )
{
    dacă (c & (1L << (i + 32)))
    {
        c ^= 1L << (i + 32);
        c ^= (uint64_t)p << i;
    }
}

Unde c este un produs fără transport pe 64 de biți și p este un polinom ireductibil de 32 de biți. Nu sunt sigur dacă acel cod este corect. Putem face asta mai repede?

Dacă am dreptate că mai trebuie să facem această procedură destul de costisitoare după calcularea produsului, atunci am început să mă întreb dacă ar fi rezonabil să facem doar multiplicarea fără transport, doar cu mod $2^k$. Are modul de multiplicare fără transport $2^k$ în sine are, de asemenea, avantaje similare ca polinomul mod de multiplicare fără transport?

Ar putea fi timp constant, dar este distribuit uniform? În general, multiplicarea fără transport este o alternativă rezonabilă la multiplicarea în $GF(2^k)$?

kelalaka avatar
drapel in
Ai nevoie de securitate pe canalul lateral?
Tom avatar
drapel tf
Tom
@kelalaka Nu sunt sigur. Lucrez la niște PRNG bazate pe înmulțire. Ca o alternativă pentru multiplicarea mod 2^n, produsul fără transport pare a fi suficient de bun, mai ales că trunchiez sau amestec biți mici. Dar acest PRNG are potențial de criptare, deoarece funcționează ca mapare aleatoare neinversibilă, putând fi parametrizat cu un spațiu imens de chei pentru fluxuri independente. În acest caz, este mai bine dacă este rezistent la canalele laterale.
kelalaka avatar
drapel in
Scopul tău nu este complet clar. Există o mulțime de metode de a realiza. Primul truc este să selectați [polinom ireductibil cu greutate mică ($p$)](https://www.hpl.hp.com/techreports/98/HPL-98-135.pdf) așa cum s-a discutat [aici](https:/ /crypto.stackexchange.com/a/77958/18298)
Puncte:2
drapel ru

Î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

Tom avatar
drapel tf
Tom
Da, p reprezintă coeficienții de biți pentru monomii, așa cum ați scris. Deci, în acest caz, este corect, nu?
Tom avatar
drapel tf
Tom
Apropo, am citit despre algoritmul Gueron și Kounavis, care a introdus un mod eficient folosind pclmulqdq, pentru reducerea modului pe 128 de biți în GCM: https://www.sciencedirect.com/science/article/abs/pii/S002001901000092X.Și acum îmi este mai clar - înmulțirea GF, mai ales fără pclmulqdq este scumpă în comparație cu înmulțirea normală. Chiar și cu pclmulqdq este costisitor, necesită totuși, de exemplu, 32 de iterații pentru doar polinomul mod în cazul numerelor de 32 de biți. De aceea, folosim câteva trucuri pentru a-l face mai rapid, ca în algoritmul Gueron și Kounavis, cu polinom special GF(2^128).

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.