**RC6** הוא צופן בלוקים סימטרי שפותח ב-1998, על ידי רונלד ריבסט יחד עם Matt Robshaw ,Ray Sidney ו-Yiqun Lisa Yin, מחברת RSA ו-MIT עבור תקן ההצפנה המתקדם שהחליף את DES. זהו דור ההמשך של צופן RC5 שפותח במיוחד כדי להתאים לדרישות התקן והיה מבין חמשת המועמדים המובילים (מקום רביעי אחרי Twofish). כקודמו RC6 עושה שימוש נרחב בהזזה מעגלית בסיביות (bitwise rotation) תלויית מידע. אולם נוספו בו מאפיינים חדשים; הוא מנצל ארבעה אוגרים במקום שניים וכולל כפל מודולרי בשלמים שמגביר באופן ניכר את רמת הפיזור (diffusion) לסבב. מה שמניב ביטחון טוב יותר בפחות סבבים ובתפוקה גבוהה יותר. כיתר המועמדים שעלו לגמר במהלך התחרות הוכרז כי לא נמצאו התקפות יעילות נגדו. RC6 רשום כפטנט, שמו הוא סימן רשום והזכויות עליו שייכות לחברת RSA. ייתכן שהשימוש בו מצריך רישיון (החברה הצהירה כי אם ייבחר על ידי התקן יהיה השימוש בו חופשי אולם לא ניתנה כל הצהרה נוספת לאחר סגירת התחרות).

שיקולי פיתוח
------------

RC6 נולד בעקבות הרצון להתאים את צופן RC5 שיצא ב-1995 לתקן המתקדם ובעקרון הם דומים בפשטותם הרבה. את השם RC ניתן לפרש כקיצור של Rivest Cipher או Ron's Code. אף על פי שלא התגלו התקפות מעשיות מוצלחות כנגד RC5, מחקרים גילו אפשרות להתקפה תאורטית שנובעת מהעובדה שמידת ההזזה המעגלית אינה מושפעת מכל סיביות האוגרים. הפתרון היה הוספת כפל שלמים מודולרי. בנוסף, כדי לעמוד בדרישות התקן על הבלוק להיות 128 סיביות לפחות. למרות היותו מהיר RC5 מכיל רק שני אוגרי 32 סיביות לכן לא ניתן היה להרחבה ביעילות כדי להגיע ל-128 סיביות ללא שימוש באוגרים גדולים יותר שהתקן אינו תומך בהם, במקום זאת הוחלט להגדיל את מספר האוגרים. והתוצאה היא RC6 – בטוח ומהיר יותר וכמו קודמו שומר על פשטות וביצועים גבוהים בתוכנה.

תיאור האלגוריתם
---------------

RC6 הוא אלגוריתם פרמטרי המוגדר על ידי הסימון **RC6-w/r/b**. גודל מילה הוא {\displaystyle w} סיביות, מספר הסבבים הוא {\displaystyle r} והמפתח בגודל {\displaystyle b} בתים, לצורך התקן נקבע {\displaystyle w=32,r=20} והמפתח יכול להיות {\displaystyle b\in \{16,24,32\}} בתים. האלגוריתם פועל על ארבע מילים בגודל {\displaystyle w} תוך שימוש בפעולות הבאות:

|  |  |
| --- | --- |
| {\displaystyle a+b} או {\displaystyle a-b} | חיבור וחיסור שלמים מודולו {\displaystyle 2^{w}} |
| {\displaystyle a\oplus b} | חיבור XOR במילים בגודל 32 סיביות |
| {\displaystyle a\times b} | כפל שלמים מודולו {\displaystyle 2^{w}} |
| {\displaystyle a\lll b} או {\displaystyle a\ggg b} | הזזה מעגלית של {\displaystyle a} שמאלה או ימינה לפי כיוון החצים במספר פוזיציות לפי {\displaystyle {\mbox{lg }}w} הסיביות הראשונות של {\displaystyle b} (כאשר {\displaystyle {\mbox{lg}}} מייצג לוגריתם בבסיס 2, במקרה של {\displaystyle w=32} לפי התקן, 5 סיביות). |

הקלט הוא 128 סיביות טקסט גלוי המחולקות לארבע מילים בגודל 32 סיביות {\displaystyle A,B,C,D} לפי סדר בתים קטן (הסיביות הראשונות של הקלט מוצבות בבית הראשון של {\displaystyle A}). וכן מפתח מורחב (ראה להלן) שהוא מערך של 43 מפתחות-סבב בגודל 32 סיביות כל אחד, המסומן {\displaystyle S[0,...2r+3]}. בתיאור הצופן, סבב מתייחס לתהליך דמוי רשת פייסטל, דהיינו בכל סבב מחצית סיביות הקלט עוברות טרנספורמציה בהתאם למחצית השנייה ולאחר מכן מחליפים מקומות לפי סדר {\displaystyle (A,B,C,D)=(B,C,D,A)}. להלן פסאודו קוד.

### הצפנה

{\displaystyle B=B+S[0]}
{\displaystyle D=D+S[1]}
{\displaystyle {\mbox{For }}i=1{\mbox{ to }}r{\mbox{ do:}}}
{\displaystyle t=(B\times (2B+1)\lll {\mbox{lg }}w}
{\displaystyle u=(D\times (2D+1)\lll {\mbox{lg }}w}
{\displaystyle A=((A\oplus t)\lll u)+S[2i]}
{\displaystyle C=((C\oplus u)\lll t)+S[2i+1]}
{\displaystyle (A,B,C,D)=(B,C,D,A)}
{\displaystyle A=A+S[2r+2]}
{\displaystyle C=C+S[2r+3]}

### פענוח

{\displaystyle C=C-S[2r+3]}
{\displaystyle A=A-S[2r+2]}
{\displaystyle {\mbox{For }}i=r{\mbox{ downto }}1{\mbox{ do:}}}
{\displaystyle (A,B,C,D)=(D,A,B,C)}
{\displaystyle u=(D\times (2D+1)\lll {\mbox{lg }}w}
{\displaystyle t=(B\times (2B+1)\lll {\mbox{lg }}w}
{\displaystyle C=((C-S[2i+1])\ggg t)\oplus u}
{\displaystyle A=((A-S[2i])\ggg u)\oplus t}
{\displaystyle D=D-S[1]}
{\displaystyle B=B-S[0]}

הרחבת מפתח
----------

תהליך הרחבת המפתח תואם את תהליך הרחבת המפתח של RC5, עם יותר מילות מפתח. המפתח מורחב ממפתח הצופן {\displaystyle b} המסופק על ידי המשתמש כשהוא מרופד באפסים לפי הצורך ומיוצג על ידי מערך {\displaystyle L} המכיל {\displaystyle c} מילים בגודל {\displaystyle w} סיביות. אם המפתח {\displaystyle b=0} אזי {\displaystyle c=1} ו-{\displaystyle L[0]=0}. מספר המילים הדרוש למפתח המורחב {\displaystyle S} הוא {\displaystyle 2r+4}. מכינים מערך {\displaystyle S[0,...2r+3]} תוך שימוש בקבוע {\displaystyle P\_{32}={\mbox{B7E15163}}} שהוא ייצוג הקסדצימלי של {\displaystyle e-2} (כאשר {\displaystyle e} הוא בסיס הלוגריתם הטבעי) ובקבוע {\displaystyle Q\_{32}={\mbox{9E3779B9}}} שהוא ייצוג הקסדצימלי של {\displaystyle \phi -1} כאשר {\displaystyle \phi } מייצג את יחס הזהב (אילו ערכים שרירותיים שאפשר להחליפם באחרים להתאמה אישית) מבצעים כדלהלן:

{\displaystyle S[0]=P\_{32}}
{\displaystyle {\mbox{For }}i=1{\mbox{ to }}2r+3{\mbox{ do:}}}
{\displaystyle \{}
{\displaystyle S[i]=S[i-1]+Q\_{32}}
{\displaystyle \}}
{\displaystyle A=B=i=j=0}
{\displaystyle v=3\times {\mbox{max}}\{c,2r+4\}}
{\displaystyle {\mbox{For }}s=1{\mbox{ to }}v{\mbox{ do:}}}
{\displaystyle \{}
{\displaystyle A=S[i]=(S[i]+A+B)\lll 3}
{\displaystyle B=L[j]=(L[j]+A+B)\lll (A+B)}
{\displaystyle i=(i+1){\mbox{ modulo }}(2r+4)}
{\displaystyle j=(j+1){\mbox{ modulo }}c}
{\displaystyle \}}

ביצועים וביטחון
---------------

יישום צופן RC6 (על פנטיום 2) בשפת c הגיע למהירות של כ-600 מחזורי שעון לבלוק או כ-5 מגה לשנייה. RC6 עולה בביצועיו על ריינדל במימוש בתוכנה בעיקר על מחשב אינטל 32 סיביות. כמו יתר המועמדים (לפי דרישות התקן) מתאים ליישום גם בחומרה או במעבד כרטיס חכם, אם כי לריינדל ביצועים טובים יותר בשטח זה. היות ש-RC6 אינו משתמש בתיבות החלפה מימוש האלגוריתם מאוד קומפקטי ויכול לאכלס פחות מ-256 בתים. הערכת המפתחים היא שההתקפה הטובה ביותר האפשרית כנגד הצופן, היא בסיבוכיות בין {\displaystyle 2^{704}} ל-{\displaystyle 2^{256}}.

קוד לדוגמה
----------

להלן קוד C++‎ לא אופטימלי להמחשה. לפי פרמטרים: {\displaystyle w=32,r=20,lgw=5}. המפתח באורך b יכול להיות 16, 24 או 32 בתים. הקלט והפלט הם מערכי 4 מילים בגודל 32 סיביות. S הוא מערך עזר בגודל 44 מילים.

```
#define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1)))))
#define ROTR(x,y) (((x)>>(y&(w-1))) | ((x)<<(w-(y&(w-1)))))

void Setup(byte \*key, int b, unsigned int \*S)
{
 int i, j, s, v;
 unsigned int L[8], A, B;

 L[((b + 4 - 1) / 4) - 1] = 0;
 for (i = b - 1; i >= 0; i--)
 L[i / 4] = (L[i / 4] << 8) + key[i];

 S[0] = 0xB7E15163;
 for (i = 1; i <= 43; i++)
 S[i] = S[i - 1] + 0x9E3779B9;

 A = B = 0;
 i = j = 0;
 v = 44;
 if (((b + 4 - 1) / 4) > v) v = ((b + 4 - 1) / 4);
 v \*= 3;

 for (s = 1; s <= v; s++)
 {
 A = S[i] = ROTL(S[i] + A + B, 3);
 B = L[j] = ROTL(L[j] + A + B, A + B);
 i = (i + 1) % 44;
 j = (j + 1) % ((b + 4 - 1) / 4);
 }
}

void Encrypt(unsigned int \*pt, unsigned int \*ct, unsigned int \*S)
{
 unsigned int A = pt[0], B = pt[1], C = pt[2], D = pt[3];
 B += S[0], D += S[1];
 for (int i = 2; i <= 40; i += 2)
 {
 t = ROTL(B \* (2 \* B + 1), lgw);
 u = ROTL(D \* (2 \* D + 1), lgw);
 A = ROTL(A ^ t, u) + S[i];
 C = ROTL(C ^ u, t) + S[i + 1];
 x = A, A = B, B = C, C = D, D = x;
 }
 A += S[42], C += S[43];
 ct[0] = A, ct[1] = B, ct[2] = C, ct[3] = D;
}

void Decrypt(unsigned int \*pt, unsigned int \*ct, unsigned int \*S)
{
 unsigned int A = ct[0], B = ct[1], C = ct[2], D = ct[3];
 C -= S[43], A -= S[42];
 for (int i = 40; i >= 2; i -= 2)
 {
 x = D, D = C, C = B, B = A, A = x;
 u = ROTL(D \* (2 \* D + 1), lgw);
 t = ROTL(B \* (2 \* B + 1), lgw);
 C = ROTR(C - S[i + 1], t) ^ u;
 A = ROTR(A - S[i], u) ^ t;
 }
 D -= S[1], B -= S[0];
 pt[0] = A, pt[1] = B, pt[2] = C, pt[3] = D;
}

```

ראו גם
------

* AES
* RC4

קישורים חיצוניים
----------------

* R.L. Pavan, M.J.B. Robshaw, R.Sidney, and Y.L. Yin, The RC6 Block Cipher, v1.1, August 1998

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

1. ↑  RC6 and the AES

| קריפטוגרפיה |
| --- |
| 

| מושגי יסוד |
| --- |
| פנקס חד-פעמי • צופן בלוקים • צופן בלוקים בר התאמה • צופן זרם • סודיות מושלמת • ביטחון סמנטי • הצפנה סימטרית • הצפנה אסימטרית • חתימה דיגיטלית • הצפנה הומומורפית • הצפנה מרובה • הצפנה מאומתת • הצפנה הסתברותית • סכמת ריפוד אסימטרית אופטימלית • אריזת מפתח הצפנה • סודיות מושלמת קדימה |

 |
| 

| הצפנה קלאסית |
| --- |
| מכונת הצפנה • צופן החלפה • צופן אתב"ש • צופן קיסר • צופן ויז'נר • צופן ורנם • צופן פלייפייר • צופן היל • אולטרה • אניגמה • ציקלומטר • קולוסוס • PURPLE • ג'ייד • מג'יק • צופן שחלוף |

 |
| 

| צופן בלוקים |
| --- |
| לוציפר • AES • 3DES • DES • Threefish • Twofish • Blowfish • FEAL • SEED • CAST • IDEA • RC2 • RC6 • MARS • RC5 • GOST • סרפנט • MISTY • KASUMI • קמליה • ARIA • SAFER • TEA • LEA • CLEFIA • SEA • Hummingbird • PRESENT • KATAN • KeeLoq • Simon & Speck • אנוביס |

 |
| 

| אופני הפעלה |
| --- |
| אופן הפעלה של צופן בלוקים • EAX • OCB • IAPM • CWC mode • GCM • CCM |

 |
| 

| צופן זרם |
| --- |
| RC4 • Salsa20 • SOSEMANUK • גריין • E0 • A5/1 • A5/2 • A5/3 • A5/4 • MICKEY • HC-128 • SNOW • Trivium • Rabbit • ZUC • ChaCha |

 |
| 

| הצפנה אסימטרית |
| --- |
| פרוטוקול דיפי-הלמן • חידות מרקל • חתימת למפורט • הצפנת תרמיל • RSA • הצפנת רבין • חתימה דיגיטלית רבין • צופן אל-גמאל • חתימה דיגיטלית אל-גמאל • DSA • הצפנת בלום-גולדווסר • ECC • הצפנת קריימר-שופ • הצפנת פאיי • הצפנת מקאליס • GGH • NTRU • עקום 25519 • חתימה דיגיטלית של שנור • הצפנת אוקמוטו-אושיאמה |

 |
| 

| פרוטוקולים |
| --- |
| עץ מרקל • פרוטוקול אתגר-מענה • פרוטוקול נידהאם-שרודר • פרוטוקול קרברוס • הוכחה באפס ידע • פרוטוקול פייגה-פיאט-שמיר • העברה עלומה • חלוקת סוד • TLS (SSL) • Secure Shell • MQV • X.509 • פרוטוקול שיתוף מפתח
• מיסור שלא לפרסום • פרוטוקול סיגנל |

 |
| 

| פרימיטיבים תאורטיים |
| --- |
| מחולל פסבדו-אקראי קריפטוגרפי • פונקציה חד-כיוונית • תמורה חד-כיוונית • סיבית קשה • פונקציה פסבדו-אקראית קריפטוגרפית • תמורה פסאודו-אקראית • פונקציית גיבוב קריפטוגרפית • וקטור אתחול • פונקציית ספוג • הצפנה מבוססת סריג |

 |
| 

| קריפטואנליזה |
| --- |
| ניתוח תדירויות • כוח גס • התקפת איזון זמן/זיכרון • תקיפת היפגשות באמצע • קריפטואנליזה ליניארית • קריפטואנליזה דיפרנציאלית • התקפת גלוי-ידוע • התקפת גלוי-נבחר • התקפת מוצפן-נבחר • פירוק לגורמים של מספר שלם • התקפת ערוץ צדדי • התקפת קורלציה • התקפת שיבוש • מודל אורקל אקראי • התקפת התנגשויות |

 |
| 

| בעיות מתמטיות ואלגוריתמים |
| --- |
| בעיית לוגריתם דיסקרטי • תחשיב אינדקסים • נפה ריבועית • אלגוריתם rho של פולרד • נפת שדה מספרים • אלגוריתם רו של פולרד ללוגריתמים • אלגוריתם פוליג-הלמן |

 |
| 

| פונקציות גיבוב קריפטוגרפיות |
| --- |
| SHA • MD5 • MD4 • SHA-1 • SHA-2 • SHA-3 • RIPEMD • Skein • BLAKE • Grøstl • SipHash |

 |
| 

| אימות וזיהוי |
| --- |
| אימות זהות • סיסמה • קוד אימות מסרים • Poly1305 • סיסמה חד-פעמית |

 |
| 

| נושאים נלווים |
| --- |
| מספר אקראי • מספר ראשוני • יתירות • מפתח שיחה • סטגנוגרפיה • הצפנה קוונטית • הצפנה פוסט-קוונטית • עקרון קרקהופס • אבטחת מידע • קריפטוגרפיה ויזואלית • אליס ובוב • מסיבת חתימה על מפתחות ציבוריים • שידור מוצפן • הצפנת דיסקים • הצפנת סף • חתימה דיגיטלית מבוססת פונקציית גיבוב • פונקציה זניחה • רשת פייסטל • רשת החלפה-תמורה • הלבנה • אימות מסרים • חתימה עיוורת • חישוב רב משתתפים בטוח |

 |