CWC mode

בקריפטוגרפיה, Carter-Wegman Counter הוא מצב הפעלה של צופן בלוקים, המספק הצפנה מאומתת, פועל לפי פרדיגמה "הצפנה ולאחריה אימות" ושייך לקטגוריה AEAD (הצפנה מאומתת עם מידע נלווה). בניגוד לצופן בלוקים כשלעצמו המספק רק סודיות של בלוק בגודל קבוע, CWC מספק סודיות והגנה על שלמות ואימות המסרים המוצפנים בכל אורך רצוי, על ידי הצפנה עם צופן בלוקים סימטרי בעדיפות לאלגוריתם חופשי כמו AES במצב מונה ולאחר מכן ייצור תג אימות באמצעות בפונקציית גיבוב 'אוניברסלית' מקבילית בסגנון קרטר-ווגמן לאימות המידע המוצפן ולאימות טקסט נוסף המשויך אליו אם קיים, שצריך להבטיח את שלמותו אך עליו להישאר גלוי כמו קובץ כותר המכיל הגדרות או כתובות.

CWC פותח ב-2004 על ידי טאדיושי קונו מאוניברסיטת קליפורניה, ג'ון ויאגה מ-Virginia Tech ודאג ווייטינג מ-Hifn כיום חלק מ-exar. אלגוריתם CWC נכלל ברשימת האלגוריתמים המובילים שמנהל NIST לצורך תקן הצפנה מאומתת ולו חמש תכונות חשובות שמציבות אותו כמועמד מועדף לתקן; ביטחון מוכח, מקביליות, ביצועים גבוהים בחומרה ובתוכנה והעדר זכויות יוצרים. במימוש אופטימלי בחומרה אמור להגיע לתפוקה של 10Gbps. הוא מהיר יותר ממצבי ההפעלה CCM ו-EAX אך פחות מהיר בהשוואה לOCB שמוגן בפטנט. מועמדותו של OCB לתקן IEEE 802.11 נדחתה בגלל נושא זכויות יוצרים.

==תיאור כללי==
אם המסר המיועד להצפנה הוא <math>M</math> המכיל מחרוזת סיביות באורך כלשהו והמידע הנלווה הוא <math>A</math> המכיל מחרוזת באורך כלשהו של נתונים לא סודיים. האלגוריתם מצפין את <math>M</math> באמצעות מפתח הצפנה אקראי <math>K</math> ומפיק טקסט מוצפן <math>\sigma</math> ולאחר מכן מאמת את <math>\sigma</math> ואת <math>A</math> באמצעות מפתח האימות שנגזר ממפתח ההצפנה, על ידי ייצור תג אימות <math>\tau</math> באורך הרצוי שנשלח יחד עם הטקסט המוצפן לצד המקבל ושמאפשר לו להבטיח שהמסר המוצפן לא שונה או הוחלף במהלך ההעברה. תג האימות מבטיח מעצם ההגדרה שתוקף פוטנציאלי לא יוכל לזייפו. כלומר ליצור תג אימות תקף עבור מסר מוצפן כלשהו שלא הגיע מהשולח האותנטי ללא ידיעת מפתח ההצפנה הסודי שהשולח והמקבל משתפים ביניהם. ההעדפה היא שגודל בלוק של צופן הבלוקים יהיה 128 סיביות ומספר הקריאות לצופן הבלוקים הוא <math>\left \lceil |M|/128\right \rceil+2</math>. פונקציית הגיבוב המשמשת לאימות מבוססת על חישוב פולינומים מודולו הראשוני <math>2^{127}-1</math>. המעלה של פולינום האימות היא <math>d=\left \lceil |A|/96\right \rceil +\left \lceil|M|/96\right \rceil</math>. החישובים ניתנים להאצה באמצעות טבלאות. למשל אם מספר פעולות הכפל בחישוב פולינום אחד הוא <math>d</math> כשכל אחד מהם צורך <math>127\times 127</math> פעולות בסיביות, הרי בשימוש בטבלת חזקות בגודל <math>n</math> אפשר לקצר את מספר הפעולות ל-<math>d-m</math> פעולות כפל בגודל <math>96\times 127</math> ועוד <math>m</math> פעולות של כפל מלא, כאשר <math>m=\left \lceil(d+1)/n\right \rceil -1</math>.

===סימנים מוסכמים===
בתיאור האלגוריתם יופיעו הסימנים הבאים: אם <math>N</math> ו-<math>l</math> שלמים חיוביים כך שמתקיים <math>N < 2^l</math> אזי הפונקציה <math>\text{tostr}(N,l)</math> פירושה הקידוד של <math>N</math> כמחרוזת של <math>l</math> סיביות לפי סדר בתים גדול (big-endian). בסדר בתים גדול הסיבית המשמעותית ביותר לא נחשבת כסיבית הסימן. לדוגמה המספר 30 בבסיס בינארי הוא המחרוזת "11110". אם <math>x</math> ו-<math>y</math> הן מחרוזות סיביות אזי <math>|x|</math> הוא אורך המחרוזת והביטוי <math>x\oplus y</math> הוא XOR של <math>x</math> עם <math>y</math>. הפונקציה <math>\text{toint}(x)</math> מייצגת את השלם המקביל למחרוזת <math>x</math> לפי סדר בתים גדול. לדוגמה <math>\text{toint}(\text{10000010})=2^7+2=130</math>. אם נתונה הסיבית <math>b</math> הביטוי <math>b^n</math> מתייחס לסיבית <math>b</math> כשהיא משוכפלת <math>n</math> פעמים למשל <math>0^7=0000000</math>. הביטוי <math>y \stackrel{\$}{\longleftarrow} f(x)</math> פירושו הפלט <math>y</math> של הפונקציה <math>f</math> עם הקלט <math>x</math> ומחרוזת פסאודו-אקראית כלשהי שנבחרה באופן אחיד מתוך מרחב המחרוזות האפשריות, כך ש-<math>f</math> היא PRF.

אלגוריתם ההצפנה הסימטרי המסומן בקיצור <math>\mathcal{SE}</math> שבשימוש CWC, מיוצג על ידי אוסף של שלושה אלגוריתמים <math>\mathcal{SE}=(\mathcal{K}_e,\mathcal{E},\mathcal{D})</math> מעל מרחב מפתח כלשהו <math>\text{KeySp}_{se}</math>, מרחב Nonce (וקטור אתחול) המסומן <math>\text{NonceSp}_{se}\subseteq \{0,1\}^n</math>, מרחב המידע <math>\text{MsgSp}_{se}\subseteq \{0,1\}^*</math> ומרחב המידע הנלווה <math>\text{AdSp}_{se}\subseteq \{0,1\}^*</math> באורך שרירותי כלשהו. הסימון CWC-BC-tl מתייחס למצב ההפעלה CWC עם צופן בלוקים ספציפי המכונה כאן בקיצור BC ועם אורך תג רצוי <math>tl</math> למשל במקרה של AES עם תג באורך 96 סיביות אפשר להחליפו בסימון CWC-AES-96. המפתח <math>K</math> מופק על ידי <math>K \stackrel{\$}{\longleftarrow} \mathcal{K}_e</math> יהיה באורך שנקבע לפי האלגוריתם ולפי העדפה (לפחות 128 סיביות). ה-Nonce צריך להיות באורך <math>n=88</math> סיביות. המסר <math>M</math> והמידע הנלווה <math>A</math>, מחרוזות בינאריות באורך שאינו עולה על <math>2^{32}-1</math> בלוקים של 128 סיביות. הביטוי <math>\sigma=BC_K(M)</math> מתייחס להפעלה של צופן הבלוקים עם המפתח <math>K</math> על המסר <math>M</math> והפלט הוא <math>\sigma</math>.

===תיאור האלגוריתם===
CWC מורכב משישה מודולים המתוארים בפסאודו קוד הבא:

====אלגוריתם הכנת מפתח====
<div class="mw-content-ltr">
:<math>\mathcal{K}</math>
::<math>K \stackrel{\$}{\longleftarrow} \{0,1\}^{kl}</math>
::<math>\text{Return }K</math>
</div>
האלגוריתם בוחר מפתח אקראי כלשהו מתוך מרחב המפתחות, המשמש להצפנה ולהכנת מפתח האימות.

====אלגוריתם ההצפנה====
<div class="mw-content-ltr">
:<math>\mathbf{CWC}\text{-}\mathbf{ENC}_K(N,A,M)</math>
#<math>\sigma=\text{CWC-CTR}_K(N,M)</math>
#<math>\tau=\text{CWC-MAC}_K(N,A,\sigma)</math>
#<math>\text{Return }\sigma \ \| \ \tau</math>
</div>

הפונקציה מנצלת את הפונקציות CWC-CTR ו-CWC-MAC המתוארות להלן, כדי להצפין ולאמת את המידע. הפלט הוא <math>\sigma,\tau</math> המשורשרים יחד. <math>\sigma</math> הוא הטקסט המוצפן והוא באורך טקסט המקור ו-<math>\tau</math> הוא תג האימות והוא באורך המוגדר על ידי הפרמטר <math>tl</math>. כך שהתנפחות הטקסט המוצפן אינה משמעותית.

====אלגוריתם פענוח====
<div class="mw-content-ltr">
:<math>\mathbf{CWC}\text{-}\mathbf{DEC}_K(N,A,C)</math>
#<math>\text{If }|C|<\text{ tl then return INVALID}</math>
#<math>\text{Parse }C\text{ as }\sigma \ \| \ \tau\text{ where }| \tau |=tl</math>
#<math>\text{If }A\notin \text{AdSp}_{\text{CWC-BC-tl}} \text{ or }\sigma\notin \text{MsgSp}_{\text{CWC-BC-tl}}\text{ then Return INVALID}</math>
#<math>\text{If }\tau \ne \text{CWC-MAC}_K(N,A,\sigma)\text{ then return INVALID}</math>
#<math>M=\text{CWC-CTR}_K(N,\sigma)</math>
#<math>\text{Return }M</math>
</div>

יש לשים לב שכדי למנוע התקפת תיזמון, במקרה שגיאה כשהאלגוריתם מחזיר INVALID רצוי שלא יהיה ניתן להבחין באיזה שלב ארעה השגיאה (שורות 3, 4).

====אלגוריתם הפעלת מצב מונה====
<div class="mw-content-ltr">
:<math>\mathbf{CWC}\text{-}\mathbf{CTR}_K(N,M)</math>
#<math>\alpha= \left \lceil |M|/128 \right \rceil</math>
#<math>\text{For } i=1\text{ to }\alpha\text{ do: }s_i=\text{BC}_K(10^7\ \| \ N \ \| \ \text{tostr}(i,32))</math>
#<math>x=\text{first }|M| \text{ bits of }s_1\| s_2 \| \cdots \| s_\alpha</math>
#<math>\sigma=x\oplus M</math>
#<math>\text{Return }\sigma</math>
</div>

הפונקציה מיישמת הצפנה במצב 'מונה', המונה מורכב מוקטור אתחול ואינדקס <math>i</math>, שמוצפנים יחד באמצעות צופן הבלוקים BC, ממנו מייצרים באופן איטרטיבי זרם-מפתח באורך הרצוי המשמש להצפנת המסר <math>M</math> ב-XOR כמו בצופן זרם.

====אלגוריתם גיבוב====
<div class="mw-content-ltr">
:<math>\textbf{CWC-HASH}_K(A,\sigma)</math>
#<math>Z=\text{ last }127\text{ bits of BC}_K(110^{126})</math>
#<math>K_h=\text{toint}(Z)</math>
#<math>l=\text{ min integer such that }96\text{ divides } |A||0^l|</math>
#<math>l'=\text{ min integer such that }96\text{ divides }|\sigma||0^l|</math>
#<math>X=A \ \| \ 0^l \ \| \ \sigma \ \| \ 0^{l'}</math>
#<math>\beta=|X|/96</math>
#<math>X=X_1,X_2,...,X_\beta</math>
#<math>\text{For }i=1\text{ to }\beta\text{ do: } Y_i=\text{toint}(X_i)</math>
#<math>l_\sigma=|\sigma|/8</math>
#<math>l_A=|A|/8</math>
#<math>Y_{\beta+1}=2^{64}\cdot l_A+l_\sigma</math>
#<math>R=Y_1K_h^\beta+\cdots+Y_\beta K_h+Y_{\beta+1}\text{ mod }(2^{127}-1)</math>
#<math>\text{Return tostr}(R,128)</math>
</div>

הפונקציה מייצרת ערך גיבוב (hash) מהטקסט המוצפן <math>\sigma</math> ומהמידע הנלווה <math>A</math> כשהם מרופדים באפסים כנדרש כדי שיהיו כפולות של 96 סיביות ומשורשרים למחרוזת אחת ארוכה שאליה מתייחסים כאל פולינום כשהמקדמים שלו הם שלמים בגודל 96 סיביות כל אחד. תוצאת הפונקציה <math>R</math> היא חישוב הפולינום המתואר, מודולו המספר הראשוני <math>2^{127}-1</math>.

==== אלגוריתם MAC ====
<div class="mw-content-ltr">
:<math>\mathbf{CWC}\text{-}\mathbf{MAC}_K(N,A,\sigma)</math>
#<math>R=\text{BC}_K(\text{CWC-HASH}_K(A,\sigma))</math>
#<math>\tau=\text{BC}_K(10^7 \ \| \ N \ \| \ 0^{32})\oplus R</math>
#<math>\text{Return first }tl\text{ bits of }\tau</math>
</div>

קוד האימות מוכן באמצעות חיבור ב-XOR של תוצאת פונקציית הגיבוב המתוארת לעיל והצפנה של וקטור האתחול באמצעות צופן הבלוקים <math>\text{BC}</math> עם מפתח ההצפנה <math>K</math>. התוצאה היא <math>tl</math> הסיביות הראשונות של <math>\tau</math>.

===תמורה פסאודו-אקראית===

הגדרת הביטחון של CWC מבוססת על הרעיון של לובי וראקוף לגבי תמורה פסאודו-אקראית (PRP). אם <math>E:\{0,1\}^k\times \{0,1\}^L \rightarrow \{0,1\}^L</math> הוא צופן בלוקים כלשהו והביטוי <math>\text{Perm}(L)</math> מייצג את קבוצת כל התמורות האפשריות מעל <math>\{0,1\}^L</math>. אם נתון יריב המנסה לתקוף את המערכת, המסומן בקיצור <math>A</math> ויש לו גישה לאורקל המחזיר סיבית אחת (אמת או שקר). אזי אומרים ש:
:<math>\text{Adv}_F^{prp}(A)=\Pr[f \stackrel{\$}{\longleftarrow} E : A^{f(\cdot)}=1]-\Pr[g \stackrel{\$}{\longleftarrow} \text{Perm}(L):A^{g(\cdot)}=1]</math>
ופירושו שכדי שהצופן <math>E</math> יהיה בטוח, ה"יתרון" שבידי יריב בעל יכולת סבירה, המריץ את PRP, המאפשר לו להבחין (distinguish) בין תוצאות של מימוש אקראי כלשהו של <math>E</math> לבין תמורה אקראית Perm "זניח". צופן מודרני כמו AES נחשב כ-PRP בטוח לפי הגדרה זו (אם כי זה לא הוכח).

===מקביליות===
בהצפנה במצב מונה אפשר לחלק את העבודה בין כמה יחידות עיבוד. כל יחידה יכולה לחשב בנפרד את הקטע המתאים מזרם המפתח לפי אינדקס הבלוק <math>i</math>, המפתח <math>K</math> וה-Nonce. הליבה של מנגנון האימות בסגנון קרטר-ווגמן ניתנת גם היא לביצוע מקבילי בשל העובדה שמנגנון האימות ממיר את זוג הערכים (<math>A,\sigma</math>) לפולינום
:<math>Y_1x^n+Y_2x^{n-1}+Y_3x^{n-2}+\cdots +Y_nx+Y_{n+1}\text{ mod }(2^{127}-1)</math>
שימו לב שהמקדמים <math>Y_i</math> הם שלמים בגודל 96 סיביות ו-<math>x</math> הוא שלם מודולו <math>2^{127}-1</math>. אפשר לראות שחישוב פולינום זה יכול להתבצע באופן מקבילי כיוון שאפשר לכתוב את הפולינום המתואר כך
:<math>(Y_1y^m+Y_3y^{m-1}+\cdots+Y_n)+(Y_2y^m+Y_4y^{m-1}+\cdots+Y_{n+1})\text{ mod }(2^{127}-1)</math>
כאשר <math>y=x^2\text{ mod }(2^{127}-1)</math> ו-<math>m=(n-1)/2</math>. לצורך ההדגמה נניח ש-<math>n</math> אי-זוגי. כעת אפשר לחשב את שני צידי המשוואה במקביל ולחברם לאחר מכן. בדרך זו אפשר להשיג מקביליות נוספת על ידי חלוקה ל-<math>j</math> פולינומים ב-<math>y'=x^j\text{ mod }(2^{127}-1)</math>.

===יתרונות וחסרונות===
*ביטחון מוכח; CWC נחשב לאלגוריתם AEAD בטוח בהנחה שצופן הבלוקים שביסודו בטוח. הנחה זו סבירה כי לדעת הרוב אלגוריתם כמו AES נחשב PRP (פרמוטציה פסאודו-אקראית). CWC מבטיח סודיות, אימות והבטחת שלמות המידע <math>M</math> ומידע נלווה <math>A</math> בהינתן וקטור אתחול כלשהו <math>N</math> ומפתח אקראי כלשהו <math>K</math>.
*כשל מצטבר; לאור האמור בהנחה שצופן הבלוקים שבשימוש בטוח, אפשר להוכיח שכל ניסיון זיוף מצד יריב בעל עוצמת חישוב סבירה יתגלה בסבירות גבוהה מאוד.
*מקביליות; CWC ניתן ליישום באופן מקבילי במיוחד בחומרה להשגת תפוקה גבוהה יותר. מידת המקביליות ניתנת לשליטה בידי המיישם. ביישום ממוטב בחומרה אפשר להגיע לתפוקה של 50 גיגה לשנייה.
*מפתח הצפנה; CWC מוגדר כאלגוריתם עם מפתח הצפנה יחיד אם כי פנימית האלגוריתם משתמש בשני מפתחות שונים להצפנה ואימות. מפתח הגיבוב המשמש לאימות נגזר ממפתח ההצפנה הראשי.
*וקטור אתחול; ב-CWC נקבע וקטור האתחול בקיצור IV לגודל 11 בתים. האלגוריתם בטוח בתנאי שלא נעשה שימוש חוזר ב-IV להצפנת שני מסרים שונים, עם אותו מפתח. וקטור האתחול יכול להיות כל מספר ייחודי כמו מונה ואינו חייב להיות סודי.
*דרישות זיכרון; CWC ניתן ליישום בכמה אופנים, בעיקרון דרישות הזיכרון המינימליות הן בעצם דרישות הזיכרון של צופן הבלוקים שביסוד האלגוריתם. למשל אפשר ליישם את AES ללא צריכת זיכרון, אך קיימים יישומים ממוטבים שצורכים 4K בתים. כאשר מיישמים את אלגוריתם האימות של CWC באמצעות טבלאות, דרישת הזיכרון עולה בהתאם.
*הכנה מוקדמת; במצב מונה אפשר להכין מראש את זרם מפתח ההצפנה ללא תלות בטקסט הקריא. אך לא ניתן לחשב מראש את פלט CWC-HASH המשמש לאימות. הכנה מוקדמת, אם ערכים מסוימים קבועים או משתנים לעיתים רחוקות, מאפשרת שיפור בביצועים על חשבון צריכת זיכרון.
*אורך מקסימלי; המסר הארוך ביותר שניתן להצפנה באמצעות CWC הוא <math>128\cdot (2^{32}-1)</math> סיביות. CWC לא הוגדר לטפל בכל אורך רצוי אלא רק בכפולות של 128 סיביות.
*התנפחות; תוצאת האלגוריתם היא המינימלית האפשרית במונחים של צופן בלוקים, שהוא אורך הטקסט המוצפן <math>\sigma</math> פלוס אורך התג <math>tl</math>.
*יעילות; מספר הקריאות לצופן הבלוקים הפנימי הוא לכל היותר <math>\left \lceil |M|/128\right \rceil+3</math> בשל הצורך בקריאה אחת נוספת להכנת מפתח האימות.
*און ליין; אפשר להצפין או לפענח מיידית חלק מהמידע שנעשה זמין ללא תלות בחלקים אחרים. לעובדה זו יתרון בהזרמת מדיה, אולם יש לזכור שהמקבל אינו יכול לוודא את שלמות המידע שהתקבל עד שיגיעו כל החלקים. הוא יכול לאחסן את המידע בחוצץ זמני ולהמתין להגעת יתר החלקים.
*זכויות יוצרים; לפי הצהרת המפתחים CWC חופשי לשימוש ואינו מוגן בפטנט או זכויות יוצרים.
*פשטות; לטענת המפתחים CWC פשוט וקל ליישום ולהטמעה בתוכנה או בחומרה.

==ראו גם==
* מצב הפעלה של צופן בלוקים
* OCB
* GCM

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

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