אופן הפעלה של צופן בלוקים

בקריפטוגרפיה אֹפֶן הַפְעָלָה (באנגלית: Mode of operation) מתייחס לאלגוריתם שמגדיר כיצד להפעיל צופן בלוקים סימטרי דטרמיניסטי להצפנת טקסט-גלוי באורך שעולה על אורך הבלוק שהצופן מסוגל להצפין בבת אחת. צופן בלוקים כשלעצמו מסוגל רק להבטיח סודיות של 'בלוק' טקסט גלוי, שהוא מחרוזת סיביות באורך קבוע מוגדר מראש. מעצם ההגדרה, בהינתן צופן בלוקים דטרמיניסטי כמו AES ומפתח הצפנה זהה, הצופן ימיר תמיד בלוק קלט זהה לבלוק טקסט-מוצפן זהה. לכן ניתן לזהות הצפנה חוזרת של בלוקים זהים עם אותו מפתח. זהו מאפיין שעלול להוות חיסרון כי בהצפנה ישירה דולף בדרך אגב מידע ליריב פוטנציאלי שעלול להיות מנוצל להתקפה כנגד המערכת.

==ריפוד==
אם בלוק הצופן הוא באורך <math>n</math> סיביות (ב-AES למשל <math>n=128</math> סיביות) והמסר הגלוי המיועד להצפנה כמו קובץ, הודעת אי-מייל או מסרון הוא באורך כלשהו גדול מ-<math>n</math> שזה המצב בדרך כלל, הדרך הפשוטה להכינו להצפנה היא תחילה לחלקו לבלוקים בגודל <math>n</math> סיביות. אם מספר סיביות המסר אינו מתחלק ללא שארית ב-<math>n</math> מבצעים מה שקרוי "ריפוד". הדרך הפופולרית היא להוסיף את הסיבית '1' בסוף מחרוזת המסר ולאחריה להוסיף אפסים כמידת הצורך כדי שאורך המסר יתחלק ללא שארית באורך הבלוק. לאחר פענוח הטקסט המוצפן, המקבל מחפש את הסיבית '1' האחרונה בבלוק האחרון ואז פשוט מסיר את כל האפסים שלאחריה (כולל הסיבית '1'), מחבר יחד את כל הבלוקים ומשחזר את המסר המקורי. אפשר כמובן להשתמש בכל סכמת ריפוד רצויה. סכמת הריפוד אינה סודית וכן חשוב שלא תיווצר התנפחות מוגזמת של הטקסט המוצפן בעקבות הריפוד.

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

== וקטור אתחול ==

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

== אופני הפעלה בסיסיים ==
להלן תיאור חמשת אופני ההפעלה הבסיסיים ביותר: ECB, CBC, CFB, OFB ו-CTR.

יהי <math>E</math> צופן בלוקים ו-<math>K</math> מפתח הצפנה סודי. הביטוי <math>c=E_K(x)</math> פירושו ש-<math>c</math> הוא תוצאת הצפנה של <math>x</math> באמצעות הפונקציה <math>E</math> עם מפתח <math>K</math>. פענוח מסומן בקיצור <math>E_K^{-1}</math>. היות שהמסר <math>x</math> בדרך כלל ארוך, מתייחסים אליו לאחר שעבר ריפוד אם נדרש, כמערך של <math>t</math> בלוקים באורך <math>n</math> סיביות ומסומן בקיצור: <math>x=x_1,x_2,...,x_t</math>. ריפוד נדרש רק בשני האופנים הראשונים (ECB ו-CBC) ואילו בשלושת האופנים האחרונים צופן הבלוקים מיושם כצופן זרם במצב שמאפשר הצפנה של בלוקים חלקיים בכל אורך רצוי, לכן אין צורך בריפוד.

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

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

=== אופן ECB ===
300px
באופן הפעלה Electronic CodeBook (ספר-קוד) מחלקים את המסר לבלוקים בגודל <math>n</math> סיביות, מרפדים את הבלוק האחרון בשיטת ריפוד מוסכמת אם אורך המסר אינו מתחלק בדיוק ב-<math>n</math> ופשוט מצפינים כל בלוק בנפרד כדלהלן:

;הצפנה: עבור כל בלוק <math>\ j</math> במסר <math>\ x</math>, בצע:
;:<math>\ c_j = E_K(x_j)</math>.

;פענוח: אופן הפענוח זהה לחלוטין כאשר פונקציית הפענוח היא <math>\ E^{-1}_K</math>, עבור כל בלוק <math>c_j</math> כאשר <math>1\le j\le t</math> בצע:
;:<math>x_j=E_K^{-1}(c_j)</math>.

