מצב הפעלה של צופן בלוקים – ויקיפדיה
בקריפטוגרפיה מצב הפעלה (באנגלית: Mode of operation) מתייחס לאלגוריתם שמגדיר כיצד להפעיל צופן בלוקים סימטרי דטרמיניסטי להצפנת טקסט-גלוי באורך שעולה על אורך הבלוק שהצופן מסוגל להצפין בבת אחת. צופן בלוקים כשלעצמו מסוגל רק להבטיח סודיות של 'בלוק' טקסט גלוי, שהוא מחרוזת סיביות באורך קבוע מוגדר מראש. מעצם ההגדרה, בהינתן צופן בלוקים דטרמיניסטי כמו AES ומפתח הצפנה זהה, הצופן ימיר תמיד בלוק קלט זהה לבלוק טקסט-מוצפן זהה. לכן ניתן לזהות הצפנה חוזרת של בלוקים זהים עם אותו מפתח. זהו מאפיין שעלול להוות חיסרון כי בהצפנה ישירה דולף בדרך אגב מידע ליריב פוטנציאלי שעלול להיות מנוצל להתקפה כנגד המערכת.
3 מצבי הפעלה בסיסיים
3.1 מצב ECB
3.2 מצב CBC
3.3 מצב CFB
3.4 מצב OFB
3.5 מצב CTR
4 מצב TBC
5 מצב CTS
6 הצפנה מאומתת
ריפוד[עריכת קוד מקור | עריכה]
אם בלוק הצופן הוא באורך n {\displaystyle n} סיביות (ב-AES למשל n = 128 {\displaystyle n=128} סיביות) והמסר הגלוי המיועד להצפנה כמו קובץ, הודעת אי-מייל או מסרון הוא באורך כלשהו גדול מ- n {\displaystyle n} שזה המצב בדרך כלל, הדרך הפשוטה להכינו להצפנה היא תחילה לחלקו לבלוקים בגודל n {\displaystyle n} סיביות. אם מספר סיביות המסר אינו מתחלק ללא שארית ב- n {\displaystyle n} מבצעים מה שקרוי "ריפוד". הדרך הפופולרית היא להוסיף את הסיבית '1' בסוף מחרוזת המסר ולאחריה להוסיף אפסים כמידת הצורך כדי שאורך המסר יתחלק ללא שארית באורך הבלוק. לאחר פענוח הטקסט המוצפן, המקבל מחפש את את הסיבית '1' האחרונה בבלוק האחרון ואז פשוט מסיר את כל האפסים שלאחריה (כולל הסיבית '1'), מחבר יחד את כל הבלוקים ומשחזר את המסר המקורי. אפשר כמובן להשתמש בכל סכמת ריפוד רצויה. סכמת הריפוד אינה סודית וכן חשוב שלא תווצר התנפחות מוגזמת של הטקסט המוצפן בעקבות הריפוד.
לאחר הריפוד אפשר פשוט להצפין את המסר המרופד, בלוק אחר בלוק, באופן איטרטיבי עד להשלמת כל הבלוקים. למעשה שיטה זו, המתוארת ביתר פירוט להלן, נקראת ספר-קוד והיא בעצם הצפנה ישירה ללא פעולה נוספת כלשהי. חסרונה הוא שקל לדעת אם בלוקים גלויים היו זהים אם התקבלו בלוקים מוצפנים זהים, כל עוד המפתח זהה. כפי שיוסבר בהמשך רצוי להימנע ממצב זה, כיוון שהצופן נחשף להתקפות קריפטוגרפיות והדבר עלול להביא לשבירתו. ראוי לציין שבעיה זו אינה קיימת בצופן זרם כיוון שמעצם ההגדרה, טרנספורמציית ההצפנה משתנה באופן דינאמי תוך כדי התהליך. זרם המפתח הפסאודו-אקראי שמופק ארוך מהמסר, לכן לעולם לא ייווצר מצב שבלוקים זהים יוצפנו עם אותו מפתח או באותה טרנספורמציה. מצבי ההפעלה מנסים לעקוף את דטרמיניסטיות של צופן בלוקים על ידי חיקוי צופן זרם.
וקטור אתחול[עריכת קוד מקור | עריכה]
וקטור אתחול הוא מספר אקראי ייחודי כלשהו שמשמש לאתחול תהליך ההצפנה במצבי הפעלה מסוימים של צופן בלוקים כפי שיבואר בהמשך. הוא יכול להיות קבוע ומוסכם מראש, משתנה אקראי, ערך חד-פעמי או מספר רץ, הכול בהתאם לאופי היישום. בין היתר מטרתו לאפשר הצפנה של בלוקים זהים עם אותו מפתח, כי קל יותר להחליף וקטור אתחול על ידי שינוי קל מאשר להחליף מפתח סודי ואפשר להבטיח שכל עוד וקטור האתחול שונה אפילו במעט הטקסט המוצפן שיתקבל משני בלוקים זהים יהיה שונה לגמרי בהסתברות גבוהה מאוד. וקטור האתחול אינו חייב להיות סודי ואין לראות בו כמפתח הצפנה נוסף, אך צריך להיות ידוע גם למקבל הצופן כדי שיוכל לפענח את הטקסט המוצפן ולכן במידה שאינו קבוע מראש יש צורך לצרפו לטקסט מוצפן. למרות שוקטור האתחול בדרך כלל גלוי, לפעמים יש צורך להגן על שלמותו כך שיהיה מובטח לשני הצדדים שלא שונה על ידי יריב פוטנציאלי כחלק מהתקפה נגד המערכת.
מצבי הפעלה בסיסיים[עריכת קוד מקור | עריכה]
להלן תיאור חמשת מצבי ההפעלה הבסיסיים ביותר: ECB,‏ CBC,‏ CFB,‏ OFB ו-CTR.
יהי E {\displaystyle E} צופן בלוקים ו- K {\displaystyle K} מפתח הצפנה סודי. הביטוי c = E K ( x ) {\displaystyle c=E_{K}(x)} פירושו ש- c {\displaystyle c} הוא תוצאת הצפנה של x {\displaystyle x} באמצעות הפונקציה E {\displaystyle E} עם מפתח K {\displaystyle K} . פענוח מסומן בקיצור E K − 1 {\displaystyle E_{K}^{-1}} . היות שהמסר x {\displaystyle x} בדרך כלל ארוך, מתייחסים אליו לאחר שעבר ריפוד אם נדרש, כמערך של t {\displaystyle t} בלוקים באורך n {\displaystyle n} סיביות ומסומן בקיצור: x = x 1 , x 2 , . . . , x t {\displaystyle x=x_{1},x_{2},...,x_{t}} . ריפוד נדרש רק בשני המצבים הראשונים (ECB ו-CBC) ואילו בשלושת המצבים האחרונים צופן הבלוקים מיושם כצופן זרם במצב שמאפשר הצפנה של בלוקים חלקיים בכל אורך רצוי, לכן אין צורך בריפוד.
מאותה סיבה במצבים CFB ,OFB ו-CTR אין צורך בפונקציית פענוח אלא פונקציית הצפנה בלבד המשמשת גם להצפנה וגם לפענוח. זאת כיוון שהצופן מיושם כצופן זרם, ההצפנה היא בעצם XOR של המפתח עם המסר לכן הפענוח זהה כי XOR הופכי של עצמו. פשוט חוזרים על אותה פעולה. יש לציין שהמצבים המנויים אינם מספקים הבטחת שלמות ואימות ולכן ייתכן שלא יתאימו לשימוש במקרים בהם יש חשיבות להבטיח את שלמות המסרים מלבד סודיותם.
מצב ECB[עריכת קוד מקור | עריכה]
במצב הפעלה Electronic CodeBook (ספר-קוד) מחלקים את המסר לבלוקים בגודל n {\displaystyle n} סיביות, מרפדים את הבלוק האחרון בשיטת ריפוד מוסכמת אם אורך המסר אינו מתחלק בדיוק ב- n {\displaystyle n} ופשוט מצפינים כל בלוק בנפרד כדלהלן:
עבור כל בלוק j {\displaystyle \ j} במסר x {\displaystyle \ x} , בצע:
c j = E K ( x j ) {\displaystyle \ c_{j}=E_{K}(x_{j})} .
אופן הפענוח זהה לחלוטין כאשר פונקציית הפענוח היא E K − 1 {\displaystyle \ E_{K}^{-1}} , עבור כל בלוק c j {\displaystyle c_{j}} כאשר 1 ≤ j ≤ t {\displaystyle 1\leq j\leq t} בצע:
x j = E K − 1 ( c j ) {\displaystyle x_{j}=E_{K}^{-1}(c_{j})} .
מצב זה נקרא ספר קוד משום שתאורטית ניתן להכין מראש טבלת קידוד ממויינת המכילה טור אחד של כל הבלוקים האפשריים של טקסט-גלוי וטור מתאים של כל בלוקי הצופן המתאימים ולהצפין כל בלוק מסר באמצעות חיפוש בטבלה. הרעיון תאורטי היות שאם n ≥ 64 {\displaystyle \ n\geq 64} כמות הכניסות בטבלה תהיה אסטרונומית.
מצב זה הוא תהליך דטרמיניסטי ולכן אינו נחשב בטוח לפי מודל התקפת גלוי-נבחר. יתרה מזו, מצב הפעלה זה אינו מכיל את התכונה היסודית של ההצפנה שנקראת "אי יכולת הבחנה" שפירושה שיריב בעל עוצמת מחשוב מוגבלת לא יוכל לזהות הבדל בין טקסט-מוצפן שהוא תוצאה של ההצפנה במצב ECB לבין מחרוזת טקסט אקראית באותו אורך. הסיבה לכך היא שאם מצפינים בלוק מסויים פעמיים עם אותו מפתח מתקבלים בלוקים מוצפנים זהים, עובדה שכל מתקיף יכול להבחין בה בקלות. יש לציין שזו אינה רק בעייה תיאורטית, אלא בעייה מעשית לכל דבר, ניתן ללמוד הרבה על הצופן רק מהעובדה שבלוקים מסויימים שהתקבלו הם זהים. מסיבה זו מצב ההפעלה ECB אינו נמצא בשימוש כמעט בכלל.
מצב CBC[עריכת קוד מקור | עריכה]
מצב הפעלה Cipher-Block Chaining (שרשור בלוקים מוצפנים), מוסיף ווקטור אתחול IV באורך n {\displaystyle n} סיביות להצפנה. במצב זה כל בלוק טקסט-קריא מחובר לפני שהוא מוצפן בחיבור ⊕ {\displaystyle \oplus } (XOR) עם תוצאת הצפנת הבלוק הקודם. וקטור האתחול הוא ערך אקראי חד-פעמי. הוא אינו סודי ואינו נחשב למפתח הצפנה. כדי שהמקבל יצליח לפענח את הטקסט המוצפן הוא צריך לקבל את וקטור האתחול במצב גלוי, יחד עם הטקסט המוצפן. תיאור השיטה:
c 0 = IV {\displaystyle \ c_{0}={\mbox{IV}}} , עבור כל בלוק j {\displaystyle \ j} במסר x {\displaystyle \ x} כאשר 1 ≤ j ≤ t {\displaystyle 1\leq j\leq t} בצע:
c j = E K ( c j − 1 ⊕ x j ) {\displaystyle \ c_{j}=E_{K}(c_{j-1}\oplus x_{j})} .
עבור כל בלוק c j {\displaystyle c_{j}} כאשר 1 ≤ j ≤ t {\displaystyle 1\leq j\leq t} בצע:
x j = c j ⊕ E K − 1 ( c j ) {\displaystyle x_{j}=c_{j}\oplus E_{K}^{-1}(c_{j})} . הפונקציה E K − 1 {\displaystyle E_{K}^{-1}} היא פונקציית הפענוח.
ביטחון; תהליך זה הסתברותי, כי תוצאת הצפנת כל בלוק גלוי תלויה גם בטקסט המוצפן מהבלוק קודם. לכן במצב ששני בלוקים זהים הוצפנו עם אותו מפתח יתקבלו בלוקים מוצפנים שונים (הבלוק הראשון תלוי בוקטור האתחול שנבחר באקראי). הוכח שאם פונקציית ההצפנה E {\displaystyle E} היא תמורה פסאודו-אקראית אז CBC יהיה בטוח לפי מודל התקפת גלוי-נבחר בתנאי שוקטור האתחול הוא ערך חד-פעמי שנבחר באקראי בהתפלגות אחידה.
התנפחות; הטקסט המוצפן מתרחב בבלוק נוסף שהוא וקטור האתחול שצריך להישלח גם הוא לצד המקבל. הביטחון המוכח האמור בסעיף הקודם נכון רק אם וקטור האתחול נבחר באקראי. וקטור האתחול יכול להיות מספר סידורי. ואז השולח אינו חייב לשלוח את וקטור האתחול כי שני הצדדים יכולים להתחיל מ-1 ולקדם את ערכו אחרי כל הצפנה. אך יש לזכור שבמקרה זה מצב CBC לא יהיה בטוח לפי מודל התקפת גלוי-נבחר.
התאוששות עצמית; שיטת CBC בעלת סנכרון עצמי, במובן שבמקרה שגיאה אפילו כגון אם בלוק שלם או יותר מתוך הצופן שגויים או נעדרים לגמרי, רק הבלוק הבא לאחריהם לא יפוענח כראוי, כל היתר לא יפגעו. אולם יש לשים לב שבמקרה של כשל בקריאה או חוסר של סיביות במספר שאינו גודל הבלוק עשוי לגרום לפריצת גבולות הבלוק ולכן התאוששות תהיה בלתי אפשרית בבלוקים הבאים.
גישה אקראית; מצב ההפעלה CBC אינו מתאים במקרה שדרושה גישה ישירה, כיוון ששגיאה בבלוק אחד בזמן הצפנה תגרור שגיאה בכל הבלוקים הבאים אחריו.
מצב CFB[עריכת קוד מקור | עריכה]
מצב Cipher Feedback (צופן ממושב) הוא מצב הפעלה של צופן בלוקים המדמה צופן זרם והוא שימושי במיוחד כאשר יש צורך להצפין ולשדר מיידית בלוקים קטנים מ- n {\displaystyle \ n} ללא תלות בבלוקים האחרים. השיטה משתמשת ברעיון אוגר זיזה המכיל פונקציה המשמשת להזנה חוזרת של בלוקי צופן והזזה של סיביות הבלוק כלפי מעלה, בכל שלב חלק מסוים מהאוגר משמש כבלוק הצופן הבא. השיטה מסומנת CFB-r כאשר r {\displaystyle r} מייצג את הכמות המינימלית של סיביות טקסט-קריא שהצופן מעבד ללא עיכוב. כדלהלן:
תחילה I 0 = IV {\displaystyle \ I_{0}={\mbox{IV}}} כאשר I {\displaystyle \ I} הנו אוגר זיזה.
עבור כל בלוק j {\displaystyle j} במסר x {\displaystyle \ x} בצע:
יהי t j {\displaystyle \ t_{j}} שווה r {\displaystyle \ r} הסיביות הנמוכות ביותר (הראשונות) של O j {\displaystyle \ O_{j}} .
c j = x j ⊕ t j {\displaystyle \ c_{j}=x_{j}\oplus t_{j}} (שדר r {\displaystyle \ r} סיביות צופן כבלוק c j {\displaystyle \ c_{j}} ).
I j + 1 = 2 r ⋅ I j + c j ( mod 2 n ) {\displaystyle \ I_{j+1}=2^{r}\cdot I_{j}+c_{j}{\pmod {2^{n}}}} . (הזז את סיביות c j {\displaystyle \ c_{j}} למעלה r {\displaystyle \ r} צעדים).
תחילה I 0 = IV {\displaystyle \ I_{0}={\mbox{IV}}} . לאחר מכן עבור כל בלוק c j {\displaystyle c_{j}} מבצעים:
x j = c j ⊕ t j {\displaystyle \ x_{j}=c_{j}\oplus t_{j}} ,
כאשר t j , O j , I j {\displaystyle t_{j},O_{j},I_{j}} מחושבים בדיוק כמו בתהליך ההצפנה. במצב זה לא משתמשים בפונקציית פענוח.
זהו מצב הפעלה הסתברותי והוכח שהוא בטוח לפי מודל התקפת גלוי-נבחר בתנאי שוקטור האתחול הוא ערך שנבחר באקראי בהתפלגות אחידה.
שרשור; כמו במצב CBC בהינתן בלוק טקסט-גלוי, מפתח הצפנה ווקטור אתחול זהים, יופק תמיד בלוק מוצפן זהה. לכן רצוי לשנות את וקטור האתחול.
תלות הדדית; כמו במצב CBC מנגנון השרשור גורם לכך שכל בלוק מוצפן תלוי בבלוק המסר המתאים וב- n / r {\displaystyle n/r} בלוקים מוצפנים קודמים. סידור מחדש של בלוקי צופן ישבש את הפענוח ולכן מתגלה מיד.
כשל מצטבר; סיבית אחת או יותר שגויים בבלוק מוצפן בגודל r {\displaystyle r} סיביות משבש את הפענוח הבלוק הנוכחי ו- n / r {\displaystyle n/r} הבלוקים הבאים. כלומר עד אשר n {\displaystyle \ n} סיביות צופן עובדו והבלוק השגוי הוזז לגמרי מתוך האוגר. יתרה מזו השגיאה תופיע בבלוק הנוכחי בדיוק בסיביות המקבילות בטקסט הגלוי וביתר הבלוקים באופן אקראי כך שבממוצע 50 אחוז יתקבל שגוי. התקפה אפשרית יכולה לנצל עובדה זו כדי לשנות סיביות ספציפיות מבלי שהשינוי יתגלה, אולם במחיר של שיבוש הבלוקים הבאים.
התאוששות עצמית; מצב CFB מכיל סנכרון עצמי חלקי. במקרה שגיאה פענוח יחזור להיות תקין לאחר n / r {\displaystyle n/r} בלוקי צופן משובשים.
הספק; במצב זה ההספק נמוך בהשוואה למצבים האחרים בפקטור של n / r {\displaystyle n/r} . במובן שכל הרצה של פונקציית ההצפנה, מניבה רק r {\displaystyle r} סיביות מוצפנות.
מצב OFB[עריכת קוד מקור | עריכה]
מצב ההפעלה Output Feedback (משוב פלט) מדמה צופן זרם והוא שמיש במקרים בהם יש צורך להצפין זרם מידע באורך לא ידוע וכן יש צורך להימנע מכשל מצטבר. מצב זה דומה ל-CFB ומאפשר הצפנת בלוקים בכל גודל רצוי, אולם שונה בכך שפלט פונקציית ההצפנה עצמה משמש להזנה חוזרת, בשונה מהמצב הקודם שבו חלק מהטקסט המוצפן (לאחר XOR) משמש להזנה. תיאור המצב לפי תקן איזו 10116:
תחילה: I 0 = IV {\displaystyle \ I_{0}={\mbox{IV}}} , ועבור כל בלוק j {\displaystyle \ j} במסר x {\displaystyle \ x} בצע:
O j = E K ( I j ) {\displaystyle \ O_{j}=E_{K}(I_{j})} . (חשב את המפתח הבא להצפנת הבלוק הבא).
עבור r {\displaystyle \ r} כלשהו, r ≤ n {\displaystyle \ r\leq n} , בצע: t j {\displaystyle \ t_{j}} שווה r {\displaystyle \ r} הסיביות הראשונות של O j {\displaystyle \ O_{j}} .
c j = x j ⊕ t j {\displaystyle \ c_{j}=x_{j}\oplus t_{j}} (הצפן ושדר את r {\displaystyle \ r} הסיביות הנוכחיות).
I j + 1 = O j {\displaystyle \ I_{j+1}=O_{j}} . (עדכן את הבלוק הבא).
תחילה I 1 = IV {\displaystyle \ I_{1}={\mbox{IV}}} ועבור כל בלוק c j {\displaystyle \ c_{j}} בצע:
x j = c j ⊕ t j {\displaystyle \ x_{j}=c_{j}\oplus t_{j}} כאשר t j {\displaystyle \ t_{j}} , O j {\displaystyle \ O_{j}} , I j {\displaystyle \ I_{j}} מחושבים בדיוק כמו בתהליך ההצפנה, ללא שימוש בפונקציית פענוח.
גרסה נוספת של OFB לפי תקן FIPS 81: גרסה זו זהה למצב הפעלה OFB המתואר למעט השורה האחרונה המוחלפת ב:
מצב זה מאפשר הזזה של סיביות ההזנה ימינה לסוף אוגר ההזזה כך שרק r {\displaystyle r} סיביות משמשות להזזה. כאשר r < n {\displaystyle r<n} ראה להלן ביטחון המצב הזה נמוך מהמצופה.
כמו ה-CFB מצב זה הסתברותי ומוגדר כבטוח לפי מודל התקפת גלוי-נבחר אם וקטור האתחול אקראי.
מצב זה סידרתי באופיו ולכן אינו מתאים ליישום מקבילי, אם כי אפשר להכין את זרם המפתח מראש.
שרשור; כמו במצבים הקודמים CBC ו-CFB וקטור האתחול אחראי לכך שבלוקי מסר זהים יוצפנו לבלוקי צופן שונים.
התאוששות עצמית; מצב OFB מסוגל להתאושש ממצב של סיביות שגויות אך לא ממצב של חוסר סיביות. בשל כך, כשל בקריאת בלוק צופן אחד או יותר, משבש את התיאום בין הבלוקים לבין זרם המפתח ותוצאת הפענוח מנקודה זו ואילך תהיה שגויה.
הספק; אם r < n {\displaystyle r<n} הספק הפונקציה נמוך, בדיוק כמו ב-CFB. אולם מאחר שזרם המפתח אינו תלוי בבלוקי המסר או הצופן, ניתן לחשבו מראש (בהינתן וקטור אתחול כלשהו ומפתח K), מה שמאפשר ייעול תהליך ההצפנה.
אפשר לראות שבמצב OFB כאשר המפתח אקראי כך ש- E K {\displaystyle E_{K}} הוא משתנה אקראי בטווח ( 2 n ) ! {\displaystyle (2^{n})!} תמורות האפשריות, המחזוריות הצפויה של סיביות ההזנה לפני שהן חוזרות על עצמן היא 2 n − 1 {\displaystyle 2^{n-1}} . אולם במקרה שמספר סיביות ההזנה נמוך מ- n {\displaystyle n} (כמו במקרה של תקן FIPS 81) המחזוריות הצפויה תהיה 2 n / 2 {\displaystyle 2^{n/2}} לכן מומלץ להשתמש במלוא סיביות אוגר ההזזה.
מצב CTR[עריכת קוד מקור | עריכה]
מצב מונה (Counter mode) בדומה למצב OFB משנה את התנהגות צופן הבלוקים לצופן זרם על ידי ייצור זרם מפתח מתוך המונה. בניגוד למצב OFB במצב זה מצפינים את המונה פעם אחר פעם, כאשר בכל שלב המונה משתנה ותוצאת כל הצפנה מהווה חלק מזרם המפתח איתו מצפינים את הבלוק הבא של המידע בחיבור XOR. בדרך זו אין מגבלה על גודל הבלוק וכן שינוי המונה I {\displaystyle I} יכול להתבצע בכל דרך נוחה כפונקציה כלשהי של המונה הקודם והוא אינו חייב להיות סודי, למשל: I j = I j − 1 + 1 {\displaystyle I_{j}=I_{j-1}+1} כמתואר בתרשים. לדוגמה:
עבור כל בלוק j {\displaystyle j} של המסר x {\displaystyle x} כאשר 1 ≤ j ≤ t {\displaystyle 1\leq j\leq t} ו- i {\displaystyle i} הוא מונה המכיל ערך התחלתי כלשהו בדרך כלל וקטור אתחול הנקרא Nonce בהקשר זה. עם הפונקציה Increment שאחראית לעדכונו, בצע:
פענוח דומה. שים לב שמשתמשים בפונקציית ההצפנה בלבד כמו בצופן זרם, תחילה טוענים את הערך ההתחלתי של המונה i {\displaystyle i} ואז:
מצב מונה ניתן ליישום באופן מקבילי. למשל אפשר לחלק את ההצפנה של הבלוקים הקריאים בין מספר מעבדים כאשר כל מעבד מתחיל מהיסט אחר של המונה.
הוכח כבטוח לפי מודל התקפת גלוי נבחר בתנאי שוקטור האתחול נבחר באקראי בהתפלגות אחידה בכל פעם שמצפינים מסר חדש.
תומך בגישה אקראית. כאשר מעוניינים לפענח או להצפין בלוק מסויים, אין צורך להתחיל מההתחלה.
מצב זה הוא היעיל ביותר מבין המצבים המנויים, הוא פופולרי מאוד, מומלץ על ידי מומחים רבים כמו נילס פרגוסון וברוס שנייר ונמצא בשימוש בצפנים מודרניים רבים.
החיסרון של מצב המונה המתואר הוא ששינוי סיבית אחת של הצופן משפיע רק על הסיבית המקבילה בטקסט המקור. בתנאים מסוימים הדבר מאפשר התקפת הבחנה שבה התוקף מבצע Bit flipping (הפיכת סיביות) כדי להשיג מידע על הטקסט המוצפן, לכן המתכונת המתוארת אינה מוכחת בטוחה לפי מודל התקפת מוצפן-נבחר המחמיר יותר. אפשר לפתור את הבעיה על ידי הוספת קוד אימות מסרים.
אפשר לראות ששלושת המצבים האחרונים מיישמים הצפנת בלוקים באופן הדומה לצופן זרם, בכך שהם מייצרים זרם מפתח ייחודי באורך הטקסט הגלוי, התלוי בפרמטרים אחרים כגון בלוקי צופן קודמים או המפתח עצמו ובעזרת וקטור אתחול. בעיקרון אפשר בדרך זו, להתייחס לכל צופן בלוקים כאל צופן זרם.
מצב TBC[עריכת קוד מקור | עריכה]
אם משתמשים בצופן בלוקים בר התאמה במקום בצופן בלוקים רגיל, אפשר לקבל מצבי הפעלה יעילים ובטוחים יותר מאילו המנויים, זאת משום שווקטור האתחול מובנה בתוך הצופן. הרעיון הוצע לראשונה על ידי מוזס ליסקוב, רונלד ריבסט ודייויד וגנר[1]. הם פיתחו את מצב ההפעלה Tweak Block Chaining המבוסס על CBC ומיישם צופן בלוקים בר התאמה, המקבל מלבד המסר ומפתח ההצפנה ערך נוסף ייחודי וחד פעמי (שאינו סודי) כך שתוצאת ההצפנה תלויה גם בו. ערך זה נקרא בהקשר של צופן בלוקים בר התאמה "tweak" והוא בעצם וקטור אתחול או Nonce.
מצב ההפעלה TBC פועל באופן הבא: ה-tweak הראשוני T 0 {\displaystyle T_{0}} מתפקד כמו וקטור האתחול IV {\displaystyle {\text{IV}}} . הבלוק הראשון M 0 {\displaystyle M_{0}} מוצפן עם מפתח ההצפנה הסודי K {\displaystyle K} ו- T 0 {\displaystyle T_{0}} , כל בלוק M i {\displaystyle M_{i}} הבא אחריו מוצפן באמצעות המפתח הסודי K {\displaystyle K} ו- T i − 1 {\displaystyle T_{i-1}} כאשר T i = C i {\displaystyle T_{i}=C_{i}} , כלומר ה-tweak לבלוק הנוכחי הוא תוצאת ההצפנה של הבלוק הקודם.
מצבי הפעלה שמבוססים על צופן בלוקים בר התאמה פשוטים ובטוחים ולכן אטרקטיביים לצורך הצפנת דיסקים כיוון שלא קיימת כל התקורה של מצבי ההפעלה המתקדמים כמו EAX, OCB ודומיהם.
מצב CTS[עריכת קוד מקור | עריכה]
מבנה CBC-CS1. שים לב ש- C n − 1 ∗ ∗ {\displaystyle C_{n-1}^{**}} אינו חלק מהטקסט המוצפן שנשלח למקבל. בפענוח הבלוק האחרון מתקבל: P n ∗ ⊕ C n − 1 ∗ ∥ C n − 1 ∗ ∗ {\displaystyle P_{n}^{*}\oplus C_{n-1}^{*}\ \|\ C_{n-1}^{**}} , משם המפענח נוטל את החלק החסר C n − 1 ∗ ∗ {\displaystyle C_{n-1}^{**}} ומשלים את הבלוק הלפני אחרון ואז מפענחו עם היתר.
גניבת טקסט מוצפן (Ciphertext stealing) בקיצור CTS היא שיטה להצפנת מסר באורך שאינו מתחלק במספר הבלוקים שהצופן מקבל ללא צורך בריפוד המסר אך במחיר עליה קלה בסיבוכיות. השיטה יושמה בכמה מצבי הפעלה מתקדמים כמו XTS. במצבי ההפעלה ECB ו-CBC למשל יש צורך לרפד את המסר בדרך כלשהי כדי לקבל רצף של בלוקים שלמים, באופן שיהיה קל להסיר את הריפוד בזמן הפענוח. השיטה הנפוצה היא הוספת אחד בסוף המסר ואחריו אפסים במספר הנדרש עד לקבלת בלוק שלם. החיסרון בזה הוא שבעקבות הריפוד הטקסט המוצפן התרחב בהתאם למספר סיביות הריפוד. שיטת גניבת טקסט מוצפן מנסה להתגבר על הבעיה באופן הבא. אם הבלוק האחרון אינו שלם, פשוט מעבירים סיביות טקסט-מוצפן מהבלוק הקודם לבלוק האחרון לפי הצורך עד שמשלימים אותו לבלוק שלם, באופן זה מספר הסיביות הכולל של ההצפנה לא השתנה כלל. NIST פרסמו שלוש שיטות לגניבת טקסט-מוצפן בנספח לתקן SP800-38A[2] עבור מצב ההפעלה CBC. ההבדלים בין השיטות הם רק באופן סידור סיביות הטקסט המוצפן. להלן תיאור האלגוריתם המחולק לשלוש וריאציות CBC-CS1, CBC-CS2 והשלישית CBC-CS3 שהוצעה עבור קרברוס 5. הקלט הוא P {\displaystyle P} שהוא מחרוזת סיביות המסר להצפנה באורך כלשהו והפלט יהיה הטקסט המוצפן C {\displaystyle C} כאשר len ( C ) = len ( P ) {\displaystyle {\text{len}}(C)={\text{len}}(P)} .
יהי b {\displaystyle b} אורך הבלוק שהצופן מקבל (128 סיביות במקרה של AES). ויהי n {\displaystyle n} השלם הנמוך ביותר המקיים n ⋅ b ≥ len ( P ) {\displaystyle n\cdot b\geq {\text{len}}(P)} וכן d = len ( P ) − ( n − 1 ) ⋅ b {\displaystyle d={\text{len}}(P)-(n-1)\cdot b} . מחלקים את המסר לבלוקים P 1 , P 2 , . . . , P n − 1 , P n ∗ {\displaystyle P_{1},P_{2},...,P_{n-1},P_{n}^{*}} כאשר כל הבלוקים למעט האחרון שלמים וכן len ( P n ∗ ) = d {\displaystyle {\text{len}}(P_{n}^{*})=d} כאשר d ≤ b {\displaystyle d\leq b} . כלומר הבלוק האחרון עשוי להיות שלם או חלקי.
מרפדים את הבלוק האחרון P n ∗ {\displaystyle P_{n}^{*}} ב- ( b − d ) {\displaystyle (b-d)} אפסים כדי להשלימו לבלוק שלם P n {\displaystyle P_{n}} . ייתכן שלא יהיה צורך בריפוד למשל אם b − d = 0 {\displaystyle b-d=0} .
מצפינים את כל הבלוקים במצב ההפעלה CBC המתואר לעיל עם המפתח ווקטור האתחול כנדרש ומתקבלים הבלוקים של הטקסט המוצפן C 1 , C 2 , . . . , C n − 1 , C n {\displaystyle C_{1},C_{2},...,C_{n-1},C_{n}} .
חותכים את הבלוק C n − 1 {\displaystyle C_{n-1}} כלומר C n − 1 ∗ = MSB d ( C n − 1 ) {\displaystyle C_{n-1}^{*}={\text{MSB}}_{d}(C_{n-1})} . הפונקציה MSB מציינת שנוטלים את d {\displaystyle d} הסיביות החשובות ביותר בבלוק ואת יתר מוחקים.
בשיטת CBC-CS1: מסדרים את הבלוקים המוצפנים כך: C 1 ∥ C 2 ∥ . . . ∥ C n − 2 ∥ C n − 1 ∗ ∥ C n {\displaystyle C_{1}\ \|\ C_{2}\ \|\ ...\ \|\ C_{n-2}\ \|\ C_{n-1}^{*}\ \|\ C_{n}} (הכוכבית מציינת שייתכן שהבלוק אינו שלם).
בשיטת CBC-CS2: סידור הבלוקים תלוי. אם d = b {\displaystyle d=b} מחזירים C 1 ∥ C 2 ∥ . . . ∥ C n − 2 ∥ C n − 1 ∗ ∥ C n {\displaystyle C_{1}\ \|\ C_{2}\ \|\ ...\ \|\ C_{n-2}\ \|\ C_{n-1}^{*}\ \|\ C_{n}} . אם d < b {\displaystyle d<b} שני הבלוקים האחרונים מחליפים מקומות: C 1 ∥ C 2 ∥ . . . ∥ C n − 2 ∥ C n ∥ C n − 1 ∗ {\displaystyle C_{1}\ \|\ C_{2}\ \|\ ...\ \|\ C_{n-2}\ \|\ C_{n}\ \|\ C_{n-1}^{*}} .
בשיטת CBC-CS3: ההחלפה בין שני הבלוקים האחרונים מתבצעת תמיד: C 1 ∥ C 2 ∥ . . . ∥ C n − 2 ∥ C n ∥ C n − 1 ∗ {\displaystyle C_{1}\ \|\ C_{2}\ \|\ ...\ \|\ C_{n-2}\ \|\ C_{n}\ \|\ C_{n-1}^{*}} .
אם הבלוק P n ∗ {\displaystyle P_{n}^{*}} שלם בכל השיטות ההצפנה היא בעצם מצב ההפעלה CBC הרגיל. הפענוח מתבצע בסדר הפוך בהתאם, תחילה מחלקים את הטקסט המוצפן לבלוקים בהתאם לשיטה. למשל בשיטה הראשונה הבלוק האחד לפני אחרון עשוי להיות חלקי. כזכור בשיטת CBC הטקסט המוצפן של הבלוק לפני האחרון מחובר ב-XOR עם הבלוק הקריא האחרון לפני ההצפנה. אם הבלוק האחרון אינו שלם b − d {\displaystyle b-d} הסיביות העליונות הן אפסים לכן לאחר פענוח הבלוק האחרון נראה כך: P n ∗ ⊕ C n − 1 ∗ ∥ C n ∗ ∗ {\displaystyle P_{n}^{*}\oplus C_{n-1}^{*}\ \|\ C_{n}^{**}} , תחילה מבצעים XOR עם d {\displaystyle d} הסיביות של C n − 1 {\displaystyle C_{n-1}} ומתקבל הבלוק הקריא האחרון P n ∗ {\displaystyle P_{n}^{*}} ומה שנותר זה לחבר את C n − 1 ∗ ∗ {\displaystyle C_{n-1}^{**}} עם C n − 1 ∗ {\displaystyle C_{n-1}^{*}} כדי לקבל את הבלוק המוצפן לפני האחרון ומפענחים.
הצפנה מאומתת[עריכת קוד מקור | עריכה]
מצבי ההפעלה נחקרו בעבר רק מהיבט של הבטחת סודיות ויכולת התאוששות במקרה של שגיאות שידור. מצבי הפעלה המשלבים סודיות עם הגנה על שלמות ואותנטיות המידע כיעד נוסף, נקראים הצפנה מאומתת. קיימים מצבי הפעלה רבים כאלה, בהם אפשר למנות את: XCBC,‏ IACBC,‏ IAPM,‏ OCB,‏ EAX,‏ CWC mode,‏ CCM ו-GCM. במצבים אילו לעתים ההצפנה והאימות מושגים בריצה אחת או בשתי ריצות. כמו כן בין השיטות (למשל EAX) כאלו המספקות הגנה על שלמות המידע המוצפן כמו גם על שלמות מידע גלוי נלווה. הקבוצה הזו מסומנת בקיצור AEAD.
ארגון NIST מנהל רשימה של מצבי הפעלה בטוחים שהוצעו לצורך בחינה ותיקנון[3] המחולקים לשלוש קטגוריות עיקריות: מצבי הצפנה שהם מצבי הפעלה המספקים סודיות בלבד, מצבי אימות הנקראים גם קוד אימות מסרים שמספקים אימות בלבד (במקרים בהם רצוי שהטקסט המאומת יישאר גלוי) ומצבי הצפנה מאומתת המשלבים יחד אימות והצפנה.
מדיה וקבצים בנושא מצב הפעלה של צופן בלוקים בוויקישיתוף
אוחזר מתוך "https://he.wikipedia.org/w/index.php?title=מצב_הפעלה_של_צופן_בלוקים&oldid=21693812"
דף זה נערך לאחרונה ב־4 באוקטובר 2017, בשעה 09:40.