BLAKE
BLAKE2 > ההבדלים בין BLAKE2 ל-BLAKE

פחות סבבים. הפונקציה הפנימית של BLAKE2s מבצועת רק 10 פעמים והפונקציה הפנימית של BLAKE2b מבוצעת רק 12 פעמים. הסיבה שבגרסאות הקודמות הוצע מספר סבבים גדול יותר (14 ו-16 בהתאמה) נבע רק מהרצון להיות שמרניים ולספק שולי ביטחון גבוהים ולא בגלל קריפטואנליזה מוצקה. השינוי הזה מהותי ומניב שיפור של בין 25 ל-29 אחוז בביצועים בעיקר על קלטים ארוכים לעומת הגרסאות הקודמות ואין סימנים המעידים שביטחון הפונקציה נחלש עקב כך.
הזזות אופטימליות לצורך מהירות. הפונקציה הפנימית מבצעת הזזה מעגלית לשמאל בהיסטים הקבועים: 24, 11, 63. השינוי של ההזזה הראשונה מ-25 ל-24 נובע מסיבות טכניות כי נדרשות פחות הוראות מעבד. השינוי מ-64 ל-63 מוסיף גם הוא במהירות במיוחד שאפשר לראות בהזזה זו כהזזה אחת ימינה במקום 63 שמאלה שהן למעשה שקולות על משתנה 64 סיביות ולכן עשויה להיות מהירה יותר.
ריפוד מינימלי. הריפוד שונה כך שרק אם יש צורך מוסיפים בתים ריקים לסוף המסר. אם אורך הקלט מתחלק באורך הבלוק, לא מבוצע ריפוד כלל. כדי למנוע נקודות תורפה בעקבות השינוי (כי כעת אפשר לבצע התקפות מסוימות שמנצלות את העובדה שהמסר יכול להיות חלק ממסר אחר ארוך יותר), מוחלף כלל הריפוד בשני "דגלי סיום"  f_{0} ו- f_{1} הנמצאים בבלוק הראשון. כאשר  f_{0}=0 עבור כל הבלוקים למעט האחרון שאז  f_{0}=1. הדגל  f_{1} נועד לאותת על הצומת האחרון בעץ הגיבוב במקרה של גיבוב בצורת עץ, כאשר מגיעים לבלוק האחרון  f_{1}=f_{0}.
פחות קבועים. BLAKE2 עושה שימוש בשמונה קבועים בלבד. שינוי זה חוסך ב-128 בתים הן ב-RAM והן ב-ROM ב-BLAKE2b ו-64 בתים ב-BLAKE2s.
סדר בתים קטן. BLAKE2 מפרשת את הקלט לפי סדר בתים קטן כמו MD5 ולא כמו ב-SHA-3 זאת מפני שפלטפורמות רבות פועלות לפי סדר בתים קטן, בעיקר AMD ואינטל.
מונה בתים ולא סיביות. המונה סופר את בתי המסר ולא סיביות המסר, הסיבה לכך טכנית היא מפשטת את היישום ומונעת באגים.
הגיוון מעובד רק פעם אחת. בניגוד לקודמה BLAKE2 טוענת את ה-Salt רק פעם אחת בתחילת הגיבוב כמו וקטור אתחול במקום כקלט לפונקציית הדחיסה בכל סבב. עובדה שחוסכת מעט פעולות ומעט זיכרון. פונקציית דחיסה נטולת Salt מפחיתה בביטחון האלגוריתם באופן שולי.
תוספת בלוק פרמטרים. כדי להתאים את BLAKE2 לשימוש ב-Salt מבלי הצורך להכניסו לפונקציית הדחיסה, נוסף "בלוק פרמטרים" או "בלוק קונפיגורציה" שמחובר תחילה ב-XOR עם ה-IV ומעובד ראשון. בתוך בלוק הפרמטרים מקודדים את כל הפרמטרים החיוניים לפעולת הפונקציה בתצורה הנדרשת; כגון Salt, מפתח הצפנה אם קיים, תמיכה בתצורת גיבוב עץ, אורך תמצית המסר, פרסונליזציה וכדומה.
אתחול פונקציית הדחיסה שונה בהתאם:
{\begin{pmatrix}v_{0}&v_{1}&v_{2}&v_{3}\\v_{4}&v_{5}&v_{6}&v_{7}\\v_{8}&v_{9}&v_{10}&v_{11}\\v_{12}&v_{13}&v_{14}&v_{15}\end{pmatrix}}\longleftarrow {\begin{pmatrix}h_{0}&h_{1}&h_{2}&h_{3}\\h_{4}&h_{5}&h_{6}&h_{7}\\IV_{0}&IV_{1}&IV_{2}&IV_{3}\\t_{0}\oplus IV_{4}&t_{1}\oplus IV_{5}&f_{0}\oplus IV_{6}&f_{1}\oplus IV_{7}\end{pmatrix}}
כאן בניגוד לגרסאות הקודמות נוספו הדגלים  f_{0} ו- f_{1} בשתי הכניסות האחרונות במקום המונה  t שהיה מיותר. שני הדגלים מתפקדים כמונה ומסייעים גם להחליף את פונקציית הריפוד, כך שהמסר אינו מתרחב.
הפונקציה הפנימית  G של BLAKE2b (משמאל) ו-BLAKE2s מוצגת להלן:
| --- | --- |
  {\boldsymbol {G_{i}(a,b,c,d)}}  a\leftarrow a+b+m_{\sigma _{r}(2i)}  d\leftarrow (d\oplus a)\ggg 32  c\leftarrow c+d  b\leftarrow (b\oplus c)\ggg 24  a\leftarrow a+b+m_{\sigma _{r}(2i+1)}  d\leftarrow (d\oplus a)\ggg 16  c\leftarrow c+d  b\leftarrow (b\oplus c)\ggg 63:   {\boldsymbol {G_{i}(a,b,c,d)}}  a\leftarrow a+b+m_{\sigma _{r}(2i)}  d\leftarrow (d\oplus a)\ggg 16  c\leftarrow c+d  b\leftarrow (b\oplus c)\ggg 12  a\leftarrow a+b+m_{\sigma _{r}(2i+1)}  d\leftarrow (d\oplus a)\ggg 8  c\leftarrow c+d  b\leftarrow (b\oplus c)\ggg 7
כאמור הוסרו פעולות החיבור עם הקבועים שכפי שהתחוור אינם חיוניים ואינם שווים את הירידה בביצועים. זהו חיסכון של 16 אחוז בפעולות הבסיסיות.