$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.