הצפנה מאומתת היא סכמת הצפנה המבוססת על צופן סימטרי שמטרתה לספק סודיות והבטחת שלמות המידע. כאשר פונקציית ההצפנה מקבלת טקסט מקור, מפתח סודי המשותף לשולח והמקבל ווקטור אתחול ומחזירה טקסט מוצפן, בעוד שפונקציית הפענוח מקבלת טקסט מוצפן ווקטור אתחול ומפתח סודי ומפיקה טקסט קריא או סמל מיוחד "INVALID" אם אחד הערכים שונה כתוצאה משגיאה במהלך המשלוח או בזדון. בהקשר זה וקטור האתחול מכונה גם Nonce כלומר ערך ייחודי וחד פעמי אך אינו בהכרח סודי או אקראי כמו למשל מספר רץ. למעשה אפשר להשיג הצפנה מאומתת על ידי שילוב נכון של צופן בלוקים עם קוד אימות מסרים כמו שקורה בפועל ובתקני הצפנה. בעבר השתמשו בטכניקה של ריפוד על ידי הוספת יתירות אולם דרך זו הוכחה כלא בטוחה. שיטות רבות שבשימוש אינן יעילות וחלקן לא בטוחות. המטרה היא השגת אימות במחיר הנמוך ביותר אפשרי מהיבט של יעילות ביישום מעשי בתוכנה או בחומרה, כמעט כמו הצפנה ללא אימות, תוך שמירה על ביטחון גבוה. בנוסף רצוי שתהיה תמיכה במקביליות להשגת תפוקה גבוהה. OCB מכיל את התכונות הבאות:
סימנים מוסכמים.
צופן בלוקים המהווה מרכיב פרימיטיבי באלגוריתם הוא פונקציה מהצורה formula_4 המסומנת בקיצור formula_5 כאשר formula_6 הוא מפתח ההצפנה ו-formula_1 הוא המסר. גודל בלוק שהצופן מסוגל להצפין בריצה אחת הוא formula_3 שמומלץ שיהיה לפחות 128 סיביות. ואורך התג מיוצג על ידי formula_9 ומומלץ שיהיה לפחות 32 סיביות. בפרוטוקול IPSec התקן הוא 96 סיביות.
כל הערכים הם מחרוזות בינאריות והסימן formula_10 מייצג שרשור של formula_11 ו-formula_12 למחרוזת אחת. המרה של מחרוזת בינארית למספר שלם וההפך היא לפי סדר בתים קטן. הפונקציה formula_13 מייצגת את מספר האפסים המסיימים בייצוג הבינארי של המספר formula_14 (בספרות הפחות משמעותיות של המספר) למשל formula_15 וכן formula_16. הריפוד של formula_11 באפסים מיוצג על ידי formula_18, למשל המספר 5 בייצוג בינארי הוא formula_19 הכוכבית מתייחסת למספר האפסים הדרוש כדי להשלימו לגודל בלוק formula_3, כלומר אם formula_21 סיביות המספר 5 בייצוג בינארי מרופד ב-125 אפסים בסיביות המשמעותיות כדי להשלימו לגודל בלוק). הפעולה formula_22 נקראת XOR. הסימן formula_23 נקרא הזזה לשמאל (shift left) של סיביות המחרוזת formula_11 צעד אחד, הסיבית המשמעותית ביותר נפלטת ואילו הסיבית הראשונה מתאפסת. וכן לגבי formula_25 בסדר הפוך. כאשר מחלקים את המסר formula_1 לבלוקים בגודל formula_3 צריך לזכור שמספר הבלוקים צריך להיות לפחות אחד, כך שהמחרוזת הריקה גודלה 1.
פעולות אריתמטיות בשדה formula_28.
כדי לחשב את האופסט להלן, רואים במחרוזות באורך formula_3 הסיביות כפולינומים מעל השדה formula_30, כך שהמקדמים של האלמנט formula_31 הן הסיביות של המספר formula_32. למשל בשדה formula_33 אפשר לראות במספר 5 כמחרוזת בינארית formula_34 או הפולינום formula_35. פעולת החיבור של שני אלמנטים בשדה היא חיבור המקדמים בנפרד מודולו 2 שהיא מקבילה לפעולת XOR. כדי לבצע פעולת כפל בשדה formula_36, יש לבחור תחילה פולינום פרימיטיבי אי-פריק formula_37 ממעלה formula_3 (שרצוי שיהיה עם מספר מקדמים מינימלי, דהיינו משקל בינארי נמוך) שישמש כמייצג של השדה, כך שכל פעולות הכפל בין שני אלמנטים בשדה צריכות להתבצע מודולו formula_37 כדי שהתוצאה תהיה אלמנט בשדה. למשל עבור השדה formula_40 הפולינום formula_41 מתאים.
אפשר לראות שקל לבצע כפל של כל פולינום formula_42 בפולינום formula_43 כיוון שהתוצאה
שקולה בעצם להזזת המקדמים שמאלה פוזיציה אחת. כעת אם הסיבית הגבוהה ביותר היא אפס התקבל פולינום ממעלה נמוכה מ-128 והתוצאה נותרת בעצם formula_45. אך אם הסיבית המשמעותית היא 1 מתקבל פולינום ממעלה גבוהה או שווה ל-128, מה שמחייב לצמצם את הפולינום formula_32 מודולו formula_37. דהיינו צריך למצוא פולינומים formula_48 ו-formula_49 המקיימים formula_50 ואז לקחת את השארית formula_49. קל לפתור את המשוואה האחרונה כאשר formula_52 כי אחרי העברת אגפים מתקבל formula_53. במילים אחרות צריך לחסר את formula_54 מהתוצאה ואפשר להסתפק במקדמים הנמוכים של formula_54 כי הסיבית הגבוהה מתבטלת. חיסור אלמנט בשדה זה מתבצע על ידי XOR כי הוא הופכי של עצמו לכן חיבור וחיסור הן פעולות זהות. לסיכום:
באופן דומה אפשר לבצע חילוק עם ההופכי הכפלי של formula_43.
כעת אם formula_59 הוא מחרוזת בינארית (או פולינום) הביטוי formula_60 עבור formula_61 הוא סימון מקוצר של הפעולה formula_62. כלומר כפל הפולינום formula_63 בחזקות של הפולינום formula_43. בעזרת נוסחאות הכפל והחילוק לעיל קל לחשב מתוך formula_63 את formula_66. עבור formula_67 קטן. את formula_68 מחשבים על ידי formula_69.
לצורך האופסט בהשאלה מקוד גריי מגדירים את formula_70 של מחרוזות באורך formula_71 סיביות הנבדלות זו מזו רק בסיבית אחת. כאן נעשה שימוש בקוד גריי קנוני שאותו בונים על ידי חישוב formula_72 ועבור כל formula_71 הגדול מ-0:
הסיבה לבחירה זו היא שלמעשה formula_75. שזה XOR עם חזקה של 2 כאשר החזקה היא מספר האפסים המסיימים באינדקס formula_14. מה שהופך את המשימה לחישוב נקודות האופסט לקלה במיוחד כי כל שנדרש הוא הזזות ו-XOR בלבד. נקודות formula_77 האמורות שונות זו מזו בסיבית אחת לפחות ושונות מאפס וכן formula_78. תוך שימוש בקוד גריי, במחרוזת formula_63 ובמחרוזת formula_80 (שיבוארו להלן) מחשבים באופן רקורסיבי את הערכים הבאים:
כל נקודה מחושבת על ידי XOR של הנקודה הקודמת עם formula_82. כדי לשלב את וקטור האתחול בתהליך ההכנה תחילה מצפינים אותו עם formula_63 ומחברים את התוצאה formula_80 עם כל ההיסטים formula_77, כאשר האופסט הראשון הוא formula_86. כך מבטיחים ייחודיות בכל הצפנה.
תיאור האלגוריתם.
באלגוריתם הבא, מתייחסים לטקסט המיועד להצפנה כאל מחרוזת סיביות המחולקת ל-formula_87 בלוקים. כאשר המסר צריך להיות לפחות formula_88 בלוקים שלמים בגודל 128 סיביות ובלוק האחרון שיכול להיות בלוק חלקי המרופד באפסים במידת הצורך או שהוא יכול להיות ריק לגמרי. על כל פנים צריך שיהיה לפחות בלוק אחד כך שיתקיים formula_89.
הצפנה ואימות.
formula_90
פענוח ואימות.
formula_102
תיאור במילים.
הקלט הוא מפתח סודי formula_6, וקטור האתחול formula_115 והמסר formula_1 אותו מחלקים ל-formula_87 לבלוקים בגודל formula_3 סיביות, מרפדים באפסים את הבלוק האחרון אם נדרש. לצורך הכנה, תחילה מחשבים את formula_63 על ידי הצפנה של מחרוזת אפסים עם צופן הבלוקים formula_120 והמפתח formula_6 ואז מחשבים ומאחסנים את הסדרה formula_122 כאשר formula_123. אם אורך המסר אינו ידוע מראש אפשר לחשב ולאחסן מראש את הסדרה המתוארת עד לגבול העליון של מספר הבלוקים האפשריים עבור מפתח נתון. את הסדרה מחשבים בשיטה המתוארת לעיל, רקורסיה של כפל ב-formula_43 (הזזה ו-XOR מותנה). מחשבים את האופסט הראשון על ידי הצפנה של formula_63 עם וקטור האתחול formula_126 ולאחר מכן באופן רקורסיבי מחשבים את כל האופסטים באמצעות הנוסחה formula_127 עבור formula_128. באמצעות צופן בלוקים מצפינים כל בלוק כשהוא מחובר עם האופסט המתאים ב-XOR פעמיים, לפני ואחרי ההצפנה כדי לקבל את הטקסט המוצפן formula_129. מחשבים את הבלוק האחרון שהוא הצפנה של אורך המסר עם האופסט המתאים, מחשבים את סכום הביקורת אותו מצפינים באמצעות צופן הבלוקים עם האופסט המתאים. מוסיפים הצפנה של הבלוק האחרון עם קידוד של אורך המסר וכן האופסט האחרון. את תג האימות מחשבים על ידי XOR של כל הבלוקים יחד עם הבלוק המוצפן האחרון והצפנתם. formula_9 הסיביות הראשונות של תוצאת ההצפנה האחרונה הן תג האימות formula_131 שמצורף ל-formula_129. תיאור הפענוח דומה. תחילה מבצעים את אותם פעולות הכנה כמו בתהליך ההצפנה. מפענחים את כל הבלוקים המוצפנים כשהם מחוברים ב-XOR עם האופסט המתאים ומחשבים את הבלוק האחרון ותג האימות formula_133 אותו משווים עם formula_131 שהתקבל מהשולח. אם כל הערכים נכונים האלגוריתם מחזיר את formula_1, אם אחד מהערכים שגוי האלגוריתם מחזיר formula_136.
ביטחון.
OCB נחשב בטוח לפי הגדרות שנהגו לראשונה ב-1984 על ידי מיקלי וגולדווסר בשם ביטחון סמנטי וכן על ידי בלייר ורוגווי ב-1997 ובשנת 2000. תאורטית זיוף תג אימות באופן כללי יכול להצליח בסיבוכיות של formula_137. מעבר לזה, ככל שמוצפנים בלוקים נוספים כמות המידע שעומדת לרשות התוקף גדלה באופן יחסי עד formula_138. כאשר formula_139 מייצג את מספר הבלוקים. כך שאם formula_139 קטן OCB יהיה בטוח בהנחה שצופן הבלוקים בטוח. במילים אחרות מצב ההפעלה אינו גורע מביטחון הצופן אלא בשיעור נמוך שצפוי לפחות מכל מצב הפעלה אחר. איבוד הביטחון הנובע מהגדרה זו מביא למסקנה שצופן הבלוקים צריך להיות לפחות 128 סיביות כדי להגיע לרמת ביטחון ראויה לצורך מעשי. לצורך המחשה, אם תג האימות הוא 64 סיביות ולתוקף גישה ל-formula_141 בתים מוצפנים שהוא בחר ושהוצפנו עם אותו מפתח. הסיכויים שלו להצליח לייצר מסר מזויף עם תג אימות תקף ללא ידיעת המפתח כאשר גודל הבלוק הוא 128, הם בערך formula_142. בניסוח פורמלי בהינתן יריב בעל עוצמת חישוב מוגבלת וכן שיש לו גישה לאורקל והוא מסוגל להגיש formula_48 שאילתות שבסך הכול מסתכמות ב-formula_139 בלוקים ואז מנסה לזייף מסר מסוים תוך formula_145 ניסיונות, יהי formula_146, ביטחון שלב האימות של האלגוריתם יהיה