אופן זה נקרא ספר קוד משום שתאורטית ניתן להכין מראש טבלת קידוד ממוינת המכילה טור אחד של כל הבלוקים האפשריים של טקסט-גלוי וטור מתאים של כל בלוקי הצופן המתאימים ולהצפין כל בלוק מסר באמצעות חיפוש בטבלה. הרעיון תאורטי היות שאם <math>n \ge 64</math> כמות הכניסות בטבלה תהיה אסטרונומית.

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

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

תכונות ECB:
* ביטחון; בלוקים של טקסט-גלוי זהים מפיקים תמיד בלוקים של טקסט-מוצפן זהים - כל עוד מפתח ההצפנה זהה. לכן קל לזהות שהוצפנו בלוקים זהים.
* כשל מצטבר; שגיאה בסיבית אחת או יותר של בלוק טקסט-מוצפן משבשת את פענוח הבלוק הגלוי המתאים בלבד. יתר הבלוקים אינם משתבשים. פענוח של בלוק המכיל סיבית שגויה אחת יהיה אקראי, דהיינו בממוצע 50 אחוז מסיביות הבלוק יהיו שגויות.
* תלות הדדית; הבלוקים מוצפנים בנפרד ללא תלות זה בזה. שינוי סדר הבלוקים המוצפנים גורר אחריו לאחר פענוח שינוי בסדר הבלוקים הגלויים בהתאם. סידור מחדש או הסרה זדונית של בלוקים שלמים עלולים שלא להתגלות.

=== אופן CBC ===
320px
אופן הפעלה Cipher-Block Chaining (שרשור בלוקים מוצפנים), מוסיף וקטור אתחול IV באורך <math>n</math> סיביות להצפנה. במצב זה כל בלוק טקסט-קריא מחובר לפני שהוא מוצפן בחיבור <math>\oplus</math> (XOR) עם תוצאת הצפנת הבלוק הקודם. וקטור האתחול הוא ערך אקראי חד-פעמי. הוא אינו סודי ואינו נחשב למפתח הצפנה. כדי שהמקבל יצליח לפענח את הטקסט המוצפן הוא צריך לקבל את וקטור האתחול במצב גלוי, יחד עם הטקסט המוצפן. תיאור השיטה:

;הצפנה: <math>\ c_0 = \mbox{IV}</math>, עבור כל בלוק <math>\ j</math> במסר <math>\ x</math> כאשר <math>1\le j\le t</math> בצע:
;:<math>\ c_j = E_K (c_{j-1} \oplus x_j)</math>.

;פענוח: עבור כל בלוק <math>c_j</math> כאשר <math>1\le j\le t</math> בצע:
;:<math>x_j=c_{j-1}\oplus E_K^{-1}(c_j)</math>. הפונקציה <math>E_K^{-1}</math> היא פונקציית הפענוח.

תכונות CBC:
* ביטחון; תהליך זה הסתברותי בהנחה שווקטור האתחול אקראי, כי תוצאת הצפנת כל בלוק גלוי תלויה גם בטקסט המוצפן קודם והבלוק הראשון תלוי בווקטור האתחול. לכן במצב ששני בלוקים זהים הוצפנו עם אותו מפתח יתקבלו בלוקים מוצפנים שונים. הוכח שאם פונקציית ההצפנה <math>E</math> היא תמורה פסאודו-אקראית אז CBC יהיה בטוח לפי מודל התקפת גלוי-נבחר בתנאי שווקטור האתחול הוא ערך חד-פעמי שנבחר באקראי בהתפלגות אחידה.
* התנפחות; הטקסט המוצפן מתרחב בבלוק נוסף שהוא וקטור האתחול שצריך להישלח גם הוא לצד המקבל. הביטחון המוכח האמור בסעיף הקודם נכון רק אם וקטור האתחול נבחר באקראי. וקטור האתחול יכול להיות מספר סידורי. ואז השולח אינו חייב לשלוח את וקטור האתחול כי שני הצדדים יכולים להתחיל מ-1 ולקדם את ערכו אחרי כל הצפנה. אך יש לזכור שבמקרה זה אופן CBC לא יהיה בטוח לפי מודל התקפת גלוי-נבחר.
* שרשור; בהינתן בלוק טקסט-גלוי, מפתח הצפנה ווקטור אתחול זהים, יופק תמיד בלוק מוצפן זהה. לכן חובה לבחור וקטור האתחול חדש בכל הצפנה.
* תלות הדדית; מנגנון השרשור של CBC גורם לתלות של כל בלוק צופן בבלוק שלפניו. סידור מחדש של בלוקים עלול להשפיע ישירות על תוצאות הפענוח של אותם בלוקים ועל כן יתגלה.
* כשל מצטבר. סיבית אחת או יותר שגויים בבלוק כלשהו, עשויים לגרום לתוצאות פענוח שגויות בבלוק הנוכחי ובבלוק הבא אחריו. יתרה מזו פענוח הבלוק הנוכחי יהיה אקראי (50% שגיאה) ובבלוק הבא אחריו תופיע השגיאה בדיוק באותן סיביות בהן ארעה בבלוק הקודם. לכן במחיר של איבוד בלוק אחד (הבלוק הראשון) היריב מסוגל לבצע שינויים זדוניים בסיביות מסוימות של הבלוק הבא אחריו מבלי שיתגלו.
* התאוששות עצמית; שיטת CBC בעלת סנכרון עצמי, במובן שבמקרה שגיאה אפילו כגון אם בלוק שלם או יותר מתוך הצופן שגויים או נעדרים לגמרי, רק הבלוק הבא לאחריהם לא יפוענח כראוי, כל היתר לא יפגעו. אולם יש לשים לב שבמקרה של כשל בקריאה או חוסר של סיביות במספר שאינו בגודל הבלוק עשוי לגרום לפריצת גבולות הבלוק ולכן התאוששות תהיה בלתי אפשרית בבלוקים הבאים.
* גישה אקראית; אופן ההפעלה CBC אינו מתאים במקרה שדרושה גישה ישירה, כיוון ששגיאה בבלוק אחד בזמן הצפנה תגרור שגיאה בכל הבלוקים הבאים אחריו.
* מקביליות; היות שכל בלוק תלוי בקודמו CBC אינו מתאים ליישום מקבילי. מאותה סיבה כאשר יש צורך לשנות רק חלק מהבלוקים צריך להצפין מחדש את כולם.

=== אופן CFB ===
380px
Cipher Feedback (צופן ממושב) הוא אופן הפעלה של צופן בלוקים המדמה צופן זרם והוא שימושי במיוחד כאשר יש צורך להצפין ולשדר מיידית בלוקים קטנים מ-<math>\ n</math> ללא תלות בבלוקים האחרים. השיטה משתמשת ברעיון אוגר זיזה המכיל פונקציה המשמשת להזנה חוזרת של בלוקי צופן והזזה של סיביות הבלוק כלפי מעלה, בכל שלב חלק מסוים מהאוגר משמש כבלוק הצופן הבא. השיטה מסומנת CFB-r כאשר <math>r</math> מייצג את הכמות המינימלית של סיביות טקסט-קריא שהצופן מעבד ללא עיכוב. כדלהלן:

;הצפנה: תחילה <math>\ I_0 = \mbox{IV}</math> כאשר <math>\ I</math> הוא אוגר זיזה.
עבור כל בלוק <math>j</math> במסר <math>\ x</math> בצע:
# <math>\ O_j = E_K (I_j)</math>
# יהי <math>\ t_j</math> שווה <math>\ r</math> הסיביות הנמוכות ביותר (הראשונות) של <math>\ O_j</math>.
# <math>\ c_j = x_j \oplus t_j</math> (שדר <math>\ r</math> סיביות צופן כבלוק <math>\ c_j</math>).
# <math>\ I_{j+1} = 2^r \cdot I_j + c_j \pmod{2^n}</math>. (הזז את סיביות <math>\ c_j</math> למעלה <math>\ r</math> צעדים).

;פענוח: תהליך הפענוח זהה:
# תחילה <math>\ I_0 = \mbox{IV}</math>. לאחר מכן עבור כל בלוק <math>c_j</math> מבצעים:
# <math>\ x_j = c_j \oplus t_j</math>,
כאשר <math>t_j,O_j,I_j</math> מחושבים בדיוק כמו בתהליך ההצפנה. במצב זה לא משתמשים בפונקציית פענוח.

