CCM

Counter/CBC MAC (נקרא גם CCMP) הוא מצב הפעלה גנרי של צופן בלוקים להצפנה מאומתת שמספק סודיות והבטחת שלמות. פותח ב-2003 על ידי דאג ווייטינג מחברת Hifn, רוס האוסלי לשעבר מ-RSA וניילס פרגוסון ממיקרוסופט כמועמד לתקן הצפנה מאומתת של NIST. האלגוריתם שייך לקטגוריה AEAD (הצפנה מאומתת עם מידע נלווה), בבסיסו שני פרימיטיבים קריפטוגרפיים נפרדים והוא פועל בשתי ריצות; בריצה ראשונה המסר מוצפן באמצעות צופן בלוקים סימטרי במצב מונה המשלב הצפנה של בלוקים מרובים בתוספת אינדקס הבלוק. בריצה השנייה המסר מאומת על ידי קוד אימות מסרים CBC-MAC, המייצר תג אימות של המסר המוצפן יחד עם מידע נלווה אם ישנו. קיימת הוכחה שמבנה זה בטוח בהנחה שצופן הבלוקים שביסודו בטוח, כמו כן אפשר להשיג בדרך זו סודיות בלבד ו/או הבטחת שלמות ואימות ללא סודיות, אם דרוש. CCM אינו תומך און ליין ואינו מתאים להזרמת מדיה. CCM נתמך בתקן SP 800-38C, נמצא בשימוש IPSec הוצע ב-RFC 6655 עבור TLS והוא מצב הפעלה מנדטורי של IEEE 802.11i בתקן 802.15.4-2001 כחלק מפרוטוקול WPA2 וכן בשינויים קלים בפרוטוקול ZigBee ובפרוטוקול האבטחה של בלוטות'. ערך מורחב – הצפנה מאומתת הצורך בהצפנה מאומתת עולה בשל העובדה שצופן בלוקים מעצם ההגדרה מבטיח רק סודיות והניסיונות לשלב אימות בשיטות אד הוק הולידו מערכות לקויות. הצפנה מאומתת נותנת מענה לסודיות המידע ובמקביל גם לשלמותו באופן בטוח. מיהיר בלייר ופיליפ רוגווי העלו לראשונה את מושג 'הרכבה גנרית' של הצפנה עם אימות באופן שצופן הבלוקים שבשימוש מופרד מהאימות והראו שלוש דרכים בסיסיות בטוחות. הנחת העבודה היא שהשולח והמקבל משתפים ביניהם מראש מפתח הצפנה סודי, המצפין משתמש במפתח שברשותו כדי להצפין את המידע באמצעות צופן סימטרי ולייצר 'תג אימות' באמצעות קוד אימות המסרים, אותו יחד עם המסר המוצפן הוא שולח למקבל. המקבל מצידו משתמש במפתח הסודי שברשותו כדי לפענח את המידע ובאותה מידה לבדוק באמצעות פונקציית האימות את התג שקיבל כדי לוודא את שלמות המידע שקיבל. תג האימות משמש להוכחה שהמידע לא זוייף כי מעצם ההגדרה בלתי אפשרי ליריב בעל עוצמת חישוב סבירה לזייף טקסט-מוצפן ותג אימות מתאים ללא ידיעת המפתח הסודי. AEAD – הצפנה מאומתת עם מידע נלווה נולדה עקב צורך מעשי. כאשר משתמשים מתקשרים ביניהם לצורך העברת חומר סודי, חלק מסוים מהמידע המועבר ברשת גלוי כמו קובץ כותר (header) וכן פרטים כמו כתובת IP וכדומה. המידע הגלוי משמש את השרתים ומסיבה זו חייב להיות גלוי אך יש צורך להגן עליו מפני שינוי זדוני שעלול לסכן את המידע המוצפן. הרעיון הוא שמערכת ההצפנה במחיר מועט תוכל להבטיח גם את שלמות המידע הגלוי המשויך למסר המוצפן. עבור CCM גנרי ישנם שני פרמטרים לקבוע. הראשון הוא M {\displaystyle M} שמגדיר את אורך שדה האימות. ערכו של M {\displaystyle M} הוא מעין שקלול בין התרחבות המסר המוצפן לבין הסיכויים שמתקיף יצליח לזייפו בלי שהמשתמשים יבחינו בכך. ערכים אפשריים הם 4,6,8,10,12,14,16 בתים. הבחירה השנייה היא L {\displaystyle L} שמגדיר את מספר הבתים המוקצה לשדה אורך המידע המיועד להצפנה. ערך זה הוא פשרה בין אורך מקסימלי של מידע שאפשר להצפין לבין אורך וקטור האתחול ערכו של L {\displaystyle L} לא יכול להיות קבוע כי הוא תלוי ביישום. ערכים אפשריים הם בין שני בתים לשמונה בתים. הערך L = 1 {\displaystyle L=1} שמור. הטבלה הבאה מסכמת את הפרמטרים הבסיסים של CCM: את שני הפרמטרים מקודדים בבית הראשון (לפי הפירוט להלן). וקטור האתחול N {\displaystyle N} צריך להיות בגודל 15 − L {\displaystyle 15-L} בתים וחייב להיות חד-פעמי. אין להצפין שני מסרים עם אותו וקטור אתחול (אם המפתח לא הוחלף) כי מצב כזה ממוטט את ביטחון המערכת כליל. אורך המסר המקסימלי שניתן להצפנה מאומתת יהיה עד 2 8 L {\displaystyle 2^{8L}} בתים. מגבלה זו נועדה להבטיח שאפשר יהיה לקודד את אורך המסר בשדה באורך L {\displaystyle L} בתים. אורך המידע הנלווה יהיה בין 0 ל- 2 64 {\displaystyle 2^{64}} בתים. המידע הנלווה מאומת אך לא מוצפן ואינו חובה. כדי לשלוח מסר מוצפן ומאומת השולח צריך תחילה לספק את הנתונים הבאים: מפתח הצפנה K {\displaystyle K} המתאים לצופן הבלוקים שנבחר לשמש כבסיס למערכת (לדוגמה צופן AES עם מפתח באורך 128 סיביות). ערך חד-פעמי המסומן כאן N {\displaystyle N} באורך 15 − L {\displaystyle 15-L} בתים. חשוב ש- N {\displaystyle N} יהיה ייחודי עבור כל מפתח נתון ואין לחזור ולהצפין שני מסרים שונים עם אותו מפתח K {\displaystyle K} ואותו N {\displaystyle N} אחרת ביטחון המערכת נהרס לחלוטין. מסר P {\displaystyle P} המכיל l ( p ) {\displaystyle l(p)} בתים כאשר 0 ≤ l ( p ) < 2 8 L {\displaystyle 0\leq l(p)<2^{8L}} . מגבלת האורך מבטיחה שניתן יהיה לקודד את ערך l ( p ) {\displaystyle l(p)} בתוך שדה באורך L {\displaystyle L} בתים. מידע נלווה A {\displaystyle A} אם ישנו, באורך l ( a ) {\displaystyle l(a)} בתים כאשר 0 ≤ l ( a ) < 2 64 {\displaystyle 0\leq l(a)<2^{64}} . המידע הנלווה מאומת אך נותר גלוי והא אינו חלק מפלט CCM. אפשר להשתמש באלגוריתם כדי לאמת חבילות מידע גלוי כמו כותרים המכילים מידע כללי בקשר למידע המוצפן העובר ברשת. מידע נלווה אינו חובה ואפשר לספק מחרוזת ריקה באורך אפס. הטבלה הבאה מסכמת את הנתונים שהשולח צריך להכין: המידע הנלווה יחד עם וקטור האתחול מחולקים ל- r + 1 {\displaystyle r+1} בלוקים B 0 , B 1 , . . . , B r {\displaystyle B_{0},B_{1},...,B_{r}} (כמפורט להלן) וכן A {\displaystyle A} או P {\displaystyle P} צריכים להיות כפולות של 8 סיביות ויכולים להיות ריקים מה שמרחיב את האופציות, למשל אם P {\displaystyle P} ריק האלגוריתם מספק אימות בלבד של המסר הגלוי A {\displaystyle A} . האלגוריתם מייצר בלוקים המשמשים כמונה אותם ניתן לחשב מראש עבור מפתח נתון כדי להפחית בעבודה אם צריך לאמת מספר רב של מסרים. הביטוי Y 0 = E K ( B 0 ) {\displaystyle Y_{0}=E_{K}(B_{0})} מתייחס להצפנת הבלוק B 0 {\displaystyle B_{0}} באמצעות צופן הבלוקים E {\displaystyle E} (כמו AES) עם המפתח K {\displaystyle K} כשהתוצאה ב- Y 0 {\displaystyle Y_{0}} . הפונקציה MSB T l e n ( Y r ) {\displaystyle {\text{MSB}}_{Tlen}(Y_{r})} מחזירה את T l e n {\displaystyle Tlen} הסיביות המשמעותיות ביותר של Y r {\displaystyle Y_{r}} באופן דומה מייצגת הפונקציה LSB את הסיביות הפחות משמעותיות. והסימן ⊕ {\displaystyle \oplus } הוא הפעולה XOR. קלט: מפתח הצפנה סודי משותף K {\displaystyle K} , אורך תג אימות הרצוי T l e n {\displaystyle {\mathit {Tlen}}} , וקטור אתחול N {\displaystyle N} , טקסט מקור P {\displaystyle P} באורך P l e n {\displaystyle {\mathit {Plen}}} סיביות ומידע נלווה A {\displaystyle A} כשהם מפורמטים לפי הוראות התקן להלן. פלט: טקסט מוצפן C {\displaystyle C} . פורמט. מחלקים את הקלט N , A , P {\displaystyle N,A,P} לבלוקים B 0 , B 1 , . . . , B r {\displaystyle B_{0},B_{1},...,B_{r}} בגודל 128 סיביות כל אחד, לפי ההנחיות להלן. וקטור אתחול. מצפינים את הבלוק הראשון (שהוא וקטור האתחול): Y 0 = E K ( B 0 ) {\displaystyle Y_{0}=E_{K}(B_{0})} . חישוב תג אימות. עבור i = 1 {\displaystyle i=1} עד r {\displaystyle r} מבצעים: Y i = E K ( B i ⊕ Y i − 1 ) {\displaystyle Y_{i}=E_{K}(B_{i}\oplus Y_{i-1})} . תג האימות הוא T = MSB T l e n ( Y r ) {\displaystyle T={\text{MSB}}_{Tlen}(Y_{r})} . חישוב המונה. מכינים m + 1 {\displaystyle m+1} מונים: C t r 0 , C t r 1 , . . . , C t r m {\displaystyle Ctr_{0},Ctr_{1},...,Ctr_{m}} כאשר m = ⌈ P l e n / 128 ⌉ {\displaystyle m=\left\lceil {\mathit {Plen}}/128\right\rceil } לפי ההוראות להלן. הצפנת המונה. עבור j = 0 {\displaystyle j=0} עד m {\displaystyle m} מבצעים: S j = E K ( C t r j ) {\displaystyle S_{j}=E_{K}(Ctr_{j})} התוצאה היא m + 1 {\displaystyle m+1} בלוקים. הבלוק S 0 {\displaystyle S_{0}} המשמש להצפנת תג האימות והבלוקים: S = ( S 1   ‖   S 2   ‖   ⋯   ‖   S m ) {\displaystyle S=(S_{1}\ \|\ S_{2}\ \|\ \cdots \ \|\ S_{m})} המשמשים להצפנת המסר. הצפנת המסר. עבור i = 1 {\displaystyle i=1} עד m {\displaystyle m} מבצעים: C i = ( P i ⊕ S i ) {\displaystyle C_{i}=(P_{i}\oplus S_{i})} . אם הבלוק האחרון אינו מלא, מצבעים חיתוך של בלוק המונה האחרון לפי הצורך, כך שמתקבל C = P ⊕ MSB Tlen ( S ) {\displaystyle C=P\oplus {\text{MSB}}_{\text{Tlen}}(S)} . הצפנת תג האימות. מצפינים את התג T = T ⊕ MSB T l e n ( S 0 ) {\displaystyle T=T\oplus {\text{MSB}}_{Tlen}(S_{0})} . פלט. התוצאה היא C   ‖   T {\displaystyle C\ \|\ T} . קלט: מפתח הצפנה סודי משותף K {\displaystyle K} , אורך תג האימות T l e n {\displaystyle {\mathit {Tlen}}} , וקטור אתחול N {\displaystyle N} , מידע נלווה A {\displaystyle A} וטקסט מוצפן C {\displaystyle C} באורך C l e n {\displaystyle {\mathit {Clen}}} סיביות. פלט: P {\displaystyle P} או סמל מיוחד המייצג כישלון INVALID. מוודים ש- C l e n ≤ T l e n {\displaystyle {\mathit {Clen}}\leq {\mathit {Tlen}}} אם לא מחזירים INVALID. מייצרים את המונה. C t r 0 , C t r 1 , . . . , C t r m {\displaystyle Ctr_{0},Ctr_{1},...,Ctr_{m}} כאשר m = ⌈ ( C l e n − T l e n ) / 128 ⌉ {\displaystyle m=\left\lceil (Clen-Tlen)/128\right\rceil } . מצפינים את המונה. עבור j = 0 {\displaystyle j=0} עד m {\displaystyle m} מבצעים: S j = E K ( C t r j ) {\displaystyle S_{j}=E_{K}(Ctr_{j})} . הבלוקים של המונה הם: S = S 0   ‖   S 1   ‖   S 2   ‖   ⋯   ‖   S m {\displaystyle S=S_{0}\ \|\ S_{1}\ \|\ S_{2}\ \|\ \cdots \ \|\ S_{m}} . מפענחים את הטקסט המוצפן. P = MSB C l e n − T l e n ( C ) ⊕ MSB C l e n − T l e n ( S ) {\displaystyle P={\text{MSB}}_{{\mathit {Clen}}-{\mathit {Tlen}}}(C)\oplus {\text{MSB}}_{Clen-Tlen}(S)} . מחשבים את תג האימות T = LSB T l e n ( C ) ⊕ MSB T l e n ( S 0 ) {\displaystyle T={\text{LSB}}_{Tlen}(C)\oplus {\text{MSB}}_{Tlen}(S_{0})} . מוודים ש- N , A , P {\displaystyle N,A,P} מתאימים להוראות התקן ומחלקים אותם לבלוקים B 0 , B 1 , . . . , B r {\displaystyle B_{0},B_{1},...,B_{r}} . אם לא מחזירים INVALID. מצפינים את הבלוק הראשון Y 0 = E K ( B 0 ) {\displaystyle Y_{0}=E_{K}(B_{0})} . מחשבים את תג האימות. עבור i = 1 {\displaystyle i=1} עד r {\displaystyle r} מבצעים: Y i = E K ( B i ⊕ Y i − 1 ) {\displaystyle Y_{i}=E_{K}(B_{i}\oplus Y_{i-1})} . אם T = MSB T l e n ( Y r ) {\displaystyle T={\text{MSB}}_{Tlen}(Y_{r})} מחזירים את P {\displaystyle P} אחרת מחזירים INVALID. שים לב שבמבנה זה נדרשת רק פונקציית ההצפנה של צופן הבלוקים. בעוד שפענוח מתבצע באופן דומה להצפנה באמצעות XOR כמו בצופן זרם. כדי למנוע התקפת תיזמון יש צורך לוודא שבמקרה שגיאה תוקף אפשרי לא יכול לדעת אם השגיאה ארעה בשלב 7 או 10. משרשרים את וקטור האתחול, המידע הנלווה והמסר המיועד להצפנה למחרוזת אחת ארוכה, אותה מחלקים למקטעים בגודל 16 בתים (128 סיביות) כך שמתקבל מערך בלוקים B 0 , B 1 , B 2 , . . . {\displaystyle B_{0},B_{1},B_{2},...} . כדלהלן: תחילה הבלוק הראשון B 0 {\displaystyle B_{0}} מכיל אינפורמציה כללית ואת וקטור האתחול ומפורמט לפי סדר זה מהקטן לגדול: b 0 , . . . , b 15 {\displaystyle b_{0},...,b_{15}} , כך שהבית הראשון b 0 {\displaystyle b_{0}} מכיל 'דגלים' (להלן), בתים b 1 , . . . , b ( 15 − L ) {\displaystyle b_{1},...,b_{(15-L)}} מכילים את וקטור האתחול. בתים b ( 16 − L ) , . . . , b 15 {\displaystyle b_{(16-L)},...,b_{15}} מכילים את קידוד אורך המסר P {\displaystyle P} . הבית הראשון המכיל את הדגלים מקודד בסדר יורד כדלהלן, סיבית 8 שמורה (תמיד אפס), סיבית 7 מציינת האם קיים מידע נלווה. היא תקבע לאפס אם אורך המידע הנלווה הוא אפס. סיביות 4 עד 6 מכילות את M ′ {\displaystyle M'} לפי קידוד ( M − 2 ) / 2 {\displaystyle (M-2)/2} . הערכים הקבילים הם 1 עד 7. אין להשתמש באפס כי משמעותו 16. סיביות 1 עד 3 מכילות את L ′ {\displaystyle L'} בטווח הערכים 1 עד 7 לפי קידוד L − 1 {\displaystyle L-1} כאשר אפס שמור. אם קיים מידע נלווה A תחילה משרשרים את אורכו ואז מחלקים את הכול ביחד לבלוקים בגודל 128 סיביות ומרפדים את הבלוק האחרון באפסים אם צריך. את אורכו של המידע הנלווה מקודדים כדלהלן. שני הבתים הראשונים משמשים לזיהוי הקידוד בהתאם. אם אורך המידע הנלווה בסיביות נמוך מ- 2 16 − 2 8 {\displaystyle 2^{16}-2^{8}} , הוא תופס שני בתים בלבד לפי סדר בתים גדול. אם המידע הנלווה גדול יותר אך נמוך מ- 2 32 {\displaystyle 2^{32}} , שני הבתים הראשונים יכילו את הקבועים 0xff,0xfe {\displaystyle {\text{0xff,0xfe}}} ואז מקודדים את אורך המידע הנלווה בארבעה בתים נוספים לפי סדר בתים גדול (סך הכול שישה בתים). אם המידע הנלווה גדול יותר (עד 2 64 {\displaystyle 2^{64}} בתים), שני הבתים הראשונים יכילו את הקבועים 0xff,0xff {\displaystyle {\text{0xff,0xff}}} ובשמונה בתים נוספים מקודדים את אורך המידע (סך הכול עשרה בתים). הטבלה הבאה מתארת את הקידוד: לאחר הבלוקים של המידע הנלווה משרשרים את המסר המיועד להצפנה כשהוא מחולק גם הוא לבלוקים בגודל 128 סיביות ומרופד באפסים בהתאם, והתוצאה היא מערך הבלוקים B 0 , B 1 , . . . , B r {\displaystyle B_{0},B_{1},...,B_{r}} כאשר r {\displaystyle r} תלוי באורך המידע הנלווה והמסר המיועד להצפנה בהתאם פלוס הבלוק הראשון. לדוגמה אם בלוק B 0 {\displaystyle B_{0}} מכיל את מחרוזת הסיביות הבאה, 128 סיביות מחולקות לבתים משמאל לימין (הסיבית השמאלית בכל בית היא המשמעותית ביותר): כיוון שהסיבית לפני האחרונה בבית הראשון (המסומנת באדום) היא 1, המשמעות היא שקיים מידע נלווה. אורך תג האימות הוא ( 5 + 1 ) ⋅ 2 {\displaystyle (5+1)\cdot 2} (בגלל ששלוש הסיביות הבאות המסומנות בכחול הן "101" – 5 בייצוג עשרוני). היות ששלוש הסיביות הבאות (ירוק) הן "110" אורך המסר מקודד בשבעה הבתים האחרונים בסך הכול 56 סיביות. לפי תכולת שבעה הבתים האחרונים אורך המסר המיועד להצפנה ואימות הוא 20,000 בתים. וקטור האתחול מאוחסן בשמונת הבתים הנותרים (בסגול) שהם בבסיס הקסדצימלי: "13D4A35D71A50000" לצורך הצפנה במצב מונה (Counter mode), תחילה מייצרים בלוקים של מונה כל אחד בגודל 16 בתים. את המונה אפשר לחשב מראש לפני הגעת המסר. קידוד המונה מתבצע בדרך דומה, לפי סדר בתים גדול, הבית הראשון מכיל את הדגלים, הבתים 1... ( 15 − L ) {\displaystyle 1...(15-L)} מכילים Nonce (ערך ייחודי חד-פעמי), הבתים ( 16 − L ) . . .15 {\displaystyle (16-L)...15} מכילים את המונה. הבית המכיל את הדגלים מקודד כך ששתי הסיביות המשמעותיות (7 ו-8) אינן בשימוש, הסיביות 4 עד 6 מכילות אפס והסיביות 1 עד 3 מכילות את L − 1 {\displaystyle L-1} לדוגמה 011 {\displaystyle {\text{011}}} פירושו שאורך המונה הוא 4 בתים (הערך המקסימלי הוא 8 בתים). את המונה מצפינים באמצעות צופן הבלוקים והצפנת המידע עצמו מתבצעת עם המונה המוצפן שמשמש כמפתח בשיטה דומה לצופן זרם, בה מצפינים מילה אחר מילה ב-XOR. קיימת הוכחה שביטחון CCM עומד בשורה אחת עם אלגוריתמים אחרים כמו OCB. כדי שההוכחה תהיה תקפה יש להגביל את כמות המידע הניתן להצפנה עם מפתח יחיד שלא יעלה על 2 61 {\displaystyle 2^{61}} בלוקים של 128 סיביות, שזה בערך 16 מיליון טרה-בית. לגבי האימות לפי הגדרת הביטחון של האלגוריתם הסיכויים שיעלה בידי תוקף לזייף טקסט מוצפן כך שאלגוריתם האימות יחזיר אמת, בלי ידיעת המפתח הסודי הוא 2 − T l e n {\displaystyle 2^{-{\mathit {Tlen}}}} . לכן לא רצוי להשתמש בתג הקצר מ-64 סיביות. יתרה מזו יש צורך להגביל את מספר הפעמים שהפרוטוקול יחזיר INVALID (כאשר אחד הפרמטרים שגוי) עם מפתח נתון בהתאם לסיטואציה, למשל אם רוחב הפס נמוך לא סביר שהתוקף ינסה פעמים רבות, לעומת זאת אם ביצוע הפרוטוקול מהיר יש חשש שהתוקף ינסה פעמים רבות עד שיצליח לזייף תג אימות או לפענח את המסר. בניסוח פורמלי אם מייצגים את מספר הקריאות שנכשלו (כלומר שהאלגוריתם החזיר INVALID) עם מפתח נתון MaxErrs וכן הסיכוי לזיוף מוצלח מסומן Risk אזי: T l e n ≥ lg ( M a x E r r s / R i s k ) {\displaystyle {\mathit {Tlen}}\geq {\text{lg}}({\mathit {MaxErrs}}/{\mathit {Risk}})} . האלגוריתם מספק הצפנה מאומתת מוכחת, המשלבת הצפנה במצב מונה מהירה ואימות CBC-MAC שניהם פרימיטיבים ידועים ובטוחים. מבנה גנרי שאינו תלוי באלגוריתמים ספציפיים, מה שמאפשר את החלפתם במידת הצורך. יש צורך רק בפונקציית הצפנה, הן להצפנה והן לפענוח. במקרה של AES זהו חיסכון בקוד כי פונקציית הפענוח שונה מההצפנה. הצפנה במצב מונה ניתנת לביצוע מקבילי, אך לא שלב האימות. דרוש רק מפתח הצפנה סודי יחיד שממנו נגזר מפתח האימות. למרות הסיכון שבדבר, המפתחים היו זהירים מספיק כדי למנוע פרצה. אפשר להכין מראש את זרם-המפתח להצפנת גוף המסר אך לא את מפתח האימות. התנפחות הצופן מעבר לאורך המסר המקורי היא בסדר גודל בין 4 ל-14 בתים בהתאם לגודל התג. אין דרישות זיכרון מיוחדות מעבר לדרישות הזיכרון של צופן הבלוקים. לעומת זאת המבקרים מצביעים על כמה חולשות ביניהן: CCM אינו מנצל היטב מצב שבו המידע הנלווה אם ישנו קבוע ממסר למסר. אלא יש צורך לעבדו מחדש בכל הצפנה גם אם לא השתנה. אורך המסר חייב להיות ידוע מראש משום שאורך המסר מקודד בבלוק הראשון. הפורמט של המידע המיועד להצפנה מגושם ומסובך. בייחוד שביטחון האלגוריתם נשען בין היתר גם על הפורמט. EAX OCB מצב הפעלה של צופן בלוקים RFC 3610 Submission to NIST: Counter with CBC-MAC (CCM) Recommendation for Block Cipher Modes of Operation: The CCM Mode for Authentication and Confidentiality