GCM
ויקיפדיה האנציקלופדיה encyclopedia
Galois/Counter Mode הוא מצב הפעלה של צופן בלוקים שפותח ב-2005 על ידי ג'ון ויגה מחברת Secure Software ודייוויד מקגרו מסיסקו, המשלב צופן סימטרי במצב מונה ופונקציית גיבוב אוניברסלית מעל שדה סופי מורחב, כדי לייצר הצפנה מאומתת עם מידע נלווה המסומנת בקיצור AEAD לפי פרדיגמה של "הצפנה ואז אימות". השיטה מבוססת על רעיון שהוכח כבטוח על ידי בלייר, קיליאן, רוגווי ואחרים ומסתמך גם על ביטחון הצופן הסימטרי שבבסיסו, בהנחה שהוא תמורה פסאודו-אקראית (צופן AES נראה כעונה להגדרה זו, אם כי לא קיימת הוכחה פורמלית). כמו כן GCM יעיל וקל להטמעה בחומרה ומאפשר ביצועים טובים גם בתוכנה, בעיקר אם מנצלים טבלאות אחזור (lookup table). האלגוריתם מצפין את המידע ומייצר טקסט מוצפן ותג אימות מהמידע המוצפן ומידע נלווה נוסף אם קיים, כאשר תג האימות מבטיח מעצם ההגדרה שלא ניתן יהיה לזייף טקסט מוצפן ותג מתאים ללא ידיעת מפתח ההצפנה הסודי המשותף, כך שפונקציית האימות של המקבל תחזיר 'אמת'.
GCM חופשי לשימוש ואינו מעוגן בפטנט או זכויות יוצרים. והוא אומץ על ידי המכון הלאומי לתקנים וטכנולוגיה של ממשלת ארצות הברית בתקן NIST SP800-38D[1] להצפנה מאומתת ובתקן IEEE 802.1AE. הוצע ב-RFC 5288 ונכלל בפרוטוקול SSL. הוא פופולרי בשל ביצועיו הטובים, תפוקתו מהמהירות הידועות כיום להצפנה מאומתת (בערך 3.7 cpb על מעבד אינטל 64 ביט).
קלט
- מפתח הצפנה באורך המתאים לצופן הבלוקים שבשימוש (בדרך כלל 128 סיביות). מפתח ההצפנה צריך להיות משותף גם למקבל.
- וקטור אתחול שאינו סודי, בגודל הנע בין בית אחד ל- בתים. הערך המומלץ לצורך ביצועים אופטימליים הוא 96 סיביות.
- טקסט מקור בגודל שבין אפס בתים ל-. מחרוזת ריקה מסומנת כאן "{}".
- דטה מאומתת נוספת המסומנת כאן . זהו מידע גלוי נלווה, שאמור להיות מאומת אך לא מוצפן. בגודל של עד בתים.
פלט
- טקסט מוצפן שגודלו בדיוק כגודל .
- תג אימות שגודלו יכול להיות בין 64 ל-128 סיביות (בין שמונה לשישה עשר בתים). אורך התג מסומן כאן ב-.
פענוח ואימות
אלגוריתם הפענוח המאומת מקבל את ומפיק את הטקסט המקורי או סימן מיוחד "FAIL" המציין שהאימות נכשל, אם הייתה שגיאה. לפי הגדרת האלגוריתם, הפענוח המאומת יחזיר את רק אם הערכים חושבו על ידי פונקציית ההצפנה המאומתת של GCM. במידה שאחד מהם שונה אפילו במעט, בסיכוי גבוה מאוד אלגוריתם הפענוח יחזיר הודעת שגיאה. כאשר אז המשמעות היא שאחד הערכים שגוי בגלל תקלה או בשל שינוי זדוני. המידע הנלווה משמש כמידע תפעולי ועשוי להכיל כתובות IP, פורטים, מספרי גרסאות וכיוצא בזה. אילו בדרך כלל מהווים חלק מהכותר הנלווה למידע כדי לאפשר למערכת בצד השני לטפל בו בצורה נכונה, לכן אמור להיות במצב גלוי. הפרוטוקול מאפשר לאמת ולהבטיח את שלמות המידע הנלווה כדי להגן על סודיות המידע המוצפן מפני התקפת מוצפן-נבחר.
המטרה העיקרית של ה- שנקרא גם Nonce היא לספק ערך ייחודי וחד פעמי שנדרש בכל פעם שמפעילים את האלגוריתם עם מפתח נתון. ה- אינו חייב להיות סודי ויכול להיות מספר אקראי או נומרטור כלשהו שצריך להיות ידוע גם לצד המקבל, המגבלה היחידה היא שלא יחזור על עצמו עם מפתח נתון. ב-GCM וקטור האתחול מאומת. אם מכיל 0 בתים, ו- מכיל בתים כלשהם, אזי למעשה מתקבל אימות של בלבד. והיות ש- נותר גלוי, במקרה זה GCM מתנהג כקוד אימות מסרים ללא הצפנה. זאת ללא שינוי באלגוריתם. לצורך ההבחנה מסמנים מקרה זה כ-GMAC. הערך צריך להיות לפחות 64 כדי לקבל רמת ביטחון מינימלי של . לטענת המפתחים התקפה על GCM של חיפוש רנדומלי של תגים עד שנמצא זיוף, תצליח בהסתברות של כאשר הוא מספר הבלוקים שהוצפנו. לכן אפקטיבית חוזק התג הוא בסדר גודל של סיביות. מסיבה זו לא מומלץ להצפין עם מפתח נתון יותר מ- בתים.
באלגוריתם הבא מייצג את צופן הבלוקים, פירוש הוא הצפנה של עם המפתח . הפונקציה מחזירה ערך בגודל 64 סיביות המייצג את מספר הסיביות של . הביטוי מתייחס למחרוזת של אפסים. הביטוי מייצג שרשור, כלומר חיבור של עם למחרוזת ארוכה יותר המכילה את שניהם בזה אחר זה. הפונקציה מחזירה את הסיביות המשמעותיות ביותר של . הערכים מייצגים את חלוקת המסר למקטעים לפי הנוסחה . כאשר כך ש- מורכב למעשה ממערך של בלוקים בגודל 128 סיביות פלוס בלוק אחד בגודל סיביות המרופד באפסים לפי הצורך כדי להשלימו לגודל בלוק מלא. למעשה מתקבל (הכוכבית מציינת שאורכו של הבלוק האחרון יכול להיות קטן מ-128). וכן לגבי . והמידע הנלווה הוא . כאשר סך כל סיביות הוא . ו-. הפונקציה מייצגת קידום ערכו של באחד מודולו . למעשה יכול להיות גדול מ-32 סיביות אך המונה נשאר בשל הצמצום המודולרי בגודל 32 סיביות. הסימן מייצג XOR והפונקציה GHASH מוגדרת להלן.
מהלכי ההצפנה
במילים, תחילה מצפינים מחרוזת של 128 אפסים עם המפתח הסודי , לאחר מכן מכינים את ערכו ההתחלתי של המונה לאחר מכן מבצעים איטרציה ומכינים את כל ערכי המונה הדרושים: מחברים את המונים עם בלוקי הטקסט הקריא אחד אחרי השני באמצעות XOR להפקת הטקסט המוצפן ולאימות משתמשים ב-GHASH עם מפתח האימות והמידע הנלווה ומחברים ב-XOR עם הצפנת צופן הבלוקים עם המפתח (שהוא טקסט מוצפן של וקטור האתחול שהוצפן עם המפתח .
הפונקציה GHASH
פונקציה רקורסיבית המגדירה את ערכי החל מ- עד כדלהלן:
מהלכי הפענוח
תג האימות מושווה לתג המקורי שהגיע יחד עם . אם הם שווים מוחזר אם לא, מוחזר "FAIL". שים לב שכדי למנוע התקפת תזמון, התהליך מתנהל באופן זהה גם במקרה של שגיאה כלומר במקרה של כישלון FAIL יוחזר רק לאחר שורה 6. אף על פי שאפשר לדעת אם חל שינוי בחלק מהערכים שהתקבלו כבר בשורה 3.