תכונות CFB:
* זהו אופן הפעלה הסתברותי והוכח שהוא בטוח לפי מודל התקפת גלוי-נבחר בתנאי שווקטור האתחול הוא ערך שנבחר באקראי בהתפלגות אחידה.
* אינו תומך במקביליות, הבלוקים חייבים להיות מוצפנים לפי סדר. אולם יתרונו על פני CBC שאפשר להכין את זרם המפתח מראש, אם זרם המפתח מוכן ההצפנה עצמה מהירה מאוד.
* שרשור; כמו באופן CBC בהינתן בלוק טקסט-גלוי, מפתח הצפנה ווקטור אתחול זהים, יופק תמיד בלוק מוצפן זהה. לכן רצוי לשנות את וקטור האתחול.
* תלות הדדית; כמו באופן CBC מנגנון השרשור גורם לכך שכל בלוק מוצפן תלוי בבלוק המסר המתאים וב-<math>n/r</math> בלוקים מוצפנים קודמים. סידור מחדש של בלוקי צופן ישבש את הפענוח ולכן מתגלה מיד.
* כשל מצטבר; סיבית אחת או יותר שגויים בבלוק מוצפן בגודל <math>r</math> סיביות משבש את הפענוח הבלוק הנוכחי ו-<math>n/r</math> הבלוקים הבאים. כלומר עד אשר <math>\ n</math> סיביות צופן עובדו והבלוק השגוי הוזז לגמרי מתוך האוגר. יתרה מזו השגיאה תופיע בבלוק הנוכחי בדיוק בסיביות המקבילות בטקסט הגלוי וביתר הבלוקים באופן אקראי כך שבממוצע 50 אחוז יתקבל שגוי. התקפה אפשרית יכולה לנצל עובדה זו כדי לשנות סיביות ספציפיות מבלי שהשינוי יתגלה, אולם במחיר של שיבוש הבלוקים הבאים.
* התאוששות עצמית; אופן CFB מכיל סנכרון עצמי חלקי. במקרה שגיאה פענוח יחזור להיות תקין לאחר <math>n/r</math> בלוקי צופן משובשים.
* הספק; במצב זה ההספק נמוך בהשוואה לאופנים האחרים בפקטור של <math>n/r</math>. במובן שכל הרצה של פונקציית ההצפנה, מניבה רק <math>r</math> סיביות מוצפנות.

=== אופן OFB ===
380px
אופן ההפעלה Output Feedback (משוב פלט) מדמה צופן זרם והוא שמיש במקרים בהם יש צורך להצפין זרם מידע באורך לא ידוע וכן יש צורך להימנע מכשל מצטבר. אופן זה דומה ל-CFB ומאפשר הצפנת בלוקים בכל גודל רצוי, אולם שונה בכך שפלט פונקציית ההצפנה עצמה משמש להזנה חוזרת, בשונה מהאופן הקודם שבו חלק מהטקסט המוצפן (לאחר XOR) משמש להזנה. תיאור האופן לפי תקן ISO 10116 של ארגון התקינה הבינלאומי:

;הצפנה: תחילה: <math>\ I_0 = \mbox{IV}</math>, ועבור כל בלוק <math>\ j</math> במסר <math>\ x</math> בצע:
# <math>\ O_j = E_K(I_j)</math>. (חשב את המפתח הבא להצפנת הבלוק הבא).
# עבור <math>\ r</math> כלשהו, <math>\ r \le n</math>, בצע: <math>\ t_j</math> שווה <math>\ r</math> הסיביות הראשונות של <math>\ O_j</math>.
# <math>\ c_j = x_j \oplus t_j</math> (הצפן ושדר את <math>\ r</math> הסיביות הנוכחיות).
# <math>\ I_{j+1} = O_j</math>. (עדכן את הבלוק הבא).

;פענוח: בדומה להצפנה,
# תחילה <math>\ I_1 = \mbox{IV}</math> ועבור כל בלוק <math>\ c_j</math> בצע:
# <math>\ x_j = c_j \oplus t_j</math> כאשר <math>\ t_j</math>, <math>\ O_ j</math>, <math>\ I_j</math> מחושבים בדיוק כמו בתהליך ההצפנה, ללא שימוש בפונקציית פענוח.

גרסה נוספת של OFB לפי תקן FIPS 81:
גרסה זו זהה לאופן הפעלה OFB המתואר למעט השורה האחרונה המוחלפת ב:

:<math>I_{j+1}=2^r\cdot I_j+t_j\mbox{ mod }2^n</math>

אופן הפעלה זה מאפשר הזזה של סיביות ההזנה ימינה לסוף אוגר ההזזה כך שרק <math>r</math> סיביות משמשות להזזה. כאשר <math>r<n</math> ראה להלן ביטחון האופן הזה נמוך מהמצופה.

