GCM

Galois/Counter Mode הוא מצב הפעלה של צופן בלוקים שפותח ב-2005 על ידי ג'ון ויגה מחברת Secure Software ודייוויד מקגרו מסיסקו, המשלב צופן סימטרי במצב מונה ופונקציית גיבוב אוניברסלית מעל שדה סופי מורחב, כדי לייצר הצפנה מאומתת עם מידע נלווה המסומנת בקיצור AEAD לפי פרדיגמה של "הצפנה ואז אימות". השיטה מבוססת על רעיון שהוכח כבטוח על ידי בלייר, קיליאן, רוגווי ואחרים ומסתמך גם על ביטחון הצופן הסימטרי שבבסיסו, בהנחה שהוא תמורה פסאודו-אקראית (צופן AES נראה כעונה להגדרה זו, אם כי לא קיימת הוכחה פורמלית). כמו כן GCM יעיל וקל להטמעה בחומרה ומאפשר ביצועים טובים גם בתוכנה, בעיקר אם מנצלים טבלאות אחזור (lookup table). האלגוריתם מצפין את המידע ומייצר טקסט מוצפן ותג אימות מהמידע המוצפן ומידע נלווה נוסף אם קיים, כאשר תג האימות מבטיח מעצם ההגדרה שלא ניתן יהיה לזייף טקסט מוצפן ותג מתאים ללא ידיעת מפתח ההצפנה הסודי המשותף, כך שפונקציית האימות של המקבל תחזיר 'אמת'. GCM חופשי לשימוש ואינו מעוגן בפטנט או זכויות יוצרים. והוא אומץ על ידי המכון הלאומי לתקנים וטכנולוגיה של ממשלת ארצות הברית בתקן NIST SP800-38D להצפנה מאומתת ובתקן IEEE 802.1AE. הוצע ב-RFC 5288 ונכלל בפרוטוקול SSL. הוא פופולרי בשל ביצועיו הטובים, תפוקתו מהמהירות הידועות כיום להצפנה מאומתת (בערך 3.7 cpb על מעבד אינטל 64 ביט). מפתח הצפנה K {\displaystyle K} באורך המתאים לצופן הבלוקים שבשימוש (בדרך כלל 128 סיביות). מפתח ההצפנה צריך להיות משותף גם למקבל. וקטור אתחול I V {\displaystyle IV} שאינו סודי, בגודל הנע בין בית אחד ל- 2 64 {\displaystyle 2^{64}} בתים. הערך המומלץ לצורך ביצועים אופטימליים הוא 96 סיביות. טקסט מקור P {\displaystyle P} בגודל שבין אפס בתים ל- 2 39 − 256 {\displaystyle 2^{39}-256} . מחרוזת ריקה מסומנת כאן "{}". דטה מאומתת נוספת המסומנת כאן A {\displaystyle A} . זהו מידע גלוי נלווה, שאמור להיות מאומת אך לא מוצפן. בגודל של עד 2 64 {\displaystyle 2^{64}} בתים. טקסט מוצפן C {\displaystyle C} שגודלו בדיוק כגודל P {\displaystyle P} . תג אימות T {\displaystyle T} שגודלו יכול להיות בין 64 ל-128 סיביות (בין שמונה לשישה עשר בתים). אורך התג מסומן כאן ב- t {\displaystyle t} . אלגוריתם הפענוח המאומת מקבל את K , I V , C , A , T {\displaystyle K,IV,C,A,T} ומפיק את הטקסט המקורי P {\displaystyle P} או סימן מיוחד "FAIL" המציין שהאימות נכשל, אם הייתה שגיאה. לפי הגדרת האלגוריתם, הפענוח המאומת יחזיר את P {\displaystyle P} רק אם הערכים חושבו על ידי פונקציית ההצפנה המאומתת של GCM. במידה שאחד מהם שונה אפילו במעט, בסיכוי גבוה מאוד אלגוריתם הפענוח יחזיר הודעת שגיאה. כאשר אז המשמעות היא שאחד הערכים שגוי בגלל תקלה או בשל שינוי זדוני. המידע הנלווה A {\displaystyle A} משמש כמידע תפעולי ועשוי להכיל כתובות IP, פורטים, מספרי גרסאות וכיוצא בזה. אילו בדרך כלל מהווים חלק מהכותר הנלווה למידע כדי לאפשר למערכת בצד השני לטפל בו בצורה נכונה, לכן אמור להיות במצב גלוי. הפרוטוקול מאפשר לאמת ולהבטיח את שלמות המידע הנלווה כדי להגן על סודיות המידע המוצפן מפני התקפת מוצפן-נבחר. המטרה העיקרית של ה- I V {\displaystyle IV} שנקרא גם Nonce היא לספק ערך ייחודי וחד פעמי שנדרש בכל פעם שמפעילים את האלגוריתם עם מפתח K {\displaystyle K} נתון. ה- I V {\displaystyle IV} אינו חייב להיות סודי ויכול להיות מספר אקראי או נומרטור כלשהו שצריך להיות ידוע גם לצד המקבל, המגבלה היחידה היא שלא יחזור על עצמו עם מפתח נתון. ב-GCM וקטור האתחול מאומת. אם P {\displaystyle P} מכיל 0 בתים, ו- A {\displaystyle A} מכיל בתים כלשהם, אזי למעשה מתקבל אימות של A {\displaystyle A} בלבד. והיות ש- A {\displaystyle A} נותר גלוי, במקרה זה GCM מתנהג כקוד אימות מסרים ללא הצפנה. זאת ללא שינוי באלגוריתם. לצורך ההבחנה מסמנים מקרה זה כ-GMAC. הערך t {\displaystyle t} צריך להיות לפחות 64 כדי לקבל רמת ביטחון מינימלי של 2 − 64 {\displaystyle 2^{-64}} . לטענת המפתחים התקפה על GCM של חיפוש רנדומלי של תגים עד שנמצא זיוף, תצליח בהסתברות של ( B + 1 ) 2 − t {\displaystyle (B+1)2^{-t}} כאשר B {\displaystyle B} הוא מספר הבלוקים שהוצפנו. לכן אפקטיבית חוזק התג הוא בסדר גודל של t − lg B {\displaystyle t-{\text{lg}}B} סיביות. מסיבה זו לא מומלץ להצפין עם מפתח נתון יותר מ- 2 68 {\displaystyle 2^{68}} בתים. באלגוריתם הבא E {\displaystyle E} מייצג את צופן הבלוקים, פירוש E ( K , Y ) {\displaystyle E(K,Y)} הוא הצפנה של Y {\displaystyle Y} עם המפתח K {\displaystyle K} . הפונקציה len ( x ) {\displaystyle {\text{len}}(x)} מחזירה ערך בגודל 64 סיביות המייצג את מספר הסיביות של x {\displaystyle x} . הביטוי 0 l {\displaystyle 0^{l}} מתייחס למחרוזת של l {\displaystyle l} אפסים. הביטוי a ‖ b {\displaystyle a\|b} מייצג שרשור, כלומר חיבור של A {\displaystyle A} עם B {\displaystyle B} למחרוזת ארוכה יותר המכילה את שניהם בזה אחר זה. הפונקציה MSB t ( S ) {\displaystyle {\text{MSB}}_{t}(S)} מחזירה את t {\displaystyle t} הסיביות המשמעותיות ביותר של S {\displaystyle S} . הערכים n , u {\displaystyle n,u} מייצגים את חלוקת המסר למקטעים לפי הנוסחה ( n − 1 ) 128 + u {\displaystyle (n-1)128+u} . כאשר 1 ≤ u ≤ 128 {\displaystyle 1\leq u\leq 128} כך ש- P {\displaystyle P} מורכב למעשה ממערך של n − 1 {\displaystyle n-1} בלוקים בגודל 128 סיביות פלוס בלוק אחד בגודל u {\displaystyle u} סיביות המרופד באפסים לפי הצורך כדי להשלימו לגודל בלוק מלא. למעשה מתקבל P 1 , P 2 , . . . , P n − 1 , P n ∗ {\displaystyle P_{1},P_{2},...,P_{n-1},P_{n}^{*}} (הכוכבית מציינת שאורכו של הבלוק האחרון יכול להיות קטן מ-128). וכן לגבי C {\displaystyle C} . והמידע הנלווה A {\displaystyle A} הוא A 1 , A 2 , . . . , A m − 1 , A m ∗ {\displaystyle A_{1},A_{2},...,A_{m-1},A_{m}^{*}} . כאשר סך כל סיביות A {\displaystyle A} הוא ( m − 1 ) 128 + v {\displaystyle (m-1)128+v} . ו- 1 ≤ v ≤ 128 {\displaystyle 1\leq v\leq 128} . הפונקציה incr ( Y ) {\displaystyle {\text{incr}}(Y)} מייצגת קידום ערכו של Y {\displaystyle Y} באחד מודולו 2 32 {\displaystyle 2^{32}} . למעשה Y {\displaystyle Y} יכול להיות גדול מ-32 סיביות אך המונה נשאר בשל הצמצום המודולרי בגודל 32 סיביות. הסימן ⊕ {\displaystyle \oplus } מייצג XOR והפונקציה GHASH מוגדרת להלן. H = E K ( 0 128 ) {\displaystyle H=E_{K}(0^{128})} Y 0 = { I V   ‖   0 31 1 , if  len ( I V ) = 96 GHASH ( H , { } , I V ) , otherwise {\displaystyle Y_{0}={\begin{cases}IV\ \|\ 0^{31}1,&{\text{if }}{\text{len}}(IV)=96\\{\text{GHASH}}(H,\{\},IV),&{\text{otherwise}}\end{cases}}} Y i = incr ( Y i − 1 )  for  i = 1 , . . . , n − 1 {\displaystyle Y_{i}={\text{incr}}(Y_{i-1}){\text{ for }}i=1,...,n-1} C i = P i ⊕ E K ( Y i )  for  i = 1 , . . . , n − 1 {\displaystyle C_{i}=P_{i}\oplus E_{K}(Y_{i}){\text{ for }}i=1,...,n-1} C n ∗ = P n ∗ ⊕ MSB u ( E K ( Y n ) ) {\displaystyle C_{n}^{*}=P_{n}^{*}\oplus {\text{MSB}}_{u}(E_{K}(Y_{n}))} T = MSB t ( GHASH ( H , A , C ) ⊕ E K ( Y 0 ) ) {\displaystyle T={\text{MSB}}_{t}({\text{GHASH}}(H,A,C)\oplus E_{K}(Y_{0}))} במילים, תחילה מצפינים מחרוזת של 128 אפסים עם המפתח הסודי K {\displaystyle K} , לאחר מכן מכינים את ערכו ההתחלתי של המונה Y {\displaystyle Y} לאחר מכן מבצעים איטרציה ומכינים את כל ערכי המונה הדרושים: מחברים את המונים עם בלוקי הטקסט הקריא אחד אחרי השני באמצעות XOR להפקת הטקסט המוצפן ולאימות משתמשים ב-GHASH עם מפתח האימות והמידע הנלווה ומחברים ב-XOR עם הצפנת צופן הבלוקים עם המפתח H {\displaystyle H} (שהוא טקסט מוצפן של וקטור האתחול שהוצפן עם המפתח K {\displaystyle K} . פונקציה רקורסיבית המגדירה את ערכי X i {\displaystyle X_{i}} החל מ- i = 0 {\displaystyle i=0} עד i = m + n + 1 {\displaystyle i=m+n+1} כדלהלן: X i = { 0 , for  i = 0 ( X i − 1 ⊕ A i ) ⋅ H , for  i = 1 , . . . , m − 1 ( X m − 1 ⊕ ( A m ∗   ‖   0 128 − v ) ) ⋅ H , for  i = m ( X i − 1 ⊕ ( C i − m ) ⋅ H , for  i = m + 1 , . . . , m + n − 1 ( X m + n − 1 ⊕ ( C n ∗   ‖   0 128 − u ) ) ⋅ H , for  i = m + n ( X m + n ⊕ ( len ( A )   ‖   len ( C ) ) ) ⋅ H , for  i = m + n + 1 {\displaystyle X_{i}={\begin{cases}0,&{\text{for }}i=0\\(X_{i-1}\oplus A_{i})\cdot H,&{\text{for }}i=1,...,m-1\\(X_{m-1}\oplus (A_{m}^{*}\ \|\ 0^{128-v}))\cdot H,&{\text{for }}i=m\\(X_{i-1}\oplus (C_{i-m})\cdot H,&{\text{for }}i=m+1,...,m+n-1\\(X_{m+n-1}\oplus (C_{n}^{*}\ \|\ 0^{128-u}))\cdot H,&{\text{for }}i=m+n\\(X_{m+n}\oplus ({\text{len}}(A)\ \|\ {\text{len}}(C)))\cdot H,&{\text{for }}i=m+n+1\\\end{cases}}} H = E K ( 0 128 ) {\displaystyle H=E_{K}(0^{128})} Y 0 = { I V   ‖   0 31 1 , if  len ( I V ) = 96 GHASH ( H , { } , I V ) , otherwise {\displaystyle Y_{0}={\begin{cases}IV\ \|\ 0^{31}1,&{\text{if }}{\text{len}}(IV)=96\\{\text{GHASH}}(H,\{\},IV),&{\text{otherwise}}\end{cases}}} T ′ = MSB t ( GHASH ( H , A , C ) ⊕ E K ( Y 0 ) ) {\displaystyle T'={\text{MSB}}_{t}({\text{GHASH}}(H,A,C)\oplus E_{K}(Y_{0}))} Y i = incr ( Y i − 1 )  for  i = 1 , . . . , n {\displaystyle Y_{i}={\text{incr}}(Y_{i-1}){\text{ for }}i=1,...,n} P i = C i ⊕ E K ( Y i )  for  i = 1 , . . . , n {\displaystyle P_{i}=C_{i}\oplus E_{K}(Y_{i}){\text{ for }}i=1,...,n} P n ∗ = C n ∗ ⊕ MSB u ( E K ( Y n ) ) {\displaystyle P_{n}^{*}=C_{n}^{*}\oplus {\text{MSB}}_{u}(E_{K}(Y_{n}))} תג האימות T ′ {\displaystyle T'} מושווה לתג המקורי T {\displaystyle T} שהגיע יחד עם C {\displaystyle C} . אם הם שווים מוחזר P {\displaystyle P} אם לא, מוחזר "FAIL". שים לב שכדי למנוע התקפת תזמון, התהליך מתנהל באופן זהה גם במקרה של שגיאה כלומר במקרה של כישלון FAIL יוחזר רק לאחר שורה 6. אף על פי שאפשר לדעת אם חל שינוי בחלק מהערכים שהתקבלו כבר בשורה 3. בפונקציה GHASH מבוצע כפל מודולרי בשדה הבינארי F 2 128 {\displaystyle \mathbb {F} _{2^{128}}} מודולו 2 128 {\displaystyle 2^{128}} . כלומר רואים במחרוזות הסיביות 'כמקדמים בינאריים' של פולינומים ממעלה נמוכה מ-128 לפי סדר בתים גדול (כלומר הסיבית הכי המשמעותית מייצגת את המקדם הראשון). לצורך הצמצום המודולרי משתמשים בפולינום פרימיטיבי קבוע f ( α ) = α 128 + α 7 + α 2 + α + 1 {\displaystyle f(\alpha )=\alpha ^{128}+\alpha ^{7}+\alpha ^{2}+\alpha +1} המיוצג על ידי המחרוזת R = 11100001   ‖   0 120 {\displaystyle R=11100001\ \|\ 0^{120}} (כלומר הבית הראשון מכיל את 11100001 (0xE1) והיתר אפסים, בסך הכול 128 סיביות או 16 בתים). בפונקציה מתבצע הכפל של הקבוע H {\displaystyle H} (שהוא תוצאת הצפנה של מחרוזת אפסים) במשתנה X {\displaystyle X} הדרך הארוכה לחישוב X ⋅ H {\displaystyle X\cdot H} אינה יעילה, אפשר לפשט את התהליך על ידי רקורסיה של הכפלות בפולינום α {\displaystyle \alpha } המיוצג על ידי האלמנט P {\displaystyle P} המקביל למחרוזת הבינארית '10' (או בבסיס הקסדצימלי 0x02). פעולה זו שוות ערך לפעולת Shift left, כלומר הזזה של כל הסיביות שמאלה (למעלה) פוזיציה אחת, הסיבית המשמעותית ביותר נפלטת והסיבית הראשונה מתאפסת, הפעולה Shift מובנית בכל המעבדים והיא יעילה. אם הסיבית המשמעותית ביותר של X {\displaystyle X} (לפני ההזזה) המיוצגת על ידי X 127 {\displaystyle X_{127}} היא אפס, מתקבל למעשה פולינום ממעלה 127, אחרת התרחשה גלישה ולכן לפי כללי החשבון המודולרי יש צורך לחלק את התוצאה בפולינום הפרימיטיבי f ( α ) {\displaystyle f(\alpha )} ולקחת את השארית. כלומר למצוא q {\displaystyle q} ו- r {\displaystyle r} המקיימים α 128 + α = q ⋅ f + r {\displaystyle \alpha ^{128}+\alpha =q\cdot f+r} . קל לפתור את המשוואה עבור המקרה q = 1 {\displaystyle q=1} כי אז מתקבל r = α 128 + α − f {\displaystyle r=\alpha ^{128}+\alpha -f} . יוצא שהצמצום המודולרי מקביל למעשה לפעולת חיסור אחת במקדמים הנמוכים של f {\displaystyle f} . בשדה בינארי פעולת חיבור מתבצעת על כל המקדמים בנפרד מודולו 2 שהיא מקבילה למעשה לפעולת XOR. היות ש-XOR הופכי של עצמו חיסור זהה לחיבור. בסיכומו של דבר הכפל ב- α {\displaystyle \alpha } דורש רק הזזת כל סיביות המחרוזת פוזיציה אחת ופעולת XOR מותנית אחת עם הקבוע לעיל. שהן כידוע פעולות מהירות וזולות במונחי מחשוב. מכאן הדרך לביצוע כל כפל ביעילות רבה ברקורסיה. כדי לחשב את Y ⋅ X {\displaystyle Y\cdot X} מייצגים את Y {\displaystyle Y} כחזקות של האלמנט P {\displaystyle P} , מבצעים רקורסיה X , X ⋅ P , X ⋅ P 2 , . . . {\displaystyle X,X\cdot P,X\cdot P^{2},...} כלומר בכל שלב מכפילים את X {\displaystyle X} ב- P {\displaystyle P} בשיטה המתוארת ואם Y i = 1 {\displaystyle Y_{i}=1} מבצעים חיבור אחד נוסף ב-XOR (מלבד החיסור המותנה בכפל ב- P {\displaystyle P} ), התוצאה היא ב- Z {\displaystyle Z} כדלהלן: Z = 0 , V = X {\displaystyle Z=0,V=X} for  i = 0  to  127  do: {\displaystyle {\text{for }}i=0{\text{ to }}127{\text{ do:}}} if  Y i = 1  then:  Z = Z ⊕ V {\displaystyle {\text{if }}Y_{i}=1{\text{ then: }}Z=Z\oplus V} V = V ⋅ P {\displaystyle V=V\cdot P} Return  Z {\displaystyle {\text{Return }}Z} מספר הפעמים שיש להפעיל את אלגוריתם הכפל בהצפנה אחת של טקסט בגודל p {\displaystyle p} סיביות הוא ⌈ p / 128 ⌉ + 1 {\displaystyle \left\lceil p/128\right\rceil +1} . וכן אם יש מידע נלווה בגודל q {\displaystyle q} סיביות יש להוסיף ⌈ q / 128 ⌉ + 1 {\displaystyle \left\lceil q/128\right\rceil +1} פעולות כפל. יתרה מזו, אם הזיכרון זמין, אפשר להאיץ את פעולת הכפל על ידי הכנה מוקדמת של טבלאות כפל. כלומר כדי לחשב את X ⋅ H {\displaystyle X\cdot H} אפשר להכין טבלה של תת-קבוצה של חזקות של H {\displaystyle H} . אם מחלקים את 128 הסיביות של H {\displaystyle H} ל-16 בתים, ומכינים 16 טבלאות M 0 , . . . , M 15 {\displaystyle M_{0},...,M_{15}} של 256 ערכים כל אחת, פעולת הכפל של X {\displaystyle X} כלשהו יכולה להיות: Z = M 0 [ x 0 ] ⊕ M 1 [ x 1 ] ⊕ ⋯ ⊕ M 15 [ x 15 ] {\displaystyle Z=M_{0}[x_{0}]\oplus M_{1}[x_{1}]\oplus \cdots \oplus M_{15}[x_{15}]} . הערך X i {\displaystyle X_{i}} מתייחס לבית ה- i {\displaystyle i} של X {\displaystyle X} . הרעיון הוא שאם מבודדים שמונה סיביות של X {\displaystyle X} כלשהו פעולת הכפל ב- H {\displaystyle H} היא תוצאה אחת מתוך 2 8 {\displaystyle 2^{8}} תוצאות אפשריות, כלומר 256 אלמנטים. אם מכפילים ב-16 מתקבל למעשה כל האפשרויות כאשר סך כל הזיכרון המנוצל הוא 65,536 בתים. ויקטור שופ הציע רעיון לצמצם את דרישות הזיכרון במחיר של חישוב ארוך יותר. אפשר להיפטר מכל הטבלאות M i {\displaystyle M_{i}} למעט M 0 {\displaystyle M_{0}} ולבצע את הכפל כדלהלן: H ⋅ X = H ⋅ ⨁ i = 0 15 x i ⋅ P 8 i = ⨁ i = 0 15 ( x i ⋅ H ) ⋅ P 8 i {\displaystyle H\cdot X=H\cdot \bigoplus _{i=0}^{15}x_{i}\cdot P^{8i}=\bigoplus _{i=0}^{15}(x_{i}\cdot H)\cdot P^{8i}} כלומר אפשר לבצע את הכפל ב- P 8 {\displaystyle P^{8}} רקורסיבית יחד עם פעולות XOR. וכן להיעזר בטבלה M 0 {\displaystyle M_{0}} כדי לחשב את x i ⋅ H {\displaystyle x_{i}\cdot H} . אולם תהיה בעיה של עם P 128 {\displaystyle P^{128}} כי הוא חורג מגודל 16 בתים. אפשר להוסיף טבלה R {\displaystyle R} שתכלול את כפולות x {\displaystyle x} ב- P 128 {\displaystyle P^{128}} . בשיטת שופ אפשר לצמצם את דרישות הזיכרון של שתי הטבלאות M 0 {\displaystyle M_{0}} ו- R {\displaystyle R} לסך הכול 256 ועוד 64 בתים במחיר של מעט עבודה נוספת. להלן תיאור אלגוריתם שופ: Z = 0 {\displaystyle Z=0} for  i = 15  down to  1  do: {\displaystyle {\text{for }}i=15{\text{ down to }}1{\text{ do:}}} Z = Z ⊕ M 0 [ X i ] {\displaystyle Z=Z\oplus M_{0}[X_{i}]} A = X 15 {\displaystyle A=X_{15}} for  j = 15  down to  1  do: {\displaystyle {\text{for }}j=15{\text{ down to }}1{\text{ do:}}} Z j = Z j − 1 {\displaystyle Z_{j}=Z_{j-1}} Z = Z ⊕ R [ A ] {\displaystyle Z=Z\oplus R[A]} Z = Z ⊕ M 0 [ X 0 ] {\displaystyle Z=Z\oplus M_{0}[X_{0}]} Return  Z {\displaystyle {\text{Return }}Z} האלגוריתם להכנת הטבלה M 0 {\displaystyle M_{0}} הוא: M 128 = H , i = 64 {\displaystyle M_{128}=H,i=64} While  i > 0  do  {\displaystyle {\text{While }}i>0{\text{ do }}} M i = M 2 i ⋅ P , i = ⌊ i / 2 ⌋ {\displaystyle M_{i}=M_{2i}\cdot P,i=\left\lfloor i/2\right\rfloor } i = 2 {\displaystyle i=2} While  i < 128  do  {\displaystyle {\text{While }}i<128{\text{ do }}} For  j = 1  to  i − 1  do:  M i + j = M i ⊕ M j {\displaystyle {\text{For }}j=1{\text{ to }}i-1{\text{ do: }}M_{i+j}=M_{i}\oplus M_{j}} i = 2 i {\displaystyle i=2i} M 0 = 0 128 {\displaystyle M_{0}=0^{128}} באותה דרך אפשר להכין את יתר הטבלאות M 1 , . . . , M 15 {\displaystyle M_{1},...,M_{15}} . GCM בנוי לפי פרדיגמה של הצפנה מאומתת שנקראת "הצפנה ואז אימות" (encrypt-then-authenticate) שידועה בביטחון שהיא מספקת, בתנאי שהמרכיבים הבסיסיים כמו הצופן הסימטרי ופונקציית הגיבוב בטוחים. ההעדפה של מצב מונה נובעת מתכונת המקביליות ומהפשטות שלו. וניצול כפל פולינומים מעל השדה המורחב G F ( 2 128 ) {\displaystyle GF(2^{128})} נובע גם בשל תכונת האקראיות המוכחת ובשל היעילות במימוש במיוחד בחומרה. פחות מעגלים ופחות עיכובים בצינור עיבוד נתונים. הפולינום של השדה נבחר באופן שיכיל משקל נמוך (מספר סיביות אחד נמוך) והוא נלקח מטבלה של גדיאל סרוסי מהטכניון. לצורך האלגוריתם נדרש רק מפתח הצפנה יחיד, בעוד שמפתח פונקציית האימות נגזר ממנו. השימוש בכפל פולינומים מעל שדה בינארי מורחב, הוכח כבטוח נגד התקפת גלוי-נבחר על ידי בלייר, קיליאן, רוגווי ואחרים. השימוש בפונקציית גיבוב 'אוניברסלית' להבטחת שלמות ואימות כמו בקוד אימות מסרים הוכח כבטוח על ידי ווגמן וקרטר. מצב מונה שהועלה לראשונה על ידי דיפי והלמן ב-1979 הוכח על ידם כיעיל ובטוח. לפי הצהרת המפתחים תפוקת האלגוריתם עם זיכרון של 256 בתים עומדת על כ-90 מחזורי שעון לבית בממוצע. וכן הסיכויים להתקפה מוצלחת כנגד מנגנון האימות הם בהסתברות של 2 − t {\displaystyle 2^{-t}} . ניילס פרגוסון (ממפתחי אלגוריתם Twofish) גילה שתי חולשות במנגנון האימות של GCM כאשר משתמשים בתג אימות קצר כמו 32 או 8 סיביות, בנוסף להערות טכניות לגבי התכנון של GCM. הבעיה הראשונה שהעלה מראה שאפשר להעלות את הסיכויים לזיוף מוצלח לכדי חצי ממה שצפוי, לדוגמה עבור תג אימות בגודל 32 סיביות הסיכויים הם 2 − 16 {\displaystyle 2^{-16}} , שזה גבוה במידה ניכרת ממה שהצהירו המפתחים. הסיבה לבעיה אינה GHASH עצמה כיוון שהפונקציה מוכחת כחד כיוונית והתנגשויות הן בהסתברות של 2 − ( 128 − k ) {\displaystyle 2^{-(128-k)}} עבור 2 k {\displaystyle 2^{k}} בלוקים. הסיבה לנקודת התורפה נעוצה בעובדה שתוצאת GHASH מוצפנת על ידי המפתח באמצעות XOR שכידוע אינו מגן מפני מניפולציה של סיביות הפלט (כלומר קלט עם סיבית שגויה אחת ישפיע רק על הסיבית המקבילה בפלט, זוהי פרצה שמאפשרת התקפה כאשר ידוע איזו סיבית שגויה). אבל הבעיה היותר חמורה היא שבעקבות זיוף מוצלח אחד ניתן להגביר את הסיכויים לחשיפת סיביות אחרות של מפתח האימות H {\displaystyle H} עד כדי חשיפת המפתח כולו אחרי מספר ניסיונות די קצר. ההמלצה שלו היא להשתמש בתג אימות באורך 128 סיביות ולא פחות או במנגנון אימות אחר. אם למשל משנים את GCM כך שלפני XOR עם המפתח מצפינים את התוצאה באמצעות צופן הבלוקים נראה שהבעיה תיפתר על חשבון יעילות. כמו כן מעלה נילס פרגוסון כמה מגבלות ראויות לציון בתכנון GCM. העובדה שאורך המסר המאומת הוגבל ל- 2 36 − 64 {\displaystyle 2^{36}-64} שזה יחסית קצר וכן העובדה שהאלגוריתם אינו מגביל את אורך המסר לגבולות בתים מה שעלול ליצור בעיות תאימות וכן העובדה שבמצב אופטימלי נדרשות טבלאות גדולות כדי להגיע לביצועים גבוהים, מה שלטענתו אינו מעשי. מצב מונה נחשב בעיקרון למצב הפעלה מהיר, בטוח ויעיל. השימוש בפעולות אלגבריות פשוטות בשדה G F ( 2 128 ) {\displaystyle GF(2^{128})} ניתן למימוש יעיל ומאפשר ביצועים טובים הן בתוכנה והן בחומרה (להלן שיטות יישום מהירות ואלגוריתמים). אפשר להשתמש ב-GCM גם כקוד אימות מסרים עצמאי, כאשר אין צורך בהצפנה, ללא מאמץ מיוחד. במקרה שבוצע שינוי במסר לאחר שתג האימות עבורו הוכן, אפשר לחשב את התג מחדש במאמץ שהוא פרופורציונלי למספר הסיביות ששונו. האלגוריתם מקבל וקטור אתחול באורך שרירותי. כך שאפשר לנצל קטע נתונים כלשהו גם אם גודלו עולה על גודל הבלוק שהצופן מקבל. מצב הפעלה של צופן בלוקים CCM OCB EAX McGrew, David A.; Viega, John (2005). "The Galois/Counter Mode of Operation (GCM)". p. 5. Retrieved 20 July 2013. Note that there is a typo in the formulas in the article. Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC On Fast and Provably Secure Message Authentication Based on Universal Hashing Authentication weaknesses in GCM