**SipHash** (קיצור של **Short Input Hash**) הוא שם כולל למשפחה של פונקציות פסאודו-אקראיות בסגנון ARX, שפותחו ב-2012 על ידי ג'ון פיליפ אמסון ודניאל ברנשטיין. SipHash היא מעין פונקציית גיבוב עם מפתח הממוטבת במיוחד עבור קלט קצר ועוצבה במטרה לתת מענה להתקפות מניעת שירות מסוג Hash Flooding ששטף את הרשת ב-2011.

בניגוד לפונקציית גיבוב כמו SHA-2 הפונקציה SipHash אינה חסינת התנגשויות במובן החזק. כלומר התכונה החזקה ביותר של פונקציית גיבוב קריפטוגרפית היא שיהיה קשה למצוא ערכים כלשהם לא בהכרח בעלי משמעות כלשהי המקיימים {\displaystyle H(x)=H(y)} כאשר {\displaystyle y\neq x}. בעוד שהפונקציה SipHash רק מבטיחה שבהינתן קלט x ומפתח סודי k יהיה קשה לנחש את k מתוך פלט הפונקציה {\displaystyle {\text{SipHash}}(x,k)} או לחלופין יהיה קשה לנחש מידע כלשהו בנוגע לפלט {\displaystyle {\text{SipHash}}(y,k)} עבור כל ערך {\displaystyle y\neq x}, ללא ידיעת מפתח k.

אפשר להשיג אפקט דומה על ידי כל פונקציית MAC המבוססת על פונקציית גיבוב או פונקציית גיבוב אוניברסלית. הפירוש "אוניברסלית" הוא ששני קלטים שונים כמעט אף פעם לא יפיקו פלט זהה אם המפתח אקראי. יתרונה של SipHash הוא ביעילותה ובפשטותה. לצורך השוואה על מעבד AMD FX-8150 הפונקציה מסוגלת לעבד קלט באורך 16 בתים תוך 140 מחזורי שעון והיא כמעט משתווה בתפוקתה לפונקציית גיבוב לא קריפטוגרפית. מסיבה זו היא מתאימה במיוחד להחליף את הפונקציונליות של טבלאות גיבוב. בדרך כלל מסדי נתונים משתמשים בטבלאות גיבוב לא קריפטוגרפיות כדי לייעל את תהליך אחזור המידע. לדוגמה שרת אינטרנט אמור לתת מענה למיליוני בקשות התחברות במקביל. כדי לעקוב אחרי הבקשות, השרת מנהל רשימה מגובבת של המידע הנכנס. מתקיף שמכיר את פונקציית הגיבוב שהשרת משתמש בה (בדרך כלל המידע הזה ציבורי) צריך רק לשלוח לשרת מאות בקשות התחברות שערך הגיבוב שלהן זהה (התנגשויות מרובות), כאשר מספר רב של בקשות מסוג כזה מתקבלות, הדבר מאט את השרת מאוד ואף משבית אותו כי הוא נאלץ לבצע חיפוש במסד הנתונים בסיבוכיות הגרועה ביותר. פונקציית גיבוב עם מפתח סודי אמורה לסכל התקפה כזו לגמרי, אף על פי שהיא אינה פונקציית גיבוב במובן הרגיל, אולם נוכחותו של המפתח הסודי מקשה על מציאת קלטים אחרים שיניבו פלט זהה (עם אותו מפתח), אלא אם כן יעלה בידי המתקיף לנחש את המפתח.

רקע
---

 ערך מורחב – **קוד אימות מסרים**  

קוד אימות מסרים (בקיצור MAC) היא פונקציה המקבלת קלט m באורך כלשהו (בדרך כלל ארוך) ומפתח סודי k ומפיקה תג אימות קצר t. תכונתה העיקרית היא שמתקיף המסוגל להשיג עותקים של תגי אימות עבור קלטים שונים (ייתכן אף לפי בחירתו), לא יצליח עם מידע זה לנחש תג אימות עבור כל מסר אחר שטרם ראה את התג שלו. קוד אימות מסרים חשוב מאוד להבטחת אמינות ושלמות תעבורת הרשת ומניעת ניסיונות זדוניים מצד האקרים לשנות ולשבש את המידע למטרות תקיפת מערכת האבטחה. הרעיון הוא שקוד האימות מאפשר לשני הצדדים לוודא שהמידע שעובר ברשת אותנטי, אם חל בו שינוי כלשהו אפילו בסיבית אחת, הדבר יתגלה בהסתברות מאוד גבוהה על ידי פונקציית האימות, במקרה כזה הצדדים מתפטרים מהמידע המשובש ומעבירים הודעת שגיאה מתאימה. לפי מחקרים שנעשו עולה שכשליש מתעבורת האינטרנט כולל חבילות מידע באורך של כחמישים בתים, שליש באורך 256 בתים ושליש כ-1,500 בתים, רבים מהם צריכים אימות. מרבית התקנים הנוכחיים מתמקדים בפונקציות MAC המותאמות לקלט ארוך. יתרה מזו, לרובם אף תקורה גבוהה הנובעת מתהליך הכנה ארוך או ניהול מפתחות מסובך. לדוגמה HMAC מוסיף בין 73 ל-136 בתים למסר מאומת והוא איטי יחסית. זאת משום שהוא אלגוריתם גנרי המסתמך על פונקציית גיבוב, והאחרונה נוקטת בפעולות רבות כדי למנוע התנגשויות, מה שמיותר במקרה זה כי קיים מפתח סודי. אלגוריתמים אחרים כמו VMAC,‏ UMAC או Poly1305 מנצלים צופן בלוקים כמו AES ולמרות היותם יעילים יותר מפני שהם משתמשים בגרסה יותר קלילה של פונקציית גיבוב הנקראת "אוניברסלית", עדיין קיימת תקורה רבה וכן הסתמכות על אלגוריתמים חיצוניים. ב-SipHash נעשה ניסיון להגיע לאותה רמת ביטחון אך בצורה יעילה יותר ללא תקורה מיותרת.

### יתרונות SipHah

* **ביטחון גבוה**. ההצעה SipHash-2-4 היא פונקציה פסאודו-אקראית קריפטוגרפית חזקה והפלט שלה בלתי ניתן להבחנה מערך אקראי שנבחר בהתפלגות אחידה. המפתחים מספקים הוכחות.
* **מהירות גבוהה**. SipHash-2-4 מהירה יותר מכל פונקציית MAC או PRF ידועה ואף מהווה מתחרה ראויה לפונקציות גיבוב לא קריפטוגרפיות.
* **גמישות**. SipHash משתמשת במפתח הצפנה באורך 128 סיביות. הפונקציה אינה מכילה תהליך "הרחבת מפתח" ולא קיימת התקורה הנובעת מאחסון וטעינה של מפתחות מהזיכרון.
* **פשטות**. הפונקציה כוללת בסך הכול ארבע פעולות חיבור, ארבע פעולות XOR וארבע הזזות.
* **אוטונומיות**. לא נעשה שימוש בפרימיטיביים קריפטוגרפיים חיצוניים.
* **זיכרון פנימי קצר**. הפונקציה צורכת בסך הכול 4 מילים באורך 64 סיביות כל אחת (בסך הכול 32 בתים בזיכרון).
* **אין צורך בניהול מצב פנימי בין הקריאות**. האלגוריתם דטרמיניסטי ואין צורך בווקטור אתחול.
* **עמידות מפני התקפת ערוץ צדדי**. צפנים מודרניים כמו AES בדרך כלל מעודדים שימוש בטבלאות אחזור מטעמי יעילות. מפני שלא קיימות באלגוריתם SipHash טבלאות אחזור סודיות הוא אינו חשוף להתקפות ערוץ צדדי.
* **תקורה מינימלית**. תג האימות מכיל רק שישה בתים.

### שימושים

SipHash נמצא במימושי תוכנה ושפות תכנות רבים, בהם:

* Perl (קיים כאופציה בזמן הידור)
* Python (מגרסה 3.4)
* Ruby
* Rust
* OpenDNS
* Haskell
* OpenBSD

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

להלן תיאור משפחת הפונקציות במבנה **SipHash-c-d** כאשר שני הפרמטרים c ו-d הם שלמים חיוביים המייצגים את מספר החזרות של הפונקציה הפנימית. **פונקציית הסבב** הפנימית של האלגוריתם מורכבת משני סוגים של פונקציות כיווץ, הראשונה נקראת "פונקציית כיווץ" והשנייה "פונקציית סיום". שתי הפונקציות למעשה זהות, ההפרדה ביניהן היא עניין סמלי. כדי למנוע התקפות מסוימות, לאחר c חזרות של פונקציית הסבב האלגוריתם מבצע חיבור נוסף עם בלוק הקלט ועם קבוע כלשהו ולאחר מכן מבצע d חזרות נוספות של פונקציית הסבב שנקראת בשלב זה פונקציה מסיימת.

בהינתן קלט m שהוא מחרוזת כלשהי באורך b בתים ומפתח סודי k באורך 16 בתים, תפקיד הפונקציה {\displaystyle {\text{SipHash-c-d}}(k,m)} הוא להחזיר תג אימות באורך 64 סיביות כדלהלן:

1. **אתחול**. מאתחלים את **המצב הפנימי** (Internal state) של האלגוריתם בערכים:

{\displaystyle v\_{0}=k\_{0}\oplus {\text{0x736f6d6570736575}}}
{\displaystyle v\_{1}=k\_{1}\oplus {\text{0x646f72616e646f6d}}}
{\displaystyle v\_{2}=k\_{0}\oplus {\text{0x6c7967656e657261}}}
{\displaystyle v\_{3}=k\_{1}\oplus {\text{0x7465646279746573}}}

כאשר {\displaystyle k\_{0}} ו-{\displaystyle k\_{1}} הם שני החצאים של המפתח k, כל אחד מהם באורך 64 סיביות לפי סדר בתים קטן. לקבועים אילו אין משמעות מתמטית, הם בסך הכול קידוד בבסיס הקסדצימלי של המשפט "some pseudorandomly generated bytes" (ללא רווחים) לפי סדר בתים גדול. כל ערך אחר שונה מאפס טוב ובלבד שיהיה הבדל ניכר בין ערכי v\_{i}. לא נבדק האם אפשר לנצל שלב זה כווקטור אתחול מותאם אישית.

2. **כיווץ**. תחילה מציגים את b הבתים של הקלט m כמחרוזת המכילה {\displaystyle w=\lceil (b+1)/8\rceil } מילים באורך 64 סיביות כל אחת, לפי סדר בתים קטן: {\displaystyle m\_{0},m\_{1},...m\_{w-1}}, כאשר הבית האחרון במילה האחרונה {\displaystyle m\_{w-1}} מכיל את קידוד אורך הקלט b בבתים מודולו 256. הקלט חייב להכיל לפחות מילה אחת, אם הקלט נמוך ממילה אחת או שאורכו אינו כפולה של מילים באורך 64 סיביות, מרפדים באפסים כנדרש (למעט בית האחרון). לדוגמה אם מחרוזת הקלט היא "01234abcde" (בבסיס הקסדצימלי) אז {\displaystyle b=5}, {\displaystyle w=1} והמילה m\_{0} מכילה את:

{\displaystyle m\_{0}={\text{0x050000debc4a2301}}}

מחברים באופן איטרטיבי את כל מילות הקלט {\displaystyle m\_{i}} עם המצב הפנימי כאשר {\displaystyle 0\leq i\leq w-1}, על ידי:

{\displaystyle v\_{3}=v\_{3}\oplus m\_{i}}

מבצעים c איטרציות של פונקציית הסבב SipRound (המפורטת בהמשך) ולאחר מכן מבצעים על כל מילות הקלט:

{\displaystyle v\_{0}=v\_{0}\oplus m\_{i}}

3. **סיומת**. לאחר עיבוד כל מילות הקלט כמתואר, מבצעים XOR של הקבוע {\displaystyle {\text{0xff}}} עם המילה השלישית של המצב הפנימי:

{\displaystyle v\_{2}=v\_{2}\oplus {\text{0xff}}}

ואז מבצעים d איטרציות של פונקציית הסבב SipRound ומחזירים את 64 הסיביות שהן תוצאה של:

{\displaystyle v\_{0}\oplus v\_{1}\oplus v\_{2}\oplus v\_{3}}

### פונקציית הסבב SipRound

מבנה ARX של הפונקציה הפנימית SipRound
הטרנספורמציה SipRound המומחשת בתרשים משמאל מבצעת את הפעולות הבאות על המצב הפנימי של האלגוריתם:

|  |  |
| --- | --- |
| {\displaystyle v\_{0}=v\_{0}\boxplus v\_{1}} | {\displaystyle v\_{2}=v\_{2}\boxplus v\_{3}} |
| {\displaystyle v\_{1}=v\_{1}\lll 13} | {\displaystyle v\_{3}=v\_{3}\lll 16} |
| {\displaystyle v\_{1}=v\_{1}\oplus v\_{0}} | {\displaystyle v\_{3}=v\_{3}\oplus v\_{2}} |
| {\displaystyle v\_{0}=v\_{0}\lll 32} |  |
| {\displaystyle v\_{2}=v\_{2}\boxplus v\_{1}} | {\displaystyle v\_{0}=v\_{0}\boxplus v\_{3}} |
| {\displaystyle v\_{1}=v\_{1}\lll 17} | {\displaystyle v\_{3}=v\_{3}\lll 21} |
| {\displaystyle v\_{1}=v\_{1}\oplus v\_{2}} | {\displaystyle v\_{3}=v\_{3}\oplus v\_{0}} |
| {\displaystyle v\_{2}=v\_{2}\lll 32} |  |

כאשר הסימן \oplus הוא XOR, הסימן {\displaystyle \lll } מייצג הזזה מעגלית של סיביות שמאלה, בגבולות מילה באורך 64 סיביות, לפי מספר הפוזיציות המצוין לאחריו. הסימן {\displaystyle \boxplus } מייצג חיבור מודולו {\displaystyle 2^{64}}. היסטי ההזזות נבחרו באופן אמפירי, תוך מתן דגש על ערכים המיושרים לגבולות בתים או מילים להאצת ביצועים ומניעת עיכובים בצינור העיבוד.

ביטחון ויעילות
--------------

SipHash-c-d כאשר {\displaystyle c\geq 2} וכן {\displaystyle d\geq 4} אמורה לספק לדעת המפתחים מקסימום ביטחון כפונקציה פסאודו אקראית. הביטחון הגבוה ביותר שניתן להשיג עם כל פונקציית PRF לאימות מסרים. לשימוש רגיל ההמלצה שלהם היא SipHash-2-4 (כלומר שני סבבים של הפונקציה הפנימית ואחריהן ארבעה סבבים של הפונקציה המסיימת) ולשימוש שמרני יותר SipHash-4-8 שהיא איטית פי שניים מהראשונה. מהיבט תאורטי, ביטחון פונקציית PRF סטנדרטית מניח שלמתקיף גישה לפלט הפונקציה על קלטים שנבחרו על ידו באופן אדפטיבי (שזהו המודל המחמיר ביותר), אך הוא אינו רשאי לראות את המפתח, או לצורך הדיון כאן, אין ביכולתו להשיג גישה ל"מפתחות קשורים", "מפתחות ידועים" או "מפתחות נבחרים" (כל אילו מודלים של ביטחון שמניחים שלמתקיף שליטה מסוימת גם אם חלקית ועקיפה על חומר המפתח הסודי). במצב זה ביטחון הפונקציה תלוי באורך המפתח. היות שהמפתח באורך 128 סיביות, אם המתקיף מבצע s שאילתות (ניסיונות אימות) סיכוייו לנחש את המפתח שואפים ל-{\displaystyle 2^{s-128}}. בהנחה שלא קיימת דרך טובה מכוח גס. הביטחון המושג מוגבל גם בגלל אורך הפלט. כלומר כאשר משתמשים ב-SipHash כקוד אימות, אם המתקיף מסוגל לבצע {\displaystyle 2^{s}} שאילתות הוא יצליח לזייף תג אימות בהסתברות של {\displaystyle 2^{s-64}}. חשוב להדגיש ש-SipHash אינה ולא הייתה מיועדת להיות פונקציה חסינת התנגשויות.

SipHash אימצה טכניקות מהפונקציות BLAKE,‏ Skein ו-JH שהיו מועמדות תקן הגיבוב SHA-3 ועלו לגמר. פונקציות הגיבוב המנויות עברו ביקורת מדוקדקת של מומחים והוצהרו נכון להיום כבטוחות ולכן הסתמכות על חלקים מהם מקלה על ניתוח ביטחון האלגוריתם. מבנה הפונקציה הפנימית הוא ARX (קיצור של חיבור/הזזה/XOR) שהוכח כבטוח ונמצא בשימוש צפנים מודרניים כמו Salsa20. מ-Blake נלקחו המינימליות והפשטות מ-Skein נלקח תהליך הערבוב MIX ומ-JH אומץ רעיון טעינת הקלט לפני ואחרי כל בלוק. היתרון הוא שבניגוד לסגנון הספוג של SHA-3, אפשר לספוג חלק מהקלט ללא ירידה בביטחון מקור ראשון (Preimage).

המפתחים מציינים כי האלגוריתם נבדק נוכח מספר גדול של התקפות קריפטואנליטיות מודרניות ונמצא בטוח לטענתם. כוח גס בסיבוכיות של {\displaystyle 2^{127}} אינו מעשי. ניחוש הזיכרון הפנימי דורש בממוצע {\displaystyle d2^{191}} פעולות ולכן אינו מעשי. המחברים ניסו התקפות דיפרנציאליות שונות וכן התקפות קריפטוגרפיות אחרות כמו התקפת נקודות שבת וכן התקפת Cube והתקפת Rebound.

בפונקציית הסבב של SipHash יש בסך הכול 14 פעולות על משתנים באורך 64 סיביות. לכן ב-SipHash-2-4 יש בסך הכול 30 פעולות עבור כל שמונה בתים של קלט, 3.75 פעולות פר בית בממוצע. מעבד ארבע ליבות מבזבז כמחזור שעון אחד עבור כל בית של קלט. האלגוריתם נבדק על מספר מעבדים ומערכות הפעלה, הן בתוכנה והן בחומרה והביצועים השוו לפונקציות גיבוב לא קריפטוגרפיות כמו CityHash של גוגל וכן SpookyHash ו-MD5. לפי התוצאות SipHash קרובה בביצועיה לפונקציות הגיבוב המהירות ביותר הקיימות כיום. לצורך השוואה על מעבד Xeon E5620 של אינטל, ליבת Core i7, קלט באורך 8 בתים עובד תוך 92 מחזורי שעון בערך.

### קוד לדוגמה של SipHash-2-4

```
#define U8TO32\_LE(p) \
 (((uint32\_t)((p)[0]) ) | ((uint32\_t)((p)[1]) << 8) | \
 ((uint32\_t)((p)[2]) << 16) | ((uint32\_t)((p)[3]) << 24)) \

#define U8TO64\_LE(p) \
 ((uint64\_t)U8TO32\_LE(p) | ((uint64\_t)U8TO32\_LE((p) + 4)) << 32 )

#define ROTL64(v, s) \
 ((v) << (s)) | ((v) >> (64 - (s)))

#define ROTL64\_TO(v, s) ((v) = ROTL64((v), (s)))

#define ADD64\_TO(v, s) ((v) += (s))
#define XOR64\_TO(v, s) ((v) ^= (s))
#define XOR64\_INT(v, x) ((v) ^= (x))

static const char sip\_init\_state\_bin[] = "uespemos""modnarod""arenegyl""setybdet";
#define sip\_init\_state (\*(uint64\_t (\*)[4])sip\_init\_state\_bin)

#define SIP\_COMPRESS(v0, v1, v2, v3) \
do { \
 ADD64\_TO((v0), (v1)); \
 ADD64\_TO((v2), (v3)); \
 ROTL64\_TO((v1), 13); \
 ROTL64\_TO((v3), 16); \
 XOR64\_TO((v1), (v0)); \
 XOR64\_TO((v3), (v2)); \
 ROTL64\_TO((v0), 32); \
 ADD64\_TO((v2), (v1)); \
 ADD64\_TO((v0), (v3)); \
 ROTL64\_TO((v1), 17); \
 ROTL64\_TO((v3), 21); \
 XOR64\_TO((v1), (v2)); \
 XOR64\_TO((v3), (v0)); \
 ROTL64\_TO((v2), 32); \
} while(0)

#define SIP\_2\_ROUND(m, v0, v1, v2, v3) \
do { \
 XOR64\_TO((v3), (m)); \
 SIP\_COMPRESS(v0, v1, v2, v3); \
 SIP\_COMPRESS(v0, v1, v2, v3); \
 XOR64\_TO((v0), (m)); \
} while (0)

uint64\_t sip\_hash24(uint8\_t key[16], uint8\_t \*data, size\_t len)
{
 uint64\_t k0, k1;
 uint64\_t v0, v1, v2, v3;
 uint64\_t m, last;
 uint8\_t \*end = data + len - (len % sizeof(uint64\_t));

 k0 = U8TO64\_LE(key);
 k1 = U8TO64\_LE(key + sizeof(uint64\_t));

 v0 = k0; XOR64\_TO(v0, sip\_init\_state[0]);
 v1 = k1; XOR64\_TO(v1, sip\_init\_state[1]);
 v2 = k0; XOR64\_TO(v2, sip\_init\_state[2]);
 v3 = k1; XOR64\_TO(v3, sip\_init\_state[3]);

 for (; data != end; data += sizeof(uint64\_t)) {
 m = U8TO64\_LE(data);
 SIP\_2\_ROUND(m, v0, v1, v2, v3);
 }

 last = len << 56;
 #define OR\_BYTE(n) (last |= ((uint64\_t) end[n]) << ((n) \* 8))

 switch (len % sizeof(uint64\_t)) {
 case 7: OR\_BYTE(6);
 case 6: OR\_BYTE(5);
 case 5: OR\_BYTE(4);
 case 4: OR\_BYTE(3);
 case 3: OR\_BYTE(2);
 case 2: OR\_BYTE(1);
 case 1: OR\_BYTE(0); 
 break;
 case 0: break;
 }

 SIP\_2\_ROUND(last, v0, v1, v2, v3);

 XOR64\_INT(v2, 0xff);

 SIP\_COMPRESS(v0, v1, v2, v3);
 SIP\_COMPRESS(v0, v1, v2, v3);
 SIP\_COMPRESS(v0, v1, v2, v3);
 SIP\_COMPRESS(v0, v1, v2, v3);

 XOR64\_TO(v0, v1);
 XOR64\_TO(v0, v2);
 XOR64\_TO(v0, v3);
 return v0;
}

```

ראו גם
------

* פונקציית גיבוב קריפטוגרפית
* קוד אימות מסרים
* טבלת גיבוב
* SHA-3

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

* 

* אתר האינטרנט הרשמי של SipHash

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

1. ↑  Jean-Philippe Aumasson & Daniel J. Bernstein, "SipHash: a fast short-input PRF", sep 2012
2. ↑  Hash-flooding DoS reloaded: attacks and defenses, Jean-Philippe Aumasson, Kudelski Group Daniel J. Bernstein, University of Illinois at Chicago Martin Boßlet, freelancer
3. ↑  Xuejia Lai, Higher order derivatives and differential cryptanalysis, in Richard E. Blahut, Daniel J. Costello, Jr. Ueli Maurer, Thomas Mittelholzer (editors), Communications and cryptography: two sides of one tapestry, Springer (1994).
4. ↑  Florian Mendel, Christian Rechberger, Martin Schllaoer, Soren S. Thomsen, The rebound attack: cryptanalysis of reduced Whirlpool and Grostl, in FSE 2009

| * צ
* ש
* ע
קריפטוגרפיה |
| --- |
| 

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

 |

 |
| 

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

 |

 |
| 

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

 |

 |
| 

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

 |

 |
| 

| צופן זרם |
| --- |
| 
* RC4
* Salsa20
* SOSEMANUK
* Grain
* 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
* סיסמה חד-פעמית

 |

 |
| 

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

 |

 |