תכונות OFB :
*ביטחון; כמו ה-CFB אופן הפעלה זה הסתברותי ומוגדר כבטוח לפי מודל התקפת גלוי-נבחר אם וקטור האתחול אקראי.
*מקביליות; אופן זה סדרתי באופיו ולכן אינו מתאים ליישום מקבילי, אם כי אפשר להכין את זרם המפתח מראש.
* שרשור; כמו באופנים הקודמים CBC ו-CFB וקטור האתחול אחראי לכך שבלוקי מסר זהים יוצפנו לבלוקי צופן שונים.
* תלות הדדית; זרם המפתח עצמאי ואינו תלוי בטקסט הגלוי. משמעות הדבר שווקטור האתחול חייב להיות שונה, אם משתמשים באותו מפתח להצפנת טקסט אחר, אחרת כמו בפנקס חד-פעמי XOR של שני בלוקים מוצפנים עם מפתח זהה למעשה מסיר את המפתח ונשארים רק עם בלוקים של טקסט-גלוי כשהם מעורבב זה בזה.
* כשל מצטבר; סיבית אחת או יותר שגויים בבלוק צופן נתון, ישפיעו אך ורק על אותם סיביות בבלוק הגלוי המתאים. כאשר סיביות אלו בבלוק המפוענח יהפכו למשלימים של סיביות המקוריות באותם המקומות.
* התאוששות עצמית; אופן OFB מסוגל להתאושש ממצב של סיביות שגויות אך לא ממצב של חוסר סיביות. בשל כך, כשל בקריאת בלוק צופן אחד או יותר, משבש את התיאום בין הבלוקים לבין זרם המפתח ותוצאת הפענוח מנקודה זו ואילך תהיה שגויה.
* הספק; אם <math>r < n</math> הספק הפונקציה נמוך, בדיוק כמו ב-CFB. אולם מאחר שזרם המפתח אינו תלוי בבלוקי המסר או הצופן, ניתן לחשבו מראש (בהינתן וקטור אתחול כלשהו ומפתח K), מה שמאפשר ייעול תהליך ההצפנה.
* אפשר לראות שבאופן OFB כאשר המפתח אקראי כך ש-<math>E_K</math> הוא משתנה אקראי בטווח <math>(2^n)!</math> תמורות האפשריות, המחזוריות הצפויה של סיביות ההזנה לפני שהן חוזרות על עצמן היא <math>2^{n-1}</math>. אולם במקרה שמספר סיביות ההזנה נמוך מ-<math>n</math> (כמו במקרה של תקן FIPS 81) המחזוריות הצפויה תהיה <math>2^{n/2}</math> לכן מומלץ להשתמש במלוא סיביות אוגר ההזזה.

=== אופן CTR ===
300px
אופן מונה (Counter mode) בדומה לאופן OFB משנה את התנהגות צופן הבלוקים לצופן זרם על ידי ייצור זרם מפתח מתוך המונה. בניגוד לאופן OFB במצב זה מצפינים את המונה פעם אחר פעם, כאשר בכל שלב המונה משתנה ותוצאת כל הצפנה מהווה חלק מזרם המפתח איתו מצפינים את הבלוק הבא של המידע בחיבור XOR. בדרך זו אין מגבלה על גודל הבלוק וכן שינוי המונה <math>I</math> יכול להתבצע בכל דרך נוחה כפונקציה כלשהי של המונה הקודם והוא אינו חייב להיות סודי, למשל: <math>I_{j} = I_{j-1} + 1</math> כמתואר בתרשים. לדוגמה:

עבור כל בלוק <math>j</math> של המסר <math>x</math> כאשר <math>1\le j\le t</math> ו-<math>i</math> הוא מונה המכיל ערך התחלתי כלשהו בדרך כלל וקטור אתחול הנקרא Nonce בהקשר זה. עם הפונקציה Increment שאחראית לעדכונו, בצע:
# <math>c_j=E_K(i) \oplus x_j</math>
# <math>i=\text{Increment}(i)</math>

פענוח דומה. שימו לב שמשתמשים בפונקציית ההצפנה בלבד כמו בצופן זרם, תחילה טוענים את הערך ההתחלתי של המונה <math>i</math> ואז:
# <math>x_j=E_K(i) \oplus c_j</math>
# <math>i=\text{Increment}(i)</math>
הפונקציה Increment יכולה להיות קידום המונה באחד או כל פונקציה אחרת, כל עוד מובטח שהמספר לא יחזור על עצמו בהצפנה של מסר נתון.

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

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

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

