$G$ chức năng
Đồ họa mà bạn tham khảo dường như mô tả $G$ chức năng của BLAKE - và không phải của BLAKE2b. Lưu ý không chỉ các phép quay khác nhau mà còn cả việc thêm các hằng số $C_{\sigma_r(2i+1)}$ không còn có trong BLAKE2 nữa. Cả hai đều phù hợp với định nghĩa của $G$ chức năng của BLAKE, theo tài liệu chính thức.
Đối với BLAKE2: Hãy cẩn thận vì có hai phiên bản BLAKE2. BLAKE2s dành cho nền tảng có phần cứng 8-32 bit, BLAKE2b dành cho nền tảng có phần cứng 64 bit.
BLAKE2s sử dụng các phép quay lần lượt là 16, 12, 8 và 7 bit - nhưng không có phép cộng liên tục - vì vậy sẽ trông rất giống (nhưng không bằng!) với đồ họa của bạn.
Mặt khác, BLAKE2b sử dụng các phép quay tương ứng là 32, 24, 16 và 63 bit, đây là những gì mã nguồn được tham chiếu thực hiện.
Để biết chi tiết về BLAKE2, hãy xem phần 2.4 của tài liệu chính thức tài liệu BLAKE2 (dường như tập trung vào các thay đổi từ BLAKE sang BLAKE2) hoặc RFC trong đó cung cấp một mô tả đầy đủ.
Trong kho lưu trữ mà bạn liên kết đến, họ chỉ cung cấp triển khai tham chiếu C# của BLAKE2b. Tuy nhiên, bạn có thể thấy các triển khai khác nhau bằng cách so sánh các triển khai tham chiếu C của BLACK2b và BLAKE2s:
BLAKE2s' $G()$ chức năng
#define G(r,i,a,b,c,d) \
làm { \
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); \
} trong khi (0)
BLAKE2b's $G()$ chức năng:
#define G(r,i,a,b,c,d) \
làm { \
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); \
} trong khi (0)
hoán vị
Các $\sigma$ bạn hỏi về một họ hoán vị, xem ví dụ: phần 2.7 của BLAKE2 RFC.