$G$ функция
Графика, на которую вы ссылаетесь, похоже, описывает $G$ функция BLAKE- и нет из BLAKE2b. Обратите внимание не только на разные повороты, но и на добавление констант $C_{\sigma_r(2i+1)}$ которых больше нет в BLAKE2. Оба они соответствуют определению $G$ функция BLAKE, согласно официальная документация.
Что касается BLAKE2: обратите внимание, что существует две версии BLAKE2. BLAKE2s для платформ с 8-32-битным оборудованием, BLAKE2b для платформ с 64-битным оборудованием.
BLAKE2s использует повороты на 16, 12, 8 и 7 бит соответственно, но без постоянного сложения, поэтому будет выглядеть очень похоже (но не равно!) вашей графике.
BLAKE2b, с другой стороны, использует повороты на 32, 24, 16 и 63 бита соответственно, что и реализует указанный исходный код.
Подробную информацию о BLAKE2 см. в разделе 2.4 официального Документация BLAKE2 (который, кажется, сосредоточен на изменениях с BLAKE на BLAKE2), или его RFC который дает полное описание.
В репозитории, на который вы ссылаетесь, они предоставляют только эталонную реализацию C# BLAKE2b. Однако вы можете увидеть различные реализации, сравнив эталонные реализации C БЛЕЙК2b и БЛЕЙК2с:
БЛЕЙК2с $G()$ функция
# определить G(r,i,a,b,c,d) \
делать { \
а = а + b + m[blake2s_sigma[r][2*i+0]]; \
d = rotr32(d ^ а, 16); \
с = с + д; \
b = rotr32(b ^ c, 12); \
а = а + b + m[blake2s_sigma[r][2*i+1]]; \
d = rotr32(d ^ а, 8); \
с = с + д; \
b = rotr32(b ^ c, 7); \
} пока(0)
BLAKE2b $G()$ функция:
# определить G(r,i,a,b,c,d) \
делать { \
а = а + b + m[blake2b_sigma[r][2*i+0]]; \
d = rotr64(d ^ а, 32); \
с = с + д; \
b = rotr64(b ^ c, 24); \
а = а + b + m[blake2b_sigma[r][2*i+1]]; \
d = rotr64(d ^ а, 16); \
с = с + д; \
b = rotr64(b ^ c, 63); \
} пока(0)
Перестановки
$\сигма$ вы спрашиваете о семействе перестановок, см., например. раздел 2.7 BLAKE2 RFC.