אריזת מפתח הצפנה

בקריפטוגרפיה, אריזת מפתח הצפנה (באנגלית: Key wrapping) היא מחלקה של אלגוריתמים קריפטוגרפיים המשתמשים בצופן סימטרי ל"עטיפה" (הצפנה) של מפתחות. אלגוריתם אריזת מפתח נועד להגנה על מפתחות הצפנה בעת העברתם ברשת פתוחה או אחסונם במדיית אחסון לא בטוחה. בדרך כלל בונים אלגוריתם כזה על בסיס פרימיטיבים קריפטוגרפיים ידועים כמו פונקציית גיבוב וצופן בלוקים. הוא שונה במעט מאלגוריתם KEM (קיצור של Key Encapsuation Mechanism) המבוסס על מפתח ציבורי. למרות שהמטרות זהות, העברה בטוחה של מפתח הצפנה. אלגוריתם אריזת מפתח יוצא מהנחה בסיסית ששני הצדדים משתפים ביניהם מפתח הצפנה סודי סימטרי ואילו KEM מסתמך על פרוטוקול דוגמת דיפי-הלמן כדי להצפין את מפתח השיחה באמצעות מפתח הצפנה ציבורי ארוך טווח או עושה שימוש בחתימה דיגיטלית.

==רקע==
ב-1997 פרסם NIST בעיה הנקראת בעיית אריזת מפתח כהגדרתם חיפוש דרכים סימטריות יעילות להסתרת ערך סודי קצר כמו מפתח הצפנה ומידע נלווה כלשהו במהלך העברה ברשת פתוחה. ההנחה הבסיסית היא שהצדדים משתפים ביניהם מפתח סודי. שימוש ישיר בצופן בלוקים מהווה בעיה מכמה סיבות. א) יכול להיות שהמפתח יהיה גדול מהבלוק לכן יהיה צורך בסכימת ריפוד בטוחה באופן שכל סיביות המפתח יהיו תלויות בכל סיביות הטקסט המוצפן. למשל מצב הפעלה בטוח כמו מצב מונה (CTR). ב) צופן הבלוקים אינו מספק הבטחת שלמות. ג) מסיבות של יעילות ומניעת התנפחות נדרש אלגוריתם דטרמיניסטי, כלומר היעדר תוספת של מספר אקראי כלשהו. מסיבה זו צפנים העושים שימוש בווקטור אתחול וכן צופן זרם שבדרך כלל מלווה בווקטור אתחול אינם מתאימים. וכן הועלתה בקשה להצעת אלגוריתמים דטרמיניסטיים מבוססי-צופן (cipher-based) לצורך הערכתם ושילובם במודולי הצפנה מאומתת מאושרים. NIST לא הגדיר במדויק את דרישות הביטחון המינימליות או התכונות הספציפיות הנדרשות ממודול כזה, אך הדרישות הבסיסיות שהועלו הן: א) סודיות ב) הגנה על שלמות ג) יעילות ד) שימוש באלגוריתמים תקניים כמו AES כבסיס וה) תכונות נוספות כמו עמידות נגד שימוש בלתי ראוי (במכוון על ידי צד זדוני או שלא במכוון כמו טעויות מפעיל) ואפשרות לשימוש במחולל אקראי בעל איכות נמוכה. יש לציין שאפשר להשיג את המטרות המנויות על ידי שימוש בהצפנה מאומתת במיוחד לאור העובדה שבהצפנת מפתחות שבדרך כלל הם ערכים אקראיים אלגוריתם דטרמיניסטי מספק ואין צורך באקראיות נוספת. חרף זאת קיימת תועלת מעשית בשיטות ממוקדות לאריזת מפתח ויש לכך קשר הדוק לנושא חשוב בקריפטוגרפיה שנקרא "הצפנה מאומתת דטרמיניסטית" בקיצור DAE שמתאימה במיוחד למקרים בהם קיים קושי להשתמש בווקטור אתחול אקראי או ייחודי. סכימה כזו אטרקטיבית במיוחד במקרים בהם נדרשת עמידות נגד שימוש לא ראוי (misuse-resistant), על ידי הפיכת וקטור האתחול לערך קבוע ושימוש בו על ידי שילוב עם הקלט.

מאז ההצעה של NIST פורסמו מספר הצעות כמו ופיתוחים מעשיים הכוללים בין היתר:
*הצעה של NIST מ-2001 שנקראת SP800-38F המבוססת על AES.
*טיוטה X9.102 של קבוצת X9F1 השייכת למכון התקנים האמריקני, הכוללת 4 הצעות:
**AESKW
**TDKW (וריאנט של AESKW)
**AKW1
**AKW2

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

==אלגוריתם אריזת מפתח של NIST==
אלגוריתם אריזת מפתח שנקרא גם KEK נועד למקרה הנפוץ של הצפנת מפתח הצפנה של AES ולפי התקן מבוצע למען הנוחות בחלוקה ל-<math>n</math> בלוקים באורך 64 סיביות. כדי לארוז מפתח AES נדרשים לכל היותר ארבעה בלוקים. על כל פנים ייתכנו מפתחות או ערכים קריפטוגרפיים אחרים כמו מספר אקראי עבור DSA ארוכים יותר לכן לא נקבע גבול עליון. KEK מבוסס בעצמו על AES לכן ביטחונו מושפע בין היתר מאורך מפתח AES המשמש להצפנת המפתח. בתיאור האלגוריתם להלן הפונקציה <math>\text{MSB}_j(W)</math> מחזירה את <math>j</math> הסיביות הכי משמעויות של <math>W</math> לפי סדר בתים קטן. וכן <math>\text{LSB}_j(W)</math> מחזירה את <math>j</math> הסיביות הפחות משמעותיות של <math>W</math>. הסמל <math>\|</math> מייצג שרשור והסימן <math>\oplus</math> הוא XOR. הקלט הוא מערך טקסט קריא: <math>P_1,P_2,...,P_n</math> באורך <math>n</math> בלוקים של 64 סיביות כל אחד, המכיל את המפתח המיועד להסתרה וכן מפתח KEK המיוצג על ידי <math>K</math> (יכול להיות כל מפתח המתאים ל-AES לפי הצורך). הפלט הוא <math>n+1</math> בלוקים של טקסט מוצפן המייצגים את המפתח המוסתר באופן כזה שאם חל בהם שינוי אפילו קל ביותר במהלך ההעברה ניתן לאתרו.

====אלגוריתם KEK אריזת מפתח====
# אתחול
#: מציבים <math>A=IV</math> (ערך התחלתי קבוע להלן).
#: עבור <math>i=1</math> עד <math>n</math> בצע:
#:: <math>R_i=P_i</math>.
# ערכי ביניים
#: עבור <math>j=0</math> עד <math>5</math> בצע:
#:: עבור <math>i=1</math> עד <math>n</math> בצע (בסך הכול <math>6n</math> סבבים):
#::: <math>B=\text{AES}_K(A \ \| \ R_i)</math>
#::: <math>A=\text{MSB}_{64}(B)\oplus t</math> כאשר <math>t=(n\cdot j)+i</math>
#::: <math>R_i=\text{LSB}_{64}(B)</math>
# פלט - המערך <math>C</math> כאשר:
#: <math>C_0=A</math>
#: עבור <math>i=1</math> עד <math>n</math> בצע: <math>C_i=R_i</math>.

====אלגוריתם KEK הסרת אריזה====
# אתחול
#: <math>A=C_0</math>
#: עבור <math>i=1</math> עד <math>n</math> בצע: <math>R_i=C_i</math>.
# ערכי ביניים
#: עבור <math>j=5</math> עד <math>0</math> בסדר יורד בצע:
#:: עבור <math>i=n</math> עד <math>1</math> בסדר יורד בבצע:
#::: <math>B=\text{AES}_K^{-1}((A\oplus t)\ \| \ R_i)</math> כאשר <math>t=(n\cdot j)+i</math>
#::: <math>A=\text{MSB}_{64}(B)</math>
#::: <math>R_i=\text{LSB}_{64}(B)</math>
# פלט
#: עם ערכו של <math>A</math> תואם את הקבוע הצפוי מוחזר המערך <math>P</math> כאשר:
#:: עבור <math>i=1</math> עד <math>n</math> 
#::: <math>P_i=R_i</math>
#:: אחרת מוחזרת הודעת שגיאה.

הערך ההתחלתי הקבוע או וקטור האתחול המסומן IV משמש כאן באופן עקיף להבטחת שלמות המפתח המוסתר. המפתח המוצפן מתקבל כאותנטי אך ורק אם לאחר הפענוח מתקבל ב-<math>A</math> הקבוע הצפוי. ערכו הספציפי נתון לשינויים ותלוי במספר גורמים. כמו למשל אם נדרשת הבטחת שלמות רק במהלך האריזה או ברמה גבוהה יותר. התקן מגדיר מספר קבועים אפשריים כמו: <math>\text{IV}=\text{0xA6A6A6A6A6A6A6A6}</math>.

==ראו גם==
* הצפנה מאומתת
* SIV

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

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