$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) หรือของมัน อาร์เอฟซี ซึ่งมีรายละเอียดครบถ้วน
ในที่เก็บข้อมูลที่คุณลิงก์ไป พวกเขาให้เฉพาะการใช้งานอ้างอิง C# ของ BLAKE2b อย่างไรก็ตาม คุณสามารถดูการใช้งานที่แตกต่างกันโดยการเปรียบเทียบการใช้งานอ้างอิง C ของ BLAKE2b และ BLAKE2s:
BLAKE2' $จี()$ การทำงาน
#กำหนด G(r,i,a,b,c,d) \
ทำ { \
a = a + b + m[blake2s_sigma[r][2*i+0]]; \
d = rotr32(d ^ ก, 16); \
ค = ค + ง; \
ข = rotr32(ข ^ ค, 12); \
a = a + b + m[blake2s_sigma[r][2*i+1]]; \
d = rotr32(d ^ ก, 8); \
ค = ค + ง; \
ข = rotr32(ข ^ ค, 7); \
} ในขณะที่ (0)
ของ BLAKE2b $จี()$ การทำงาน:
#กำหนด G(r,i,a,b,c,d) \
ทำ { \
a = a + b + m[blake2b_sigma[r][2*i+0]]; \
d = rotr64(d ^ ก, 32); \
ค = ค + ง; \
ข = rotr64(ข ^ ค, 24); \
a = a + b + m[blake2b_sigma[r][2*i+1]]; \
d = rotr64(d ^ ก, 16); \
ค = ค + ง; \
ข = rotr64(ข ^ ค, 63); \
} ในขณะที่ (0)
การเรียงสับเปลี่ยน
เดอะ $\sigma$ คุณถามเกี่ยวกับเป็นตระกูลของการเรียงสับเปลี่ยน ดูเช่น ส่วนที่ 2.7 ของ BLAKE2 RFC