==אופן IGE==
תיאור אופן ההפעלה IGE
אופן הפעלה Infinite Garble Extension (הרחבת עיוות אין-סופית) בקיצור IGE הוא אופן הפעלה של צופן בלוקים סימטרי המשרשר את הבלוקים להצפנה כמתואר בתרשים משמאל, באופן הבא:
:<math>c_{i-1}=E_k(m_i\oplus c_{i-1})\oplus m_{i-1}</math>
כאשר <math>E_k</math> הוא הצפנה של בלוק אחד עם המפתח <math>k</math>. במילים, הרעיון הוא לחבר את הבלוק הנוכחי לפני הצפנתו ב-XOR עם הבלוק המוצפן הקודם, להצפינו ולחבר את תוצאת ההצפנה ב-XOR עם הבלוק הקריא הקודם. במצב זה נדרשים שני וקטורי אתחול, <math>m_0</math> ו-<math>c_0</math>. המפרט המקורי מציין שהערך הראשוני של <math>c_0</math> צריך להיווצר על ידי הפעלה של צופן הבלוקים עם מפתח אחר: <math>c_0=E_{k_0}(m_0)</math>, כאשר<math> k_0</math> הוא מפתח אקראי שונה. אולם OpenSSL שתמך באופן הפעלה זה בעבר, איפשר מצב שבו ערכו של <math>c_0</math> יהיה כל ערך שרירותי שמתקבל כפרמטר למערכת. אפשר להציג את ההצפנה בשיטה זו באופן הדרגתי בצורה הבאה:
{| dir="ltr"
|-
|
:<math>c_1\leftarrow m_0\oplus E_k(m_1\oplus c_0)</math>
:<math>c_2\leftarrow m_1\oplus E_k(m_2\oplus m_0\oplus E_k(m_1\oplus c_0)</math>
:<math>c_3\leftarrow m_2\oplus E_k(m_3\oplus m_1\oplus E_k(m_2\oplus m_0\oplus E_k(m_1\oplus c_0)))</math>
:<math>\vdots</math>
|}
רואים שאופן הפעלה זה מכיל את המאפיין שכל שגיאה בבלוק כלשהו מתפתחת קדימה באופן אין סופי. במילים אחרות היפוך סיבית אחת בבלוק כלשהו יגרום לבלוק זה וליתר הבלוקים הבאים אחריו להשתבש. מה שיכול לשמש מעין הבטחת שלמות אם מוסיפים בלוק אפסים בסוף המסר. בזמן הפענוח אפשר לוודא שלא חלו שינויים באחד מחלקי המסר אם הבלוק האחרון המתקבל לאחר פענוח אכן מכיל אפסים.

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

התקפת הבחנה ניתנת לתיאור באופן תאורטי כמשחק בין המתקיף לבין אורקל שמסוגל לבצע הצפנה של מסרים לפי דרישתו של המתקיף (אפשר להתייחס אליו כאל קופסה שחורה) בתנאי שלמתקיף אין גישה למפתח ההצפנה. המתקיף ינצח במשחק אם יצליח לזהות בהסתברות גבוהה מחצי בשיעור בלתי זניח בין תוצאת הצפנה של מסר אחד לבין תוצאה של מסר אחר. ביתר פירוט, התקפת הבחנה נגד IGE פועלת כדלהלן: תחילה האורקל מגריל שני ערכים התחלתיים <math>m_0</math> ו-<math>c_0</math>. המתקיף שולח לאורקל שני בלוקים <math>m_{01},m_{11} </math> לצורך הצפנתם כאשר <math>m_{01}=m_{11}</math>. האורקל מטיל מטבע, נניח <math>b</math> שיכול להיות אפס או אחד, לפי התוצאה הוא מחזיר את ההצפנה של הבלוק המתאים: <math>c_1=m_0\oplus E_k(m_{b1}\oplus c_0)</math>. המתקיף בוחר שוב שני בלוקים זהים אחרים <math>m_{02},m_{12}</math> ושולח אותם לאורקל. האורקל מצידו מחזיר את <math>c_2=m_{b1}\oplus E_k(m_{b2}\oplus c_1)</math>. כעת המתקיף מחשב את <math>m_{03}=m_{02}\oplus c_1\oplus c_2</math> ומגריל בלוק חדש <math>m_{13}</math> השונה מהבלוק <math>m_{03}</math> אותם הוא שלח לאורקל. לאחר שהאורקל מחזיר את <math>c_3=m_{b2}\oplus E_k(m_{b3}\oplus c_2)</math> המתקיף יכול כעת לבדוק ש-<math>m_{01}\oplus m_{02}\oplus c_3=c_2</math> אם כן, הרי שהמתקיף הצליח לנחש את <math>b=1</math> אחרת <math>b=0</math> והוא ניצח במשחק.

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

==אופן TBC==
אם משתמשים בצופן בלוקים בר התאמה במקום בצופן בלוקים רגיל, אפשר לקבל אופני הפעלה יעילים ובטוחים יותר מאילו המנויים, זאת משום שווקטור האתחול מובנה בתוך הצופן. הרעיון הוצע לראשונה על ידי מוזס ליסקוב, רונלד ריבסט ודייוויד וגנר. הם פיתחו את אופן ההפעלה Tweak Block Chaining המבוסס על CBC ומיישם צופן בלוקים בר התאמה, המקבל מלבד המסר ומפתח ההצפנה ערך נוסף ייחודי וחד פעמי (שאינו סודי) כך שתוצאת ההצפנה תלויה גם בו. ערך זה נקרא בהקשר של צופן בלוקים בר התאמה "tweak" והוא בעצם וקטור אתחול או Nonce.

אופן ההפעלה TBC פועל באופן הבא: ה-tweak הראשוני <math>T_0</math> מתפקד כמו וקטור האתחול <math>\text{IV}</math>. הבלוק הראשון <math>M_0</math> מוצפן עם מפתח ההצפנה הסודי <math>K</math> ו-<math>T_0</math>, כל בלוק <math>M_i</math> הבא אחריו מוצפן באמצעות המפתח הסודי <math>K</math> ו-<math>T_{i-1}</math> כאשר <math>T_i=C_i</math>, כלומר ה-tweak לבלוק הנוכחי הוא תוצאת ההצפנה של הבלוק הקודם.

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

==אופן CTS==

\ C_{n-1}^{**}</math>, משם המפענח נוטל את החלק החסר <math>C_{n-1}^{**}</math> ומשלים את הבלוק הלפני אחרון ואז מפענחו עם היתר.
גנבת טקסט מוצפן (Ciphertext stealing) בקיצור CTS היא שיטה להצפנת מסר באורך שאינו מתחלק במספר הבלוקים שהצופן מקבל ללא צורך בריפוד המסר אך במחיר עליה קלה בסיבוכיות. השיטה יושמה בכמה אופני הפעלה מתקדמים כמו XTS. באופני ההפעלה ECB ו-CBC למשל יש צורך לרפד את המסר בדרך כלשהי כדי לקבל רצף של בלוקים שלמים, באופן שיהיה קל להסיר את הריפוד בזמן הפענוח. השיטה הנפוצה היא הוספת אחד בסוף המסר ואחריו אפסים במספר הנדרש עד לקבלת בלוק שלם. החיסרון בזה הוא שבעקבות הריפוד הטקסט המוצפן התרחב בהתאם למספר סיביות הריפוד. שיטת גנבת טקסט מוצפן מנסה להתגבר על הבעיה באופן הבא. אם הבלוק האחרון אינו שלם, פשוט מעבירים סיביות טקסט-מוצפן מהבלוק הקודם לבלוק האחרון לפי הצורך עד שמשלימים אותו לבלוק שלם, באופן זה מספר הסיביות הכולל של ההצפנה לא השתנה כלל. NIST פרסמו שלוש שיטות לגנבת טקסט-מוצפן בנספח לתקן SP800-38A עבור אופן ההפעלה CBC. ההבדלים בין השיטות הם רק באופן סידור סיביות הטקסט המוצפן. להלן תיאור האלגוריתם המחולק לשלוש וריאציות CBC-CS1, CBC-CS2 והשלישית CBC-CS3 שהוצעה עבור קרברוס 5. הקלט הוא <math>P</math> שהוא מחרוזת סיביות המסר להצפנה באורך כלשהו והפלט יהיה הטקסט המוצפן <math>C</math> כאשר <math>\text{len}(C)=\text{len}(P)</math>.

# יהי <math>b</math> אורך הבלוק שהצופן מקבל (128 סיביות במקרה של AES). ויהי <math>n</math> השלם הנמוך ביותר המקיים <math>n\cdot b\ge\text{len}(P)</math> וכן <math>d=\text{len}(P)-(n-1)\cdot b</math>. מחלקים את המסר לבלוקים <math>P_1,P_2,...,P_{n-1},P_{n}^*</math> כאשר כל הבלוקים למעט האחרון שלמים וכן <math>\text{len}(P_n^*)=d</math> כאשר <math>d\le b</math>. כלומר הבלוק האחרון עשוי להיות שלם או חלקי.
# מרפדים את הבלוק האחרון <math>P_{n}^*</math> ב-<math>(b-d)</math> אפסים כדי להשלימו לבלוק שלם <math>P_n</math>. ייתכן שלא יהיה צורך בריפוד למשל אם <math>b-d=0</math>.
# מצפינים את כל הבלוקים באופן ההפעלה CBC המתואר לעיל עם המפתח ווקטור האתחול כנדרש ומתקבלים הבלוקים של הטקסט המוצפן <math>C_1,C_2,...,C_{n-1},C_n</math>.
# חותכים את הבלוק <math>C_{n-1}</math> כלומר <math>C_{n-1}^*=\text{MSB}_d(C_{n-1})</math>. הפונקציה MSB מציינת שנוטלים את <math>d</math> הסיביות החשובות ביותר בבלוק ואת יתר מוחקים.
#התוצאה הסופית משתנה בהתאם לגרסה:
## בשיטת CBC-CS1: מסדרים את הבלוקים המוצפנים כך: <math>C_1 \ \| \ C_2 \ \| \ ... \ \| \ C_{n-2} \ \| \ C_{n-1}^* \ \| \ C_n</math> (הכוכבית מציינת שייתכן שהבלוק אינו שלם).
## בשיטת CBC-CS2: סידור הבלוקים תלוי. אם <math>d=b</math> מחזירים <math>C_1 \ \| \ C_2 \ \| \ ... \ \| \ C_{n-2} \ \| \ C_{n-1}^* \ \| \ C_n</math>. אם <math>d<b</math> שני הבלוקים האחרונים מחליפים מקומות: <math>C_1 \ \| \ C_2 \ \| \ ... \ \| \ C_{n-2} \ \| \ C_n \ \| \ C_{n-1}^*</math>.
## בשיטת CBC-CS3: ההחלפה בין שני הבלוקים האחרונים מתבצעת תמיד: <math>C_1 \ \| \ C_2 \ \| \ ... \ \| \ C_{n-2} \ \| \ C_n \ \| \ C_{n-1}^*</math>.

אם הבלוק <math>P_n^*</math> שלם בכל השיטות ההצפנה היא בעצם אופן ההפעלה CBC הרגיל. הפענוח מתבצע בסדר הפוך בהתאם, תחילה מחלקים את הטקסט המוצפן לבלוקים בהתאם לשיטה. למשל בשיטה הראשונה הבלוק האחד לפני אחרון עשוי להיות חלקי. כזכור בשיטת CBC הטקסט המוצפן של הבלוק לפני האחרון מחובר ב-XOR עם הבלוק הקריא האחרון לפני ההצפנה. אם הבלוק האחרון אינו שלם <math>b-d</math> הסיביות העליונות הן אפסים לכן לאחר פענוח הבלוק האחרון נראה כך: <math>P_n^* \oplus C_{n-1}^*\ \| \ C_n^{**} </math>, תחילה מבצעים XOR עם <math>d</math> הסיביות של <math>C_{n-1}</math> ומתקבל הבלוק הקריא האחרון <math>P_n^*</math> ומה שנותר זה לחבר את <math>C_{n-1}^{**}</math> עם <math>C_{n-1}^*</math> כדי לקבל את הבלוק המוצפן לפני האחרון ומפענחים.

== הצפנה מאומתת ==

אופני ההפעלה נחקרו בעבר רק מהיבט של הבטחת סודיות ויכולת התאוששות במקרה של שגיאות שידור. אופני הפעלה המשלבים סודיות עם הגנה על שלמות ואותנטיות המידע כיעד נוסף, נקראים הצפנה מאומתת. קיימים אופני הפעלה רבים כאלה, בהם אפשר למנות את: XCBC, IACBC, IAPM, OCB, EAX, CWC mode, CCM ו-GCM. באופנים אילו לעיתים ההצפנה והאימות מושגים בריצה אחת או בשתי ריצות. כמו כן בין השיטות (למשל EAX) כאלו המספקות הגנה על שלמות המידע המוצפן כמו גם על שלמות מידע גלוי נלווה. הקבוצה הזו מסומנת בקיצור AEAD.

ארגון NIST מנהל רשימה של אופני הפעלה בטוחים שהוצעו לצורך בחינה ותיקנון המחולקים לשלוש קטגוריות עיקריות: אופני הצפנה שהם אופני הפעלה המספקים סודיות בלבד, אופני אימות הנקראים גם קוד אימות מסרים שמספקים אימות בלבד (במקרים בהם רצוי שהטקסט המאומת יישאר גלוי) ואופני הצפנה מאומתת המשלבים יחד אימות והצפנה.

== ראו גם ==
* הצפנה מאומתת
* הצפנת דיסקים

==קישורים חיצוניים==

== הערות שוליים ==

קטגוריה:קריפטוגרפיה