הצפנת דיסקים

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

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

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

מצבי ההפעלה הרגילים כמו ECB, CBC, OFB או CTR אינם מתאימים מפני כמה סיבות:
:(א) **תלות הדדית**. ב-CBC הצפנת בלוק אחד תלויה בבלוקים אחרים ולכן בפענוח בלוק ספציפי חייבים לפענח בלוקים אחרים באותו סקטור. מאותה סיבה לא ניתן להאיץ ביצועים על ידי יישום מקבילי.
:(ב) **התקפת העתק הדבק**. אפשר להעביר סקטורים שלמים והפענוח יהיה נכון חוץ מהבלוק הראשון בתוך הסקטור בגלל וקטור האתחול ולכן כפי שתואר לעיל אם נניח שקיים אזור בדיסק שבו מותר למתקיף לפענח כל סקטור שהוא רוצה, הוא יכול פשוט להעתיק לשם את הסקטור המותקף.
:(ג) **שגיאות מצטברות**. שגיאה בסיבית אחת גוררת אחריה שיבוש של כל או חלק מהבלוקים המוצפנים ומחייבת להצפינם מחדש.
:(ד) **היפוך סיביות**. במצב מונה ניתן לבצע מניפולציה בסיביות שמשפיעה רק על הסיביות המקבילות בטקסט המקור.

בשל החסרונות האמורים ישנן שלוש התקפות עיקריות נגד הצפנת דיסקים שתמיד ניתנות לביצוע:
# **ניתוח תעבורה**. ניתן לנטר את התקשורת בין התקן ההצפנה לבין מדיית האחסון ולהבחין בשינויים אם בוצעו בטקסט המקור (כי כאמור בלוק זהה עם אותו מפתח ואותו וקטור אתחול יפיק טקסט מוצפן זהה), מה שמאפשר התקפות מסוימות, כגון חילוץ מידע על ידי הבחנה בדפוסי התנהגות, סיבתיות או הקשר.
# **הילוך חוזר** (replay). אם לתוקף גישה ברמת קריאה/כתיבה למדיית האחסון, הוא תמיד יכול להעתיק תכולה של סקטורים, לאתר סקטור שבוצע בו שינוי ולהחליפו בסקטור הקודם, לפני השינוי.
# **רנדומיזציה**. היות שאין אימות, תוקף עם גישה לדיסק גם אם אינו יכול לפענח את המידע המצוי בו יכול לפחות לשבשו על ידי החלפתו בג'יבריש כדי לנתח את אופן ההתמודדות עם טקסט "בלתי צפוי".

ביטחון הצפנת דיסקים הוא לכל היותר כמו מצב ECB עם מפתח שונה עבור כל בלוק. או לחלופין אפשר להציג זאת כצופן בלוקים שבו הבלוק הוא בדיוק באורך הסקטור. אם הסקטור גדול מהבלוק שהצופן מקבל מחלקים את הסקטור לבלוקים בגודל הרצוי ומפעילים את ההצפנה על כל הבלוקים באופן איטרטיבי באופן ששני בלוקים זהים יפיקו תוצאה מוצפנת שונה. כדי להבטיח את דרישה (א) יש להצפין כל סקטור עם מפתח אחר. במקום לאחסן מפתחות רבים אפשר להשתמש במפתח 'מאסטר' יחיד ממנו מפיקים מפתחות הצפנה ככל שיידרש, למשל על ידי הצפנה של ערך ייחודי וחד פעמי עבור כל סקטור שנקרא tweak המשרת כמו וקטור אתחול, ה-tweak לא חייב להיות אקראי או סודי, למשל המספר הסידורי של הסקטור יספיק. החיסרון בזה הוא שכעת יש צורך להפעיל את צופן הבלוקים 2n פעמים עבור n סקטורים. עבור כל סקטור צריך תחילה להצפין את ה-tweak ממנו מייצרים מפתח הצפנה ואיתו מצפינים את הסקטור. אפשר להימנע מכך על ידי הצפנה של tweak עם תמורה פסאודו-אקראית מהירה במקום עם צופן הבלוקים, דהיינו המידע מעורבב (ממוסך) באמצעות XOR עם מפתח שנגזר מהפונקציה, כך מרוויחים שצופן הבלוקים מופעל רק פעם אחת והפונקציה הפסאודו-רנדומלית מבטיחה שלא ייווצר מצב ששני בלוקים יוצפנו עם אותו מפתח על ידי שימוש באינדקס הבלוק כמו במצב מונה. בגלל השימוש ב-XOR לא רצוי מטעמי ביטחון להשתמש ב-tweak עצמו ישירות כמפתח לפונקציית ה-PRP אלא מקובל להצפינו תחילה, לכן משמשים בשני מפתחות הצפנה נפרדים. כלומר עבור כל סקטור תחילה מצפינים את ה-tweak (מספר הסקטור) עם מפתח ההצפנה הראשון, מהתוצאה מייצרים מפתחות מיסוך עבור כל הבלוקים שהסקטור מכיל ובאמצעות המפתח השני מצפינים את כולם עם צופן הבלוקים. זו השיטה המועדפת מהיבט של ביטחון ויעילות. הפעלת צופן הבלוקים מתבצעת רק n+1 פעמים ופונקציית ה-PRP מהירה כך שהיא זניחה ביחס לצופן הבלוקים.

מספר מצבי הפעלה עוצבו בשיטה זו, ביניהם אפשר לציין את: LRW, XEX ו-XTS. מצב ההפעלה LRW שהוצע על ידי ליסקוב, ריבסט ווגנר הוא פרימיטיב קריפטוגרפי שמיישם את רעיון צופן בלוקים שניתן להתאמה. הצופן מקבל מפתח הצפנה וכן "tweak" המשרת בערך כמו וקטור אתחול או Nonce. הנוסחה היא:

:E_K(M \oplus h(T)) \oplus h(T). כאשר h(T) היא פונקציה כלשהי בשדה סופי 2^{128}, המתפקדת מעין פונקציית גיבוב.

## XTS-AES
שמאל|ממוזער|240px|שיטת הצפנה למדיית אחסון הנקראת XTS-AES לפי תקן IEEE P1619
תקן IEEE P1619 אימץ את מצב ההפעלה XTS-AES (לפי שיטת XEX - כלומר "XOR/ENCRYPTION/XOR" כשההצפנה היא עם AES), מצב הפעלה זה פותח במיוחד להצפנת סקטורים גדולים במדייה דיגיטלית. השיטה נקראת teawkable במובן שהיא משתמשת בווקטור אתחול שנקרא tweak בגודל 128 סיביות (16 בתים) כאן מסומן ב-i. ה-tweak משתנה בכל סקטור והוא יכול להיות מספר רץ של הסקטור. בשיטה זו כל בלוק מוצפן פעמיים. המפתח מחולק לשני מפתחות K_1,K_2 כל אחד בגודל הדרוש לצופן הבלוקים, תחילה מצפינים את וקטור האתחול עם המפתח הראשון ולאחר מכן מפעילים פונקציה פסאודו-אקראית פשוטה ומצפינים את התוצאה מחוברת עם בלוק הטקסט הקריא באמצעות המפתח השני.

הבלוק נקרא כאן P ו-j הוא מונה המייצג את מספרו הסידורי של הבלוק בתוך הסקטור. הנוסחה להצפנת בלוק אחד שנקראת כאן \text{XTS-AES}_{K_1,K_2}(P, i, j) כמוצג בתרשים היא:
:T=\text{AES}_{K_2}(i) \otimes \alpha^j
:\text{Return AES}_{K_1}(P\oplus T) \oplus T

הפעלת הצופן בשורה הראשונה מתבצעת רק פעם אחת כיוון ש-i אינו עולה על בלוק אחד. בפענוח מחליפים בשורה השנייה את הקריאה לפונקציית ההצפנה בפונקציית הפענוח \text{AES}^{-1}_{K_1}.

ההכפלה ב-\alpha^j היא כפל של הבלוק המוצפן, אותו רואים כפולינום מעל השדה הבינארי המורחב GF(2^{128}) בחזקות j של הפולינום \alpha או \text{0x02} בייצוג הקסדצימלי, מודולו 2^{128}. הכפל האמור מסומן ב-\otimes . לצורך הצמצום המודולרי משתמשים בפולינום הפרימיטיבי x^{128}+x^7+x^2+x+1 כדי שהתוצאה תישאר אלמנט בשדה. מבחינה פרקטית פעולת הכפל בשדה GF(2^{128}) יכולה להתבצע על ידי רקורסיה של j הזזות (shift) השקולות לכפל ב-\alpha וצמצום מודולרי באמצעות פעולת XOR מותנת (כאשר הסיבית הגבוהה היא '1') עם הערך x^7+x^2+x+1 או בייצוג הקסדצימלי \text{0x87}. אפשר לראותה כפעולה חיסור במודולוס הדרושה כאשר מתרחשת גלישה (להסבר נוסף ראה OMAC), אפשר להכין את הערכים הללו מראש או להשתמש בטבלאות חיפוש, בהתאם לאופי היישום והחומרה, אך צריך להביא בחשבון התקפת ערוץ צדדי שמודדת את זמני הביצוע השונים. להלן דרך בטוחה לביצוע פעולת הכפל בשדה GF(2^{128}) בחלוקה ל-16 בתים המסומנים a_0,a_1,...,a_{15}:

הכפל מתבצע בית אחר בית, הכפל ב-2 אינו אלא הזזה לשמאל והחילוק ב-128 הוא הזזה לימין 8 פוזיציות. הפעולה \left\lfloor a_{k-1}/128\right\rfloor מעבירה את סיבית הגלישה לבית הבא. ואין צורך לבצע מודולו 128 אפשר לעשות \text{AND 0x7F} במקום.
300px|ממוזער|שמאל|שתי ההצפנות האחרונות של XTS-AES
להצפנת סקטור שלם במשתמשים בטכניקה שנקראת גנבת טקסט-מוצפן. תחילה מחלקים אותו ל-m+1 בלוקים בגודל המתאים לצופן הבלוקים. כלומר אם הסקטור הוא S אז S=P_0 \ \| \ P_1 \ \| \ ... \| \ P_{m-1} \ \| \ P_m. כאשר m הוא השלם הגדול ביותר כך שמתקיים 128m. יש לשים לב ש-m הבלוקים הראשונים מלאים ואילו הבלוק P_m חלקי או ריק לגמרי (מכיל רק אפסים). ההצפנה של הסקטור מתחלקת לשני מקרים כדלהלן, אם הבלוק האחרון ריק, כלומר |P_m|=0 ההצפנה של כל הסקטור מתבצעת ישירות כך; עבור כל בלוק P_j כאשר j=0,...,m-1 מחשבים את C_j=\text{XTS-AES}_{K_1,K_2}(P_j,i,j) והבלוק המוצפן האחרון C_m יהיה ריק. אם בלוק הטקסט הקריא האחרון אינו ריק דהיינו b=|P_m|>0 אזי מבצעים 'שיכול' בין שני הבלוקים האחרונים כדלהלן; תחילה מחשבים את C'=\text{XTS-AES}_{K_1,K_2}(P_{m-1},i,m-1), הבלוק C_m יהיה b הסיביות הראשונות של C' ואז משרשרים את 128-b הסיביות הנותרות של C' לבלוק הטקסט הקריא האחרון P_m ומתקבל בלוק חדש P' אותו מצפינים כך \text{XTS-AES}_{K_1,K_2}(P',i, m) והתוצאה האחרונה תהיה הבלוק C_{m-1}. שים לב שהבלוק C_m עשוי להיות חלקי. לכן הטקסט המוצפן נשאר באורך זהה לטקסט המקורי.

## ביטחון
הוכח על ידי רוגאווי שביטחון השיטה הוא בסיבוכיות 4.5 q^2/2^n+\epsilon כלומר הביטוי משקף את היתרון שבידי התוקף בהבחנה בין הטקסט המוצפן לבין מחרוזת אקראית כלשהי, כאשר q הוא מספר השאילתות האקראיות לאורקל (בהקשר מעשי - מספר הבלוקים שהוא יכול להצפין) ו-\epsilon מייצג את "היתרון" שלו או אפשר לומר טווח השגיאה. בגלל התקפת יום הולדת קיים חסם עליון שהוא 2^{n/2} שמחייב שלאחר גבול זה התנגשויות חייבות להופיע, לכן כאשר q מתקרב לערך זה יש סבירות משמעותית ש"התקפת הבחנה" תצליח. כלומר שיימצא זוג המקיים P_i\oplus T_i=P_j\oplus T_j עבור שני אינדקסים שונים i\ne j כאשר P הוא הטקסט הקריא ו-T הוא ה-tweak. במקרה זה הטקסטים המוצפנים C_i,C_j המתאימים יהיו זהים אחרי חיבור עם ה-tweak של כל אחד מהם בהתאמה. מזה נובע ש-P_i\oplus C_i=P_j\oplus C_j. כלומר התרחשה התנגשות שמאפשרת לתקוף להבחין בין ההצפנה בשיטה זו לבין טקסט רנדומלי לחלוטין. התקפת הבחנה אינה תאורטית בלבד, באמצעותה התוקף יכול לבצע שינויים בסיביות ספציפיות בטקסט המקורי שמתאים לטקסט המוצפן שהוא תוקף וזאת מבלי לפענחו, בדרך הבאה:
עבור \Delta\ne 0 כלשהו הוא מחשב את P'_i=P_i\oplus\Delta במיקום i ומחליף את הטקסט המוצפן C_j באופן הבא: C'_j=C_j\oplus(C_i\oplus C'_i) והטקסט המוצפן החדש יהיה P'_j=P_j\oplus\Delta, במילים אחרות התוקף הצליח לשנות סיביות מסוימות של הבלוק P_j מבלי שהמותקף יבחין בכך.

## התקפות ערוץ צדדי

קיימות טכנולוגיות הצפנת דיסקים ברמת חומרה הנקראת FDE (קיצור של full-disk encryption) כמו BitLocker או ברמת תוכנה כמו Truecrypt. הצפנת דיסקים ברמת חומרה מעצם טבעה חשופה להתקפת אתחול קשה או אתחול קר (cold boot attack) שהיא התקפת ערוץ צדדי שבה התוקף גונב את סיסמת ההצפנה ממחשב פועל (נעול או לא) על ידי אתחול מחדש וחילוץ הסיסמה מהזיכרון או מהדיסק הקשיח, באמצעות כלים פורנזיים כמו Forensic Disk Decryptor של חברת Elcomsoft, לפני שהיא נמחקת. עקב תופעה פיזיקלית ידועה, המידע בזיכרון המחשב נותר שלם בחלקו למספר דקות לאחר הכיבוי. היות שמערכת ההפעלה צריכה לאחסן את מפתח ההצפנה היכן שהוא בזיכרון בזמן הצפנה/פענוח, קשה למנוע סוג כזה של התקפה גם אם משתמשים במערכת הפעלה בטוחה ברמה של חומרה כמו TMP. כמו כן סכימת הצפנת דיסקים בעייתית גם כאשר המחשב נגנב כשהוא במצב "רדום" אם כאשר מעירים אותו לא מתבצע אתחול דרך BIOS.
כמו כן הצפנת דיסקים ברמת תוכנה חשופה למספר התקפות ערוץ צדדי כמו קריפטואנליזה אקוסטית או רישום הקשות.

## ראו גם
* צופן בלוקים בר התאמה
* הצפנה מאומתת

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

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