OCB

בקריפטוגרפיה, Offset CodeBook היא משפחה של מצבי הפעלה מקביליים עבור צופן בלוקים המספקים הצפנה מאומתת של מסרים ארוכים. OCB1 פותח ב-2003 על ידי פיליפ רוגווי, מיהיר בלייר אוניברסיטת קליפורניה בסן דייגו וג'ון בלאק מאוניברסיטת קולורדו. OCB הם מצבי הפעלה אלגנטיים, יעילים ובטוחים לפי פרדיגמה של "הצפנה ואחריה אימות" והם שיפור של מצב ההפעלה IAPM שהוצע על ידי Charanjit Jutla. בהתבסס על צופן בלוקים בטוח כמו AES ווקטור אתחול, האלגוריתם מצפין מסר שהוא מחרוזת בינארית ארוכה , תוך הפעלה של צופן הבלוקים  פעמים, כאשר  הוא גודל הבלוק שהצופן מקבל (128 סיביות במקרה של AES) תוך חישובי היסט (offset) ותהליך הכנת מפתח מהירים מאוד. ומפיק טקסט מוצפן בליווי תג אימות באורך משתנה לפי הצורך כדי לאמת ולהבטיח את שלמות הטקסט המוצפן. תג האימות מבטיח מעצם ההגדרה שלא ניתן יהיה לזייף טקסט מוצפן עם תג אימות מתאים ללא ידיעת מפתח ההצפנה המשותף לשולח והמקבל, כך שהמקבל לא יבחין בכך. OCB1 הוכח כבטוח כנגד התקפות על שלב הסודיות או האימות בהנחה שצופן הבלוקים מוגדר פרמוטציה פסאודו אקראית (PRP). אולם התגלו בעיות בעמידות בפני התנגשויות, שמגבילות את כמות המידע הניתן להצפנה עם מפתח יחיד. ביישום אופטימלי OCB1 מהיר מאוד ויכול להגיע למהירות של 1.48 CPB על מעבד אינטל 64 ביט (עם AES-NI).
OCB מוגן בפטנט בארצות הברית, השימוש בו כרוך ברישיון מבוסס הרישיון הציבורי הכללי של גנו לשימוש פרטי, בתנאי שאינו משמש לצורך מסחרי או ממשלתי. ב-2013 המפתחים נתנו הסכמתם לרישיון חופשי בקוד פתוח המאושר על ידי OSI. האלגוריתם נכלל ברשימת האלגוריתמים המובילים שמנהל NIST לצורך תקן הצפנה מאומתת. כמו כן מומלץ על ידי IETF.

סימנים מוסכמים

צופן בלוקים המהווה מרכיב פרימיטיבי באלגוריתם הוא פונקציה מהצורה  המסומנת בקיצור  כאשר  הוא מפתח ההצפנה ו- הוא המסר. גודל בלוק שהצופן מסוגל להצפין בריצה אחת הוא  שמומלץ שיהיה לפחות 128 סיביות. ואורך התג מיוצג על ידי  ומומלץ שיהיה לפחות 32 סיביות. בפרוטוקול IPSec התקן הוא 96 סיביות.
כל הערכים הם מחרוזות בינאריות והסימן  מייצג שרשור של  ו- למחרוזת אחת. המרה של מחרוזת בינארית למספר שלם וההפך היא לפי סדר בתים קטן. הפונקציה  מייצגת את מספר האפסים המסיימים בייצוג הבינארי של המספר  (בספרות הפחות משמעותיות של המספר) למשל  וכן . הריפוד של  באפסים מיוצג על ידי , למשל המספר 5 בייצוג בינארי הוא  הכוכבית מתייחסת למספר האפסים הדרוש כדי להשלימו לגודל בלוק , כלומר אם  סיביות המספר 5 בייצוג בינארי מרופד ב-125 אפסים בסיביות המשמעותיות כדי להשלימו לגודל בלוק).  הפעולה  נקראת XOR. הסימן  נקרא הזזה לשמאל (shift left) של סיביות המחרוזת  צעד אחד, הסיבית המשמעותית ביותר נפלטת ואילו הסיבית הראשונה מתאפסת. וכן לגבי  בסדר הפוך. כאשר מחלקים את המסר  לבלוקים בגודל  צריך לזכור שמספר הבלוקים צריך להיות לפחות אחד, כך שהמחרוזת  הריקה גודלה 1.

תיאור האלגוריתם

באלגוריתם הבא, מתייחסים לטקסט המיועד להצפנה כאל מחרוזת סיביות המחולקת ל- בלוקים. כאשר המסר צריך להיות לפחות  בלוקים שלמים בגודל 128 סיביות ובלוק האחרון שיכול להיות בלוק חלקי המרופד באפסים במידת הצורך או שהוא יכול להיות ריק לגמרי. על כל פנים צריך שיהיה לפחות בלוק אחד כך שיתקיים .

תיאור במילים

הקלט הוא מפתח סודי , וקטור האתחול  והמסר  אותו מחלקים ל- לבלוקים בגודל  סיביות, מרפדים באפסים את הבלוק האחרון אם נדרש. לצורך הכנה, תחילה מחשבים את  על ידי הצפנה של מחרוזת אפסים עם צופן הבלוקים  והמפתח  ואז מחשבים ומאחסנים את הסדרה  כאשר . אם אורך המסר אינו ידוע מראש אפשר לחשב ולאחסן מראש את הסדרה המתוארת עד לגבול העליון של מספר הבלוקים האפשריים עבור מפתח נתון. את הסדרה מחשבים בשיטה המתוארת לעיל, רקורסיה של כפל ב- (הזזה ו-XOR מותנה). מחשבים את האופסט הראשון על ידי הצפנה של  עם וקטור האתחול  ולאחר מכן באופן רקורסיבי מחשבים את כל האופסטים באמצעות הנוסחה  עבור . באמצעות צופן בלוקים מצפינים כל בלוק כשהוא מחובר עם האופסט המתאים ב-XOR פעמיים, לפני ואחרי ההצפנה כדי לקבל את הטקסט המוצפן . מחשבים את הבלוק האחרון שהוא הצפנה של אורך המסר עם האופסט המתאים, מחשבים את סכום הביקורת אותו מצפינים באמצעות צופן הבלוקים עם האופסט המתאים. מוסיפים הצפנה של הבלוק האחרון עם קידוד של אורך המסר וכן האופסט האחרון. את תג האימות מחשבים על ידי XOR של כל הבלוקים יחד עם הבלוק המוצפן האחרון והצפנתם.  הסיביות הראשונות של תוצאת ההצפנה האחרונה הן תג האימות  שמצורף ל-. תיאור הפענוח דומה. תחילה מבצעים את אותם פעולות הכנה כמו בתהליך ההצפנה. מפענחים את כל הבלוקים המוצפנים כשהם מחוברים ב-XOR עם האופסט המתאים ומחשבים את הבלוק האחרון ותג האימות  אותו משווים עם  שהתקבל מהשולח. אם כל הערכים נכונים האלגוריתם מחזיר את , אם אחד מהערכים שגוי האלגוריתם מחזיר .