Puncte:1

Parametrii de compensare în BLAKE2b

drapel in

În cursul meu despre criptografie, am început să ne uităm la funcțiile hash.Ca teme, a trebuit să alegem o funcție hash modernă și să o descriem în clasă. Am ales BLAKE2b, pe care îl înțeleg bine când este explicat în cuvinte, dar implementarea oficială ridică întrebări.

static void G(int roundNum, int i, int a, int b, int c, int d)
    {
        int p = (roundNum << 4) + 2 * i;
        int p0 = ÎnlocuieșteConstante[p];
        int p1 = ÎnlocuieșteConstante[p + 1];

        șir s = @"// G(r, i, a, b, c, d)
            a = a + b + m[" + p0 + @"];
            d ^= a;
            d = " + Rotire la dreapta ("d", 32) + @";
            c = c + d;
            b ^= c;
            b = " + Rotire la dreapta ("b", 24) + @";
            a = a + b + m[" + p1 + @"];
            d ^= a;
            d = " + Rotire la dreapta ("d", 16) + @";
            c = c + d;
            b ^= c;
            b = " + Rotire la dreapta ("b", 63) + @";";
        s = s.Înlocuiește ("a", "v" + a);
        s = s.Înlocuiește("b", "v" + b);
        s = s.Înlocuiește("c", "v" + c);
        s = s.Înlocuiește ("d", "v" + d);
        s = s.Înlocuiește("r", roundNum.ToString());
        s = s.Replace("i", i.ToString());
        s = s.Înlocuiește("\t", "");
        Console.WriteLine(s);
        Console.WriteLine();
    }

Funcția de bază unică G, ea apelează RotateRight de patru ori conform intenției.

șir static RotateRight (nume șir, int offset)
    {
        returnează "((" + nume + " >>" + offset + ")|(" + nume + " << (64-" + offset + ")))";
    }

Nu înțeleg de ce Rotire preia parametrii de offset de 32, 24, 16, 63 când sunt necesari 16, 12, 8, 7, așa cum se arată mai jos: blake2b, ilustrare a algoritmului De asemenea, despre această schemă, ce să faci $Сsigma_r(2i+1)$ și $Msigma_r(2i)$ Rău?

Sursele mele:

Ilustrație de pe Wikipedia

Implementare oficială C#

soul king avatar
drapel in
au adăugat resurse la postare
fgrieu avatar
drapel ng
@Morrolan: Recunosc [aceasta](https://github.com/BLAKE2/BLAKE2/blob/master/csharp/Blake2Sharp/Blake2BCore-Simple.cs#L26-L42) ca C# standard. Dar sunt în pierdere cu `șirul s = @"`partea codului întrebării. Oricum, asta e în afara subiectului.
Morrolan avatar
drapel ng
@fgrieu Ah, am omis mental asta. `@` este doar un zahăr sintactic pentru a-l face să trateze conținutul șirului text – adică fără semnificația specială care este de obicei atribuită caracterelor precum `\`. Privind modificarea șirului de mai jos, aceasta este probabil folosită pentru a produce implementarea nerulată în repo. (În afara subiectului, recunosc. Bine că nu există mod în jur)
Puncte:2
drapel ng

$G$ funcţie

Grafica la care faceți referire pare să descrie $G$ funcția lui BLAKE - și nu de BLAKE2b. Observați nu numai rotațiile diferite, ci și adăugarea constantelor $C_{\sigma_r(2i+1)}$ care nu mai sunt prezente în BLAKE2. Ambele se potrivesc cu definiția $G$ funcția BLAKE, conform documentație oficială.

Cât despre BLAKE2: Aveți grijă că există două versiuni de BLAKE2. BLAKE2s este pentru platforme cu hardware pe 8-32 de biți, BLAKE2b pentru platforme cu hardware pe 64 de biți.

BLAKE2s folosește rotații de 16, 12, 8 și, respectiv, 7 biți - dar fără adăugare constantă - așa că va arăta foarte asemănător (dar nu egal!) cu graficul tău.

BLAKE2b, pe de altă parte, utilizează rotații de 32, 24, 16 și respectiv 63 de biți, ceea ce implementează codul sursă referit.

Pentru detalii despre BLAKE2, verificați secțiunea 2.4 a oficialului documentația BLAKE2 (care pare să se concentreze pe modificări de la BLAKE la BLAKE2), sau a acestuia RFC care oferă o descriere completă.

În depozitul la care vă conectați, acestea oferă doar o implementare de referință C# a BLAKE2b. Cu toate acestea, puteți vedea diferitele implementări comparând implementările de referință C ale BLAKE2b și BLAKE2s:

BLAKE2s $G()$ funcţie

#define G(r,i,a,b,c,d) \
  face { \
    a = a + b + m[blake2s_sigma[r][2*i+0]]; \
    d = rotr32(d ^ a, 16); \
    c = c + d; \
    b = rotr32(b ^ c, 12); \
    a = a + b + m[blake2s_sigma[r][2*i+1]]; \
    d = rotr32(d ^ a, 8); \
    c = c + d; \
    b = rotr32(b ^ c, 7); \
  } în timp ce(0)

ale lui BLAKE2b $G()$ funcţie:

#define G(r,i,a,b,c,d) \
  face { \
    a = a + b + m[blake2b_sigma[r][2*i+0]]; \
    d = rotr64(d ^ a, 32); \
    c = c + d; \
    b = rotr64(b ^ c, 24); \
    a = a + b + m[blake2b_sigma[r][2*i+1]]; \
    d = rotr64(d ^ a, 16); \
    c = c + d; \
    b = rotr64(b ^ c, 63); \
  } în timp ce(0)

Permutări

The $\sigma$ întrebați despre o familie de permutări, vezi de ex. secțiunea 2.7 din RFC BLAKE2.

soul king avatar
drapel in
Multumesc mult, acum am inteles. Gândește-te, voi avea întrebări noi, le voi pune sub comentariul tău!

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.