הצפנת דיסקים

בקריפטוגרפיה ובטכנולוגיית מידע, הצפנת דיסקים (באנגלית: Disk encryption) הוא שם כולל לשיטות הצפנת קבצים המאוחסנים במדיה דיגיטלית כמו דיסק קשיח לצורך גישה ישירה. מהיבט תאורטי סיטואציה כזו מציבה מספר דרישות מיוחדות:
בגלל המגבלות יש צורך לחלק את הדיסק למקטעים או סקטורים בגודל קבוע ולהצפינם בנפרד ללא תלות באחרים. לכן הדרך הטובה ביותר היא צופן בלוקים או צופן בלוקים בר התאמה. כדי לשנות בית מסוים בקובץ מסוים צריך לפענח את הסקטורים בהם מצוי הקובץ, לבצע את השינוי ולהצפינם מחדש. גודל הסקטור נקבע בהתאם למספר מאפיינים. סקטורים גדולים מדי מקשים על גישה ישירה כי צריך לפענח כמות גדולה יותר של מידע בכל פעולת שינוי, לעומתם סקטורים קטנים מאטים את ההצפנה. דרישה (א) מוגדרת בהתאם לסוג האיום. ההנחה הבסיסית היא שליריב גישה לאמצעי האחסון והוא מסוגל לקרוא מידע מוצפן בכל רגע נתון אך אין לו גישה למפתחות ההצפנה, מסיבה זו רצוי שלא תהיה לו יכולת לזהות בלוקים זהים, כלומר עמידות כנגד התקפת גלוי-נבחר. בהגדרה מחמירה יותר מניחים שהיריב מסוגל לבקש הצפנה של כל קובץ לפי בחירתו ואחסונו בכונן מבלי לראות את מפתח ההצפנה (למשל אם התוקף שם ידו על חומרה בתוכה מוטמע המפתח באופן שלא ניתן לחשיפה והוא יכול להפעילה כקופסה שחורה), הגדרה זו מתאימה להתקפת מוצפן-נבחר. הגדרה יותר מחמירה מציבה אתגר נוסף, היריב מסוגל לפענח סקטורים באזורים מסוימים במדיית האחסון, לכן יש למנוע מצב שבו התוקף פשוט יעתיק סקטור מוצפן שנמצא באזור בו אין לו יכולת פענוח לאזור אחר בדיסק שבו הוא יכול לבקש פענוח.
בהצפנת דיסקים קיימות מגבלות מובנות שלא ניתנות לפתרון והם:
בגלל דרישה (ג) אין אפשרות לאחסן מידע נוסף מלבד הקובץ המוצפן עצמו לכן במקרה זה לא מתאימה הצפנה הסתברותית או צופן זרם. צופן זרם מחייב שימוש בווקטור אתחול שונה עבור כל הצפנה (סקטור או בלוק). יתרה מזו, אם המשתמש משנה תוכנו של קובץ מוצפן יש צורך לשנות את גם את וקטור האתחול אחרת ייווצר מצב ששני בלוקים שונים יוצפנו עם מפתח זהה, שכאמור בצופן זרם מהווה שבירה מוחלטת של הצופן. עובדה זו מאלצת אחסון ערכים בנוסף לקבצים מה שמפר את דרישה (ג).
מאותה סיבה אין אפשרות להוסיף אימות ולכן לא ניתן לאתר שינויים זדוניים בטקסט המוצפן.
אפשר להחליף בין סקטורים שלמים מבלי שהדבר יתגלה. את הבעיה הזו אפשר למנוע חלקית על ידי קונטקסט כלשהו כמו מספר סידורי (הוספת מידע כלשהו כמו תאריך לא תועיל כי אין דרך למפענח לדעת אם הוא נכון).
בלוקים זהים שהוצפנו עם מפתח ווקטור אתחול זהים, תמיד יפיקו טקסט מוצפן זהה. כלומר קשה להבטיח הגנה מוחלטת מפני התקפת מוצפן-נבחר.
מצבי ההפעלה הרגילים כמו ECB, CBC, OFB או CTR אינם מתאימים מפני כמה סיבות:
בשל החסרונות האמורים ישנן שלוש התקפות עיקריות נגד הצפנת דיסקים שתמיד ניתנות לביצוע:
ניתוח תעבורה. ניתן לנטר את התקשורת בין התקן ההצפנה לבין מדיית האחסון ולהבחין בשינויים אם בוצעו בטקסט המקור (כי כאמור בלוק זהה עם אותו מפתח ואותו וקטור אתחול יפיק טקסט מוצפן זהה), מה שמאפשר התקפות מסוימות, כגון חילוץ מידע על ידי הבחנה בדפוסי התנהגות, סיבתיות או הקשר.
הילוך חוזר (replay). אם לתוקף גישה ברמת קריאה/כתיבה למדיית האחסון, הוא תמיד יכול להעתיק תכולה של סקטורים, לאתר סקטור שבוצע בו שינוי ולהחליפו בסקטור הקודם, לפני השינוי.
רנדומיזציה. היות שאין אימות, תוקף עם גישה לדיסק גם אם אינו יכול לפענח את המידע המצוי בו יכול לפחות לשבשו על ידי החלפתו בג'יבריש כדי לנתח את אופן ההתמודדות עם טקסט "בלתי צפוי".
ביטחון הצפנת דיסקים הוא לכל היותר כמו מצב ECB עם מפתח שונה עבור כל בלוק. או לחלופין אפשר להציג זאת כצופן בלוקים שבו הבלוק הוא בדיוק באורך הסקטור. אם הסקטור גדול מהבלוק שהצופן מקבל מחלקים את הסקטור לבלוקים בגודל הרצוי ומפעילים את ההצפנה על כל הבלוקים באופן איטרטיבי באופן ששני בלוקים זהים יפיקו תוצאה מוצפנת שונה. כדי להבטיח את דרישה (א) יש להצפין כל סקטור עם מפתח אחר. במקום לאחסן מפתחות רבים אפשר להשתמש במפתח 'מאסטר' יחיד ממנו מפיקים מפתחות הצפנה ככל שיידרש, למשל על ידי הצפנה של ערך ייחודי וחד פעמי עבור כל סקטור שנקרא tweak המשרת כמו וקטור אתחול, ה-tweak לא חייב להיות אקראי או סודי, למשל המספר הסידורי של הסקטור יספיק. החיסרון בזה הוא שכעת יש צורך להפעיל את צופן הבלוקים  2n פעמים עבור  n סקטורים. עבור כל סקטור צריך תחילה להצפין את ה-tweak ממנו מייצרים מפתח הצפנה ואיתו מצפינים את הסקטור. אפשר להימנע מכך על ידי הצפנה של tweak עם תמורה פסאודו-אקראית מהירה במקום עם צופן הבלוקים, דהיינו המידע מעורבב (ממוסך) באמצעות XOR עם מפתח שנגזר מהפונקציה, כך מרוויחים שצופן הבלוקים מופעל רק פעם אחת והפונקציה הפסאודו-רנדומלית מבטיחה שלא ייווצר מצב ששני בלוקים יוצפנו עם אותו מפתח על ידי שימוש באינדקס הבלוק כמו במצב מונה. בגלל השימוש ב-XOR לא רצוי מטעמי ביטחון להשתמש ב-tweak עצמו ישירות כמפתח לפונקציית ה-PRP אלא מקובל להצפינו תחילה, לכן משמשים בשני מפתחות הצפנה נפרדים. כלומר עבור כל סקטור תחילה מצפינים את ה-tweak (מספר הסקטור) עם מפתח ההצפנה הראשון, מהתוצאה מייצרים מפתחות מיסוך עבור כל הבלוקים שהסקטור מכיל ובאמצעות המפתח השני מצפינים את כולם עם צופן הבלוקים. זו השיטה המועדפת מהיבט של ביטחון ויעילות. הפעלת צופן הבלוקים מתבצעת רק  n+1 פעמים ופונקציית ה-PRP מהירה כך שהיא זניחה ביחס לצופן הבלוקים.
מספר מצבי הפעלה עוצבו בשיטה זו, ביניהם אפשר לציין את: LRW, XEX ו-XTS. מצב ההפעלה LRW שהוצע על ידי ליסקוב, ריבסט ווגנר הוא פרימיטיב קריפטוגרפי שמיישם את רעיון צופן בלוקים שניתן להתאמה. הצופן מקבל מפתח הצפנה וכן "tweak" המשרת בערך כמו וקטור אתחול או Nonce. הנוסחה היא: