בקריפטוגרפיה ובטכנולוגיית מידע, הצפנת דיסקים (באנגלית: Disk encryption) הוא שם כולל לשיטות הצפנת קבצים המאוחסנים במדיה דיגיטלית כמו דיסק קשיח לצורך גישה ישירה. מהיבט תאורטי סיטואציה כזו מציבה מספר דרישות מיוחדות:
בגלל המגבלות יש צורך לחלק את הדיסק למקטעים או סקטורים בגודל קבוע ולהצפינם בנפרד ללא תלות באחרים. לכן הדרך הטובה ביותר היא צופן בלוקים או צופן בלוקים בר התאמה. כדי לשנות בית מסוים בקובץ מסוים צריך לפענח את הסקטורים בהם מצוי הקובץ, לבצע את השינוי ולהצפינם מחדש. גודל הסקטור נקבע בהתאם למספר מאפיינים. סקטורים גדולים מדי מקשים על גישה ישירה כי צריך לפענח כמות גדולה יותר של מידע בכל פעולת שינוי, לעומתם סקטורים קטנים מאטים את ההצפנה. דרישה (א) מוגדרת בהתאם לסוג האיום. ההנחה הבסיסית היא שליריב גישה לאמצעי האחסון והוא מסוגל לקרוא מידע מוצפן בכל רגע נתון אך אין לו גישה למפתחות ההצפנה, מסיבה זו רצוי שלא תהיה לו יכולת לזהות בלוקים זהים, כלומר עמידות כנגד התקפת גלוי-נבחר. בהגדרה מחמירה יותר מניחים שהיריב מסוגל לבקש הצפנה של כל קובץ לפי בחירתו ואחסונו בכונן מבלי לראות את מפתח ההצפנה (למשל אם התוקף שם ידו על חומרה בתוכה מוטמע המפתח באופן שלא ניתן לחשיפה והוא יכול להפעילה כקופסה שחורה), הגדרה זו מתאימה להתקפת מוצפן-נבחר. הגדרה יותר מחמירה מציבה אתגר נוסף, היריב מסוגל לפענח סקטורים באזורים מסוימים במדיית האחסון, לכן יש למנוע מצב שבו התוקף פשוט יעתיק סקטור מוצפן שנמצא באזור בו אין לו יכולת פענוח לאזור אחר בדיסק שבו הוא יכול לבקש פענוח.
בהצפנת דיסקים קיימות מגבלות מובנות שלא ניתנות לפתרון והם:
מצבי ההפעלה הרגילים כמו ECB, CBC, OFB או CTR אינם מתאימים מפני כמה סיבות:
בשל החסרונות האמורים ישנן שלוש התקפות עיקריות נגד הצפנת דיסקים שתמיד ניתנות לביצוע:
ביטחון הצפנת דיסקים הוא לכל היותר כמו מצב ECB עם מפתח שונה עבור כל בלוק. או לחלופין אפשר להציג זאת כצופן בלוקים שבו הבלוק הוא בדיוק באורך הסקטור. אם הסקטור גדול מהבלוק שהצופן מקבל מחלקים את הסקטור לבלוקים בגודל הרצוי ומפעילים את ההצפנה על כל הבלוקים באופן איטרטיבי באופן ששני בלוקים זהים יפיקו תוצאה מוצפנת שונה. כדי להבטיח את דרישה (א) יש להצפין כל סקטור עם מפתח אחר. במקום לאחסן מפתחות רבים אפשר להשתמש במפתח 'מאסטר' יחיד ממנו מפיקים מפתחות הצפנה ככל שיידרש, למשל על ידי הצפנה של ערך ייחודי וחד פעמי עבור כל סקטור שנקרא tweak המשרת כמו וקטור אתחול, ה-tweak לא חייב להיות אקראי או סודי, למשל המספר הסידורי של הסקטור יספיק. החיסרון בזה הוא שכעת יש צורך להפעיל את צופן הבלוקים פעמים עבור סקטורים. עבור כל סקטור צריך תחילה להצפין את ה-tweak ממנו מייצרים מפתח הצפנה ואיתו מצפינים את הסקטור. אפשר להימנע מכך על ידי הצפנה של tweak עם תמורה פסאודו-אקראית מהירה במקום עם צופן הבלוקים, דהיינו המידע מעורבב (ממוסך) באמצעות XOR עם מפתח שנגזר מהפונקציה, כך מרוויחים שצופן הבלוקים מופעל רק פעם אחת והפונקציה הפסאודו-רנדומלית מבטיחה שלא ייווצר מצב ששני בלוקים יוצפנו עם אותו מפתח על ידי שימוש באינדקס הבלוק כמו במצב מונה. בגלל השימוש ב-XOR לא רצוי מטעמי ביטחון להשתמש ב-tweak עצמו ישירות כמפתח לפונקציית ה-PRP אלא מקובל להצפינו תחילה, לכן משמשים בשני מפתחות הצפנה נפרדים. כלומר עבור כל סקטור תחילה מצפינים את ה-tweak (מספר הסקטור) עם מפתח ההצפנה הראשון, מהתוצאה מייצרים מפתחות מיסוך עבור כל הבלוקים שהסקטור מכיל ובאמצעות המפתח השני מצפינים את כולם עם צופן הבלוקים. זו השיטה המועדפת מהיבט של ביטחון ויעילות. הפעלת צופן הבלוקים מתבצעת רק פעמים ופונקציית ה-PRP מהירה כך שהיא זניחה ביחס לצופן הבלוקים.
מספר מצבי הפעלה עוצבו בשיטה זו, ביניהם אפשר לציין את: LRW, XEX ו-XTS. מצב ההפעלה LRW שהוצע על ידי ליסקוב, ריבסט ווגנר הוא פרימיטיב קריפטוגרפי שמיישם את רעיון צופן בלוקים שניתן להתאמה. הצופן מקבל מפתח הצפנה וכן "tweak" המשרת בערך כמו וקטור אתחול או Nonce. הנוסחה היא:
תקן IEEE P1619[1] אימץ את מצב ההפעלה XTS-AES (לפי שיטת XEX - כלומר "XOR/ENCRYPTION/XOR" כשההצפנה היא עם AES), מצב הפעלה זה פותח במיוחד להצפנת סקטורים גדולים במדייה דיגיטלית. השיטה נקראת teawkable במובן שהיא משתמשת בווקטור אתחול שנקרא tweak בגודל 128 סיביות (16 בתים) כאן מסומן ב-. ה-tweak משתנה בכל סקטור והוא יכול להיות מספר רץ של הסקטור. בשיטה זו כל בלוק מוצפן פעמיים. המפתח מחולק לשני מפתחות כל אחד בגודל הדרוש לצופן הבלוקים, תחילה מצפינים את וקטור האתחול עם המפתח הראשון ולאחר מכן מפעילים פונקציה פסאודו-אקראית פשוטה ומצפינים את התוצאה מחוברת עם בלוק הטקסט הקריא באמצעות המפתח השני.
הבלוק נקרא כאן ו- הוא מונה המייצג את מספרו הסידורי של הבלוק בתוך הסקטור. הנוסחה להצפנת בלוק אחד שנקראת כאן כמוצג בתרשים היא:
הפעלת הצופן בשורה הראשונה מתבצעת רק פעם אחת כיוון ש- אינו עולה על בלוק אחד. בפענוח מחליפים בשורה השנייה את הקריאה לפונקציית ההצפנה בפונקציית הפענוח .
ההכפלה ב- היא כפל של הבלוק המוצפן, אותו רואים כפולינום מעל השדה הבינארי המורחב בחזקות של הפולינום או בייצוג הקסדצימלי, מודולו . הכפל האמור מסומן ב-. לצורך הצמצום המודולרי משתמשים בפולינום הפרימיטיבי כדי שהתוצאה תישאר אלמנט בשדה. מבחינה פרקטית פעולת הכפל בשדה יכולה להתבצע על ידי רקורסיה של הזזות (shift) השקולות לכפל ב- וצמצום מודולרי באמצעות פעולת XOR מותנת (כאשר הסיבית הגבוהה היא '1') עם הערך או בייצוג הקסדצימלי . אפשר לראותה כפעולה חיסור במודולוס הדרושה כאשר מתרחשת גלישה (להסבר נוסף ראה OMAC), אפשר להכין את הערכים הללו מראש או להשתמש בטבלאות חיפוש, בהתאם לאופי היישום והחומרה, אך צריך להביא בחשבון התקפת ערוץ צדדי שמודדת את זמני הביצוע השונים. להלן דרך בטוחה לביצוע פעולת הכפל בשדה בחלוקה ל-16 בתים המסומנים :
|
הכפל מתבצע בית אחר בית, הכפל ב-2 אינו אלא הזזה לשמאל והחילוק ב-128 הוא הזזה לימין 8 פוזיציות. הפעולה מעבירה את סיבית הגלישה לבית הבא. ואין צורך לבצע מודולו 128 אפשר לעשות במקום.
להצפנת סקטור שלם במשתמשים בטכניקה שנקראת גנבת טקסט-מוצפן[2]. תחילה מחלקים אותו ל- בלוקים בגודל המתאים לצופן הבלוקים. כלומר אם הסקטור הוא אז . כאשר הוא השלם הגדול ביותר כך שמתקיים . יש לשים לב ש- הבלוקים הראשונים מלאים ואילו הבלוק חלקי או ריק לגמרי (מכיל רק אפסים). ההצפנה של הסקטור מתחלקת לשני מקרים כדלהלן, אם הבלוק האחרון ריק, כלומר ההצפנה של כל הסקטור מתבצעת ישירות כך; עבור כל בלוק כאשר מחשבים את והבלוק המוצפן האחרון יהיה ריק. אם בלוק הטקסט הקריא האחרון אינו ריק דהיינו אזי מבצעים 'שיכול' בין שני הבלוקים האחרונים כדלהלן; תחילה מחשבים את , הבלוק יהיה הסיביות הראשונות של ואז משרשרים את הסיביות הנותרות של לבלוק הטקסט הקריא האחרון ומתקבל בלוק חדש אותו מצפינים כך והתוצאה האחרונה תהיה הבלוק . שים לב שהבלוק עשוי להיות חלקי. לכן הטקסט המוצפן נשאר באורך זהה לטקסט המקורי.
הוכח על ידי רוגאווי שביטחון השיטה הוא בסיבוכיות כלומר הביטוי משקף את היתרון שבידי התוקף בהבחנה בין הטקסט המוצפן לבין מחרוזת אקראית כלשהי, כאשר הוא מספר השאילתות האקראיות לאורקל (בהקשר מעשי - מספר הבלוקים שהוא יכול להצפין) ו- מייצג את "היתרון" שלו או אפשר לומר טווח השגיאה. בגלל התקפת יום הולדת קיים חסם עליון שהוא שמחייב שלאחר גבול זה התנגשויות חייבות להופיע, לכן כאשר מתקרב לערך זה יש סבירות משמעותית ש"התקפת הבחנה" תצליח. כלומר שיימצא זוג המקיים עבור שני אינדקסים שונים כאשר הוא הטקסט הקריא ו- הוא ה-tweak. במקרה זה הטקסטים המוצפנים המתאימים יהיו זהים אחרי חיבור עם ה-tweak של כל אחד מהם בהתאמה. מזה נובע ש-. כלומר התרחשה התנגשות שמאפשרת לתקוף להבחין בין ההצפנה בשיטה זו לבין טקסט רנדומלי לחלוטין. התקפת הבחנה אינה תאורטית בלבד, באמצעותה התוקף יכול לבצע שינויים בסיביות ספציפיות בטקסט המקורי שמתאים לטקסט המוצפן שהוא תוקף וזאת מבלי לפענחו, בדרך הבאה: עבור כלשהו הוא מחשב את במיקום ומחליף את הטקסט המוצפן באופן הבא: והטקסט המוצפן החדש יהיה , במילים אחרות התוקף הצליח לשנות סיביות מסוימות של הבלוק מבלי שהמותקף יבחין בכך.
קיימות טכנולוגיות הצפנת דיסקים ברמת חומרה הנקראת FDE (קיצור של full-disk encryption) כמו BitLocker או ברמת תוכנה כמו Truecrypt. הצפנת דיסקים ברמת חומרה מעצם טבעה חשופה להתקפת אתחול קשה או אתחול קר (cold boot attack)[3] שהיא התקפת ערוץ צדדי שבה התוקף גונב את סיסמת ההצפנה ממחשב פועל (נעול או לא) על ידי אתחול מחדש וחילוץ הסיסמה מהזיכרון או מהדיסק הקשיח, באמצעות כלים פורנזיים כמו Forensic Disk Decryptor של חברת Elcomsoft, לפני שהיא נמחקת. עקב תופעה פיזיקלית ידועה, המידע בזיכרון המחשב נותר שלם בחלקו למספר דקות לאחר הכיבוי. היות שמערכת ההפעלה צריכה לאחסן את מפתח ההצפנה היכן שהוא בזיכרון בזמן הצפנה/פענוח, קשה למנוע סוג כזה של התקפה גם אם משתמשים במערכת הפעלה בטוחה ברמה של חומרה כמו TMP. כמו כן סכימת הצפנת דיסקים בעייתית גם כאשר המחשב נגנב כשהוא במצב "רדום" אם כאשר מעירים אותו לא מתבצע אתחול דרך BIOS. כמו כן הצפנת דיסקים ברמת תוכנה חשופה למספר התקפות ערוץ צדדי כמו קריפטואנליזה אקוסטית או רישום הקשות.