פרוטוקול סיגנל

פרוטוקול סִיגְנָל (באנגלית: Signal Protocol) (לשעבר פרוטוקול TextSecure) הוא פרוטוקול קריפטוגרפי בקוד פתוח המספק הצפנה מקצה-לקצה לאבטחת תקשורת מסרים מיידיים ושיחות וידאו והוא הבסיס לאפליקציית המסרים המיידיים סיגנל. הפרוטוקול פותח ב-2013 בתחילה בשם TextSecure על ידי חברת Open Whisper Systems שנוסדה על ידי חוקר אבטחת המידע מוקסי מרלינספייק (מתיו רוזנפלד). הפרוטוקול נמצא במימושים בקוד סגור של חברות ידועות ביניהן: וואטסאפ שמצפינה הודעות של למעלה ממילארד משתמשים ברחבי העולם, Facebook Messenger של פייסבוק במצב "שיחה סודית", גוגל הודעות וכן סקייפ במצב "שיחה פרטית".

פרוטוקול סיגנל הוא התפתחות על שני פרוטוקולים ידועים: OTR ומערכת הצפנת SCIMP מבית Silent Circle שפיל צימרמן הוא אחד ממייסדיה. בגרסאות המתקדמות של הפרוטוקול שולב אלגוריתם מַחְגֵּר מְשֻׁנָּן כפול יחד עם מספר פרימיטיבים קריפטוגרפיים ידועים: פרוטוקול לחיצת יד המבוסס על דיפי-הלמן משולש (בקיצור <math>\text{3-DH}</math>), וכן עקום 25519, צופן AES-256 ו-HMAC-SHA256. 

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

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

==היסטוריה==
פרוטוקול סיגנל החל עם עבודתם של חוקרי האבטחה Trevor Perrin ו-Moxie Marlinspike שהקימו ב-2013 את חברת Open Whisper Systems. הגרסה הראשונה שלו נקראה TextSecure1 והייתה מבוססת על פרוטוקול מיסור שלא לפרסום (OTR). 

הגרסה השנייה v2 פורסמה ב-2014 והסתמכה על אלגוריתם חדש שנקרא "מַחְגֵּר מְשֻׁנָּן אקסולוטל" על שם סוג של סלמנדרה בסכנת הכחדה חמורה החיה במקסיקו ולה סגולות ריפוי מיוחדות. האלגוריתם משלב את הרעיון הארעיות של OTR המספק ביטחון קדימה עם אלגוריתם מחגר משונן (רָאצֶ'ט) מפרוטוקול SCIMP המבוסס על הצפנה סימטרית. בניגוד ל-OTR, לפרוטוקול סיגנל יתרון במצב עבודה אסינכרוני שבו לא כל המתקשרים במצב מקוון בזמן השיחה והוא מטפל טוב יותר באבטחת שיחות שלא לפי סדר כרונולוגי ללא "פנקסנות" הנובעת מהצורך לתחזק ולנהל מפתחות הצפנה ישנים שאיתם הוצפנו הודעות שטרם הגיעו ליעדן בגלל שהמקבל לא היה במצב מקוון. הייחוד באלגוריתם שהוא מאפשר התאוששות ממצב של פריצה אפילו אם מפתח שיחה אחד נחשף, מה שנקרא בפי המפתחים יכולת ריפוי עצמית. 

בגרסה השלישית v3 של הפרוטוקול נעשו שינויים בפרימיטיבים הקריפטוגרפיים שבבסיסו. ב-2014 פרסמו חוקרים מאוניברסיטת רוהר בוכום קריפטואנליזה של הפרוטוקול ולמעט בעיה אחת הוא נמצא בטוח לשימוש. הבעיה בגרסה זו הייתה שהפרוטוקול היה חשוף בתנאים מסוימים להתקפת שיתוף לא ידוע, שהיא סוג של התקפת אדם באמצע בה המתקיף מנסה להערים על צד אחד המשתתף בשיחה בהתחזות לצד השני. ב-2016 שינו המפתחים את שם הפרוטוקול לסיגנל וכן שינו את שם האלגוריתם הפנימי ממחגר משונן אקסולוטל למחגר משונן כפול כדי להפריד בין האלגוריתם הפנימי לבין הפרוטוקול בכללותו. כמו כן נוספו שינויים קריפטוגרפיים אחדים כדי לענות על הבעיות שהתגלו.

==תכונות==
פרוטוקול סיגנל מספק מספר מאפיינים קריפטוגרפיים:
*סודיות; הדרישה הבסיסית של הצפנת כל השיחות והמסרים תוך שימוש בפרימיטיבים קריפטוגרפיים חזקים.
*שלמות; הבטחת שלמות וכלילות המסרים באמצעות קוד אימות סימטרי.
*אימות; אימות זהויות המשתתפים בשיחה באמצעות טכניקות מפתח ציבורי.
*סודיות קדימה וסודיות עתידית; כלומר ידיעת מפתח ששימש להצפנת הודעה אחת לא יתרום לפענוח הודעות אחרות. שימור סודיות קדימה וסודיות עתידית הם מהמאפיינים היותר חשובים של הצפנת מסרים מיידיים. כל הודעה מוצפנת עם מפתח אחר שנמחק מייד לאחר השימוש בו.
*שימור נסיבתיות והעדר זיקתיות/יכולת הכחשה; הפרדה בין זהות המשתתפים בשיחה לבין תוכן השיחות מעניקה למשתתפים מידה של אנונימיות.
*עקביות המשתתפים ואימות היעדים;
*אסינכרוניות; הצפנה ופענוח מסרים שלא לפי סדר הגעתם.

==מבנה==
פרוטוקול סיגנל (בגרסה השלישית שלו) בנוי ממספר שכבות שלכל אחת מהן תפקיד קריפטוגרפי נפרד: 
* שכבת האימות משתמשת בחתימה דיגיטלית מסוג XEdDSA וההרחבה שלה, VXEdDSA. EdDSA היא למעשה וריאציה של חתימת DSA בעקום אליפטי מיוחד הנקרא עקום אדוארד המאפשר ביצוע יעיל במחשב פשוט. הפרוטוקול מבוסס על פונקציית דיפי הלמן X25519 שפותחה על ידי דניאל ברנשטיין או פונקציית דיפי-הלמן X448 שפותחה על ידי מייק המבורג - שתיהן ידועות ביעילות וביטחון גבוהים ושתיהן שולבו בתקנים בינלאומיים. 
* שכבת לחיצת היד שבה מתבצע שיתוף מאומת של מפתח סודי ארעי בשיטת דיפי הלמן משולשת הנקראת X3DH. שיטה זו מספקת ביטחון קדימה ויכולת הכחשה.
* שכבת השיחה. במהלך השיחה משתמשים באלגוריתם לשיתוף מפתחות זמניים הבנוי על עקרון ראצ'ט קריפטוגרפי המשלב את פונקציית דיפי הלמן עם פונקציית גיבוב כדי לייצר מפתחות חד-פעמיים באופן שלא ניתן לחזור לאחור. כל מפתח מושמד לאחר השימוש בו. תוך הבאה בחשבון שהודעות עשויות להגיע שלא לפי סדר שליחתן.
*שכבת ניהול שבה נעשה שימוש באלגוריתם "שומשום" כדי לנהל ולתחזק מפתחות זמניים באופן אסינכרוני עם תמיכה להתקנים מרובים או משתתפים מרובים.

==מהלך הפרוטוקול==
פרוטוקול סיגנל מחולק למספר שלבים, או "מצבים":
* רישום. בשלב הרישום כל משתתף רושם את פרטיו האישיים אצל שרת מרכזי וכן שולח אליו "צרור טרום-מפתחות" המכיל אוסף של מפתחות ציבוריים של דיפי הלמן איתם אפשר יהיה לבצע לחיצת יד עם משתמש אחר על מנת להתחיל שיחה. הצרור מורכב משלושה סוגים; 

# "מפתח זהות" (Identity Key), שהוא מפתח ציבורי ארוך טווח המייצג את המשתמש במערכת
# מפתח ציבורי לטווח בינוני שנקרא "מפתח ארעי" (Signed Pre-Key) שמוחלף מעת לעת
# רשימה של "מפתחות חד-פעמיים" (One-Time Pre-Keys) לשימוש יחיד. 

כמובן שלכל המפתחות הללו מתאימים מפתחות פרטיים סודיים השמורים מקומית אצל המשתמש ולעולם אינם נשלחים ברשת.
* התחלת שיחה (session). אם אליס רוצה להתחיל שיחה מוצפנת עם בוב עליה לבקש מהשרת את צרור המפתחות הציבוריים של בוב. וכן עליה לייצר מפתח "ראצ'ט" ציבורי ארעי חדש, ולגזור ממנו שלושה מפתחות סודיים: 
*# "מפתח השורש" (Root Key)
*# "מפתח שרשרת" (Chain Key)
*# ו"מפתח מסר" (Message Key), איתו מצפינים את ההודעות
את המפתחות מכינים בשיטת דיפי הלמן משולשת באמצעות שילוב המפתח הפרטי של אליס עם המפתחות הציבוריים של בוב ובשילוב פונקציית גזירת מפתחות (בקיצור KDF) המפורטים להלן.
* קבלת שיחה. כאשר בוב מקבל בקשת התחלת שיחה מאליס, הוא משיג עותק של צרור המפתחות הציבוריים של אליס מהשרת וממנו הוא מכין את הסוד המשותף באותה שיטה. כמו כן גוזר ממנו מפתחות באותה שיטה שבה השתמשה אליס, בהם הוא משתמש לפענוח ואימות ההודעה.
* ראצ'ט סימטרי (שליחת הודעה כחלק מרצף). כאשר אליס מעוניינת לשלוח לבוב הודעה נוספת מבלי להמתין עד לקבלת אישור שההודעה הראשונה התקבלה, היא מייצרת מפתח חדש בשיטת ראצ'ט סימטרי, דהיינו גוזרת מפתח מסר חדש מהקודם באמצעות פונקציית KDF, מקדמת את מונה מפתחות ההודעות, ושולחת לבוב את ההודעה המוצפנת עם המפתח החדש. היתרונות של ראצ'ט סימטרי הם שהוא מספק סודיות מושלמת קדימה וכן מתאים למקרים בהם הצד השני אינו מקוון, שאז צד אחד מבצע את הראצ'ט ושולח הודעה ואילו הצד השני יבצע את הראצ'ט רק כאשר הוא יתחבר. בנוסף בשיטה זו ניתן לדלג מעל מפתח ראצ'ט אחד, כל עוד המספר הסידורי של כל מפתח ידוע. אם למשל הגיעה הודעה עם מספר סידורי שונה ממה שצפוי, המקבל יכול עדיין לחלץ את המפתח הנכון על ידי "סיבוב" הראצ'ט מהשורש עד שהוא מגיע למספר הסידורי הנכון.
* ראצ'ט אסימטרי (שליחת הודעה חדשה). כאשר בוב מעוניין להגיב לאליס עליו לייצר תחילה מפתח ראצ'ט אסימטרי ארעי, לגזור ממנו באמצעות פונקציית KDF את מפתח השרשרת ומפתח המסר ולהצפין עם האחרון את ההודעה. כאשר אליס מגיבה להודעה זו, היא משלימה את תהליך הראצ'ט האסימטרי. מכינה ושולחת מפתח ראצ'ט ארעי חדש ממנו היא גוזרת מפתחות לצורך הצפנת ההודעה וכן הלאה. ראצ'ט אסימטרי יכול להתבצע רק לאחר סבב מלא, כל צד צריך להשלים את הראצ'ט האסימטרי של הצד השני ואז מתחיל ראצ'ט חדש. עם השלמת ראצ'ט אסימטרי לאחר סבב שלם של הודעות (הודעה מאליס לבוב והודעה מבוב לאליס) מחדשים את מפתח השורש ומפתח השרשרת כדי להתחיל ראצ'ט סימטרי חדש. בניגוד לראצ'ט סימטרי, היתרון של ראצ'ט אסימטרי הוא סודיות מושלמת עתידית. גם אם מפתח הודעה אחד נחשף לא תהיה באפשרות המתקיף לנחש את המפתח הבא כי המפתח הבא נגזר מסוד חדש שהצדדים משתפים ביניהם.

===חתימת XEdDSA===
חתימת XEdDSA היא וריאציה של החתימה הדיגיטלית DSA מעל העקום האליפטי עקום 25519 או עקום 448. אילו הם עקומים מיוחדים הנמנים עם עקומי אדוארד ומכאן שם האלגוריתם. הפרמטרים הקבועים של העקום הם נקודת בסיס קבועה <math>B</math> והסדר שלה <math>q</math> והקבועים <math>c</math> ,<math>d</math> ו-<math>A</math> של עקום אדוארד. כפל סקלרי של נקודה הוא פעולה ארוכה וצורכת משאבים ולכן מנסים לייעל אותה על ידי שימוש בסולם מונטגומרי שבנוסף יתרונו הוא שהוא עמיד נגד התקפת ערוץ צדדי. לצורך סולם מונטגומרי משתמשים כאן רק בקואורדינטה <math>y</math> של הנקודה בשיטת קואורדינטות פרויקטיביות. היות שהעקום הוא מסוג אדוארד, יש צורך בפונקציה מוסכמת להמרת נקודה מעקום אדוארד לעקום מונטגומרי ובחזרה (הפונקציה לא מובאת כאן). הפונקציה <math>\text{calculate key pair}</math> בתהליך החתימה להלן מקבלת את המפתח הסודי <math>k</math> שלם כלשהו ומחזירה את <math>(A,a)</math> שהם המפתח הפרטי והמפתח הציבורי שהוא נקודה בעקום אדוארד. שים לב שהנקודה <math>A</math> מתקבלת מהכפלת נקודת הבסיס בשלם הסודי בשיטת סולם מונטגומרי. כדי לחתום על מסר <math>M</math> תחילה יש צורך במחרוזת אקראית כלשהי <math>Z</math> חד-פעמית עבור כל מסר נתון. בהינתן הפרמטרים הקבועים של העקום, הפונקציה המתוארת להכנת המפתחות והמפתח הסודי <math>k</math> החתימה והאימות על המסר <math>M</math> מתבצעים כדלהלן:
<center>
{| dir="ltr"
|-
| 
<math>\boldsymbol{\mathbf{XEdDSA}_{Sign}(k, M, Z)}</math>
:<math>\ \ \ \ A,a=\text{Calculate key pair}(k)</math>
:<math>\ \ \ \ r=\text{hash}_1(a\ \| \ M \ \| \ Z)\text{ (mod }q)</math>
:<math>\ \ \ \ R=rB</math>
:<math>\ \ \ \ h=\text{hash}(R\ \| \ A \ \| \ M)\text{ (mod }q)</math>
:<math>\ \ \ \ s=r+ha\text{ (mod }q)</math>
:<math>\ \ \ \ \text{Return }(R \| s)</math>
|| 
<math>\boldsymbol{\mathbf{XEdDSA}_{Verify}(u,M,(R\| s))}</math>
:<math>\ \ \ \ \text{If }u\ge p\text{ or }R.y \ge 2^{|p|}\text{ or }s\ge 2^{|q|}\text{ Return False}</math>
:<math>\ \ \ \ A = \text{Convert from montgomery to Eduard}(u)</math>
:<math>\ \ \ \ \text{If }A\text{ Is not on the Curve Return False}</math>
:<math>\ \ \ \ h=\text{hash}(R\| A\| M)\text{ (mod }q)</math>
:<math>\ \ \ \ R'=sB-hA</math>
:<math>\ \ \ \ \text{If }R'=R\text{ Return True else Return False}</math>
|}
</center>
כדי לאמת את החתימה דרושים הפרמטרים הקבועים של העקום, המפתח הציבורי של החותם <math>u</math> (בעקום מונטגומרי) המסר <math>M</math> וזוג הערכים שהתקבלו מהחתימה <math>R</math> ו-<math>s</math>. הסימן <math>\|</math> מייצג שרשור. הפונקציה <math>\text{hash}_i</math> היא פונקציית גיבוב מותאמת המתקבלת על ידי שרשור הערך <math>2^b-1-i</math> לקלט <math>x</math> לפני הקריאה לפונקציה. כך שמתקבל <math>h(2^b-1-i \ \| \ x)</math>. במקרה של <math>\text{hash}_1</math> יוצא שלפני הקלט נוספת תחילית המורכבת ממחרוזת אחדים באורך <math>b-1</math> ואפס בסופה. <math>b</math> מייצג את אורך נקודה בעקום בסיביות. בנוסף הפרוטוקול תומך בגרסה מורחבת הנקראת VXEdDSA שהיא דומה לזו המתוארת אך מכילה תכונה נוספת. בגמר הפרוטוקול היא מפיקה מחרוזת פסאודו אקראית נוספת המשרתת כהוכחה לפונקציה אקראית בקיצור VRF.

===פרוטוקול דיפי-הלמן משולש (X3DH)===
פרוטוקול X3DH הוא פרוטוקול שיתוף מפתח קנייני המבוסס על פרוטוקול דיפי-הלמן (שאיתו שני משתמשים מבצעים שיתוף מפתח סודי מאומת לצורך התקשרות עתידית) שעושה שימוש בשלושה סוגים של זוגי-מפתחות במקום באחד. 

הפרוטוקול מכיל סודיות מושלמת קדימה ויכולת הכחשה וכן מותאם לעבודה במצב אסינכרוני, כלומר כל אחד מפרסם מפתחות ציבוריים מראש וכאשר מישהו מעוניין להתקשר עמו גם אם הוא אינו מחובר באותו רגע הוא יכול לבקש מהשרת את המפתחות השמורים שלו ולבצע את פרוטוקול השיתוף בלעדיו. מאוחר יותר כאשר אותו משתמש מתחבר הוא מקבל מהשרת התראה שמחכה לו הודעה הוא יכול להשתמש במפתח הפרטי המתאים, יחד עם המפתח הציבורי של השולח שנכלל בהודעה, לבצע את אותו תהליך שיתוף ולחלץ את הסוד המשותף כדי לפענח את ההודעות שקיבל. 

הפרוטוקול פועל בעקום אליפטי מסוג עקום 25519 או עקום 448. בנוסף הפרוטוקול משתמש בפונקציית הגיבוב SHA-256 או SHA-512 לפי בחירה ובפונקציית קידוד מוסכמת לייצוג המפתחות הציבוריים. ההנחה לפני שהפרוטוקול מתחיל היא שאליס ובוב רשמו את המפתחות הציבוריים שלהם בשרת. 

צרור המפתחות של כל משתמש כולל שלושה סוגים של זוגי מפתחות (key pairs), כאמור: 

* "מפתח זהות" המסומן <math>IK</math> (Identity Key). המפתח לרוב קבוע ומשתנה במקרים נדירים (המשתמש החליף מפתח או התקין מחדש את היישום)
* "טרום מפתח" (Signed Pre Key) המסומן <math>SPK</math> כשהוא חתום על ידי המשתמש באמצעות מפתח הזהות (אל המפתח הוא מצרף את החתימה שלו עליו <math>\text{Sign}_{IK}(SPK)</math>). את המפתח <math>SPK</math> טוענים מחדש אחת לשבוע או חודש בהתאם ליישום בפועל.
* רשימה של מפתחות חד-פעמיים (One-Time Pre Keys) המסומנים <math>OPK_1,OPK_2,...</math> וכו'. כמות המפתחות החד פעמיים נקבעת לפי היישום (ברירת המחדל היא 2000 מפתחות). מפתחות חד-פעמיים נטענים כאשר השרת מודיע ללקוח שהם עומדים להיגמר. בכל פעם שמשתמשים במפתח אחד מהם השרת מוחק אותו מהרשימה. 

כאשר אליס מעוניינת לשלוח הודעה לבוב, תחילה היא מכינה מפתח דיפי הלמן ארעי <math>EK_a</math> (Ephemeral Key) ומבקשת מהשרת את המפתחות הציבוריים של בוב: <math>IK_b</math>, <math>SPK_b</math> וכן <math>OPK_b</math> אם ישנו ואז היא מבצעת את פונקציית דיפי-הלמן שלוש פעמים. אם מסמנים את הפונקציה DH אז היא מבצעת לפי הסדר:
{| dir="ltr"
|-
|
:<math>DH_1=DH((IK_a,SPK_b)</math>
:<math>DH_2=DH(EK_a,IK_b)</math>
:<math>DH_3=DH(EK_a, SPK_b)</math>
|}
אם קיים מפתח חד-פעמי היא מבצעת גם <math>DH_4=DH(EK_a,OPK_b)</math> ואז היא משרשרת את כל התוצאות ביחד ומפעילה את פונקציית גזירת המפתח 
:<math>SK=KDF(DH_1\ \| \ DH_2\ \| \ DH_3\ \| \ DH_4)</math>.
כאשר <math>DH_4</math> אופציונלי. 

בנוסף לאמור אליס מכינה קובץ כותר המכיל מידע על זהותה וזהותו של בוב. את מפתחות הזהות שלהם <math>IK_a</math> ו-<math>IK_b</math> וייתכן מידע נוסף. לסיום היא שולחת לבוב את מפתח הזהות שלה <math>IK_a</math>, את המפתח הארעי שלה <math>EK_a</math> ואת גוף ההודעה כשהיא מוצפנת עם SK או עם מפתח אחר שנגזר ממנו באמצעות פונקציה פסאודו-אקראית ומידע ניהולי נוסף. את ההצפנה היא מבצעת עם אלגוריתם להצפנה מאומתת עם מידע נלווה (AEAD). למעשה ההודעה משרתת שתי מטרות: אחת היא להעברת המסר שהיא מעוניינת והשנייה העברת מפתח ציבורי ארעי חדש על מנת שבוב יוכל להכין את המפתח הסודי המשותף לצורך תקשורת עתידית ביניהם. לכן כאשר בוב מקבל את המסר תחילה הוא מכין את המפתח המשותף ומפענח את ההודעה ואז אם ברצונו להחזיר תגובה לאליס הוא מייצר מפתח חדש ושולח לה אותו יחד עם ההודעה באותה דרך. כמובן שהוא מוחק מיד כל מפתח חד פעמי שנעשה בו שימוש.

=== מחגר משונן כפול (Double Ratchet) ===

תיאור סכמתי של אלגוריתם מחגר משונן כפול. הראצ'ט האסימטרי DH משמש לעדכון מפתח השורש RK ואילו הראצ'ט הסימטרי משמש להכנת מפתחות הודעות CK ממפתח השורש. כל עוד המקבל לא הגיב בהודעה חוזרת משלו, הראצ'ט האסימטרי לא הושלם, לכן השולח ממשיך להשתמש בראצ'ט הסימטרי שוב ושוב עד לקבלת תגובה ראשונה מהמקבל. היות שמפתחות ההודעות נגזרים ממפתח השורש והיות שמפתח השורש ידוע לשני הצדדים, המקבל יכול לשחזר את מפתח ההודעה הדרוש כדי לפענח הודעה אחת בשרשרת לא בהכרח לפי הסדר על ידי שימוש באינדקס ההודעה.
מחגר משונן כפול או ראצ'ט כפול הוא מנגנון קריפטוגרפי המאפשר לשני משתתפים לנהל שיחה מוצפנת בהתבסס על סוד משותף שהשיגו קודם לכן. בדרך כלל הסוד המשותף מושג באמצעות פרוטוקול דיפי-הלמן כמו פרוטוקול דיפי-הלמן משולש המתואר לעיל. לאחר שיתוף הסוד המשתתפים ישתמשו בפרוטוקול ראצ'ט כפול כדי לגזור מפתחות חדשים עבור כל הודעה באופן כזה שגם אם מפתח אחד נחשף בדרך כלשהי לא ניתן יהיה לנחש על ידו מפתחות אחרים, לא עתידיים ולא קודמים בשרשרת המפתחות. משיגים זאת על ידי צירוף מפתחות דיפי-הלמן ארעיים חדשים עם כל הודעה ואיתם משתפים סודות חדשים מהם שוב גוזרים מפתחות חדשים וכן הלאה. למעשה מכל סוד משותף גוזרים מפתחות חדשים בשילוב הראצ'ט הסימטרי, דהיינו באמצעות פונקציית KDF לגזירת מפתחות הצפנה והתהליך חוזר על עצמו שוב ושוב עד לסיום השיחה. המושג ראצ'ט משמש כאן לתיאור מצב שבו לא ניתן לחזור שלב אחד לאחור, בדומה לכלי העבודה לחיזוק ברגים המסתובב רק בכיוון אחד. השילוב של הראצ'ט הסימטרי עם הראצ'ט האסימטרי המפורטים להלן יוצר ראצ'ט כפול שגורם לכך שלא ניתן לנוע (להסיק) ממפתח אחד לאחר לא קדימה ולא אחורה, מכאן שם האלגוריתם.

האלגוריתם מכיל "שרשרת מפתחות" מבוססת KDF שהיא פונקציה לגזירת מפתחות שמקבלת מפתח סודי ומידע נוסף ומפיקה מפתח חדש באופן אקראי ובלתי תלוי במפתח הקודם. פונקציית HKDF (המתוארת להלן) מקיימת את ההגדרה של פונקציית PRF, גם אם הקלט אינו אקראי עדיין תתקבל תוצאה אקראית ובלתי תלויה לכן היא מספקת ביטחון לפנים, אם נחשף מפתח אחד, לא ניתן לנחש את המפתח הקודם ממנו הוא נגזר. למעשה שרשרת המפתחות מורכבת משלוש שרשראות: שרשרת מפתחות שורש ושתי שרשראות מקבילות, שרשרת משלוח ושרשרת קבלה. בנוסף בכל סבב הצדדים מפיקים ומשתפים מפתח דיפי-הלמן שהופך להיות חלק ממפתח השורש הבא. ממפתחות השורש מתחילים שרשרת משלוח או שרשרת קבלה בהתאם.

כל הודעה שנשלחת או מתקבלת, מוצפנת עם "מפתח הודעה" חדש. את ממפתח ההודעה מפיקים בצד השולח משרשרת המשלוח ובצד המקבל משרשרת הקבלה. לאחר משלוח ההודעה המפתח נמחק מיד, אפילו אם ההודעה טרם הגיעה ליעדה או שלא התקבל אישור שהיא נקראה. היות שמפתח ההודעה אינו משמש לגזירת מפתחות אחרים, אין בו צורך יותר ומיד בגמר השימוש בו אפשר למחוק אותו. המקבל יכול להשיג את מפתח ההודעה הדרוש לפענוח הודעה ספציפית מתוך שרשרת הקבלה שלו לפי אינדקס ההודעה וגם הוא אינו זקוק לשמירת המפתח לאחר קריאת ההודעה. כך אפשר להתמודד עם הודעות שלא הגיעו כסדרן. חישוב המפתח הבא בשרשרת המשלוח וגזירת מפתח ההודעה הבא נקרא ראצ'ט סימטרי והוא אינו מספק ביטחון עתידי. אם מפתח אחד בשרשרת נחשף, אמנם אי אפשר לחשב את המפתחות הקודמים אך אפשר לחשב את כל המפתחות הבאים כי ה-KDF דטרמיניסטי ואם הקלט ידוע קל לדעת מה יהיה הפלט.

ראצ'ט דיפי-הלמן (בקיצור DH) הוא ראצ'ט אסימטרי המבוסס על שיתוף סוד בשיטת דיפי-הלמן והוא מספק ביטחון עתידי. ידיעת מפתח אחד אינה תורמת דבר לניחוש המפתח הבא. לכן את הסוד המשותף שנולד כתוצאה מהראצ'ט האסימטרי מערבבים עם הקלט ל-KDF ומחשבים מפתח שורש חדש איתו אפשר להתחיל שרשרת מפתחות חדשה ואז ממשיכים עם הראצ'ט הסימטרי עד לסבב הבא וחוזר חלילה. לכל הודעה מצורף כותר המכיל מפתח ציבורי ארעי טרי של השולח. כאשר ההודעה מתקבלת, המקבל משלים את הראצ'ט האסימטרי על ידי הכנת מפתח ציבורי ארעי משלו אותו הוא מצרף להודעה הבאה שהוא שולח. בתהליך זה המתנהל כמו "פינג פונג", כל צד שולח בתורו מפתח חדש והצד השני מפעיל את פונקציית דיפי-הלמן כדי לגזור את מפתח הראצ'ט האסימטרי הבא בתור ובד בבד מכין את המפתח לראצ'ט האסימטרי הבא.

===פונקציית גזירת מפתחות===
לצורך פרוטוקול סיגנל משתמשים בפונקציית גזירת מפתחות (בקיצור KDF) המבוססת על HKDF לפי שהיא בתורה מסתמכת על HMAC. הפונקציה HKDF מקבלת ערך חד-פעמי הנקרא מלח (שהוא מחרוזת אפסים בפרוטוקול סיגנל) וכן את הקלט ממנו מעוניינים להפיק מפתחות אחרים. היא מבצעת שני שלבים: שלב חילוץ סודיות ושלב הרחבה. היא משתמשת בפונקציה HMAC המקבלת שני פרמטרים, מפתח סודי וקלט באורך כלשהו ומחזירה תג באורך המפתח. תחילה מפעילים את הפונקציה HMAC על הקלט <math>KM</math> ומקבלים את PRK לאחר מכן מחשבים את HMAC באופן חוזר ונשנה עם המפתח PRK על מחרוזת כלשהי המסומנת כאן <math>\text{info}</math> שהיא מחרוזת טקסט תלויית יישום כמו "MyProtocol" ומונה <math>i</math> שמקודם עם כל קריאה, עד שמתקבל מפתח סודי אחד או כמה מפתחות באורך הרצוי. לסיכום הפסאודו קוד הבא ממחיש יצירת <math>t</math> מפתחות סודיים מתוך מפתח מאסטר אחד:
{| dir="ltr"
|-
|
:<math>\boldsymbol{\mathbf{HKDF}(\mathbf{salt}, KM, \mathbf{info})=K_1,K_2,K_3,...,K_t}</math>
:<math>\ \ \ PRK=\text{HMAC}_{salt}(KM)</math>
:<math>\ \ \ K_1=\text{HMAC}_{PRK}(\text{info} \ \| \ 0), K_{i+1}=\text{HMAC}_{PRK}(\text{info}\ \| \ i), 1\le i \le t</math>.
|}

==ביטחון==
ממחקרים שפורסמו ב-2016 על ידי אוניברסיטאות אחדות עולה שהפרוטוקול במבנה הבסיסי בשיחה בין שני משתמשים בטוח לשימוש. בינואר 2018 פורסם מחקר המצביע על חולשה בפרוטוקול סיגנל בשיחה קבוצתית בתוכנות סיגנל, ואטסאפ וטרימה. בניגוד לשיחה בין שני משתתפים בלבד המתקיימת לפי כללי הצפנה מקצה לקצה, בשיחה קבוצתית, שלמות השיחות ומסרי הניהול של הקבוצה אינם מוצפנים מקצה לקצה וכן לא מופעל אימות. משמעות הדבר היא שמי שיש לו גישה לשרת ההודעות יכול להוסיף עצמו לכל קבוצה ללא ידיעת מנהליה ובכך להפר את הקונספט של הצפנה מקצה לקצה. אם מישהו יכול להוסיף עצמו לכל קבוצה שיחפוץ הוא יקבל את כל השיחות המוצפנות בתוך הקבוצה כך שאין כל תועלת בהצפנה. הבעיה פחות קריטית בסיגנל משום שבתוכנה זו כל חברי הקבוצה הם גם מנהלים בהגדרה ולשרת אין גישה למסרי ניהול הקבוצה. החוקרים הציעו כמה תיקונים גנריים במטרה להבטיח אימות והצפנת כל המסרים והשיחות כולל מסרי ניהול המיועדים למנהלי הקבוצות. ראוי לציין שיישום ההתקפה בפועל מאוד קשה והתיקון קל מאוד כך שסביר להניח שבזמן הקרוב תוכנות המסרים המדוברות יפיצו עדכוני תוכנה מתאימים להסרת האיום.

==ראו גם==
* מיסור שלא לפרסום
* פרוטוקול שיתוף מפתח
* פרוטוקול דיפי-הלמן

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

* 

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

קטגוריה:מסרים מיידיים
קטגוריה:הצפנה
קטגוריה:תקנים באבטחת מידע