מיסור שלא לפרסום

בקריפטוגרפיה, מיסור שלא לפרסום או מיסור שלא לציטוט (באנגלית: Off-the-Record Messaging, או בקיצור OTR),, הוא פרוטוקול קריפטוגרפי בקוד פתוח המספק הצפנה מקצה-לקצה למסרים מיידיים. OTR משתמש בשילוב של מספר פרימיטיבים קריפטוגרפיים ידועים: צופן סימטרי AES עם מפתח באורך 128 סיביות, פרוטוקול שיתוף מפתח דיפי-הלמן עם מפתחות באורך 1536 סיביות וקוד אימות מסרים SHA1-HMAC המבוסס על פונקציית הגיבוב SHA-1. במקביל לאימות והצפנה, OTR מספק גם חשילות (שהיא יתרון, משום שחלק ממטרות הפרוטוקול היא יכולת ההכחשה, כמוסבר להלן) וסודיות מושלמת קדימה.

המניע העיקרי מאחורי פיתוח הפרוטוקול הוא לספק אימות וסודיות השיחה, אך בניגוד לכלי הצפנה נפוצים כמו TLS לאפשר גם "יכולת הכחשה", כך שלא יהיה באפשרות צד שלישי או אפילו המתקשרים עצמם להוכיח בעתיד מיהו מקור שיחה שנעשתה. OTR הועלה לראשונה במאמר שכותרתו: "תקשורת שלא לציטוט, או מדוע לא להשתמש ב-PGP" שפורסם באוקטובר 2004 על ידי Nikita Borisov, Ian Goldberg ו-Eric Brewer מאוניברסיטת ברקלי. ההתעניינות בפרוטוקול OTR גברה בעקבות החשיפות המסעירות שליוו את פרשת סנודן, שה-NSA ביצע ועדיין מבצע האזנות סתר מאסיביות בכל העולם והוא משמש אבן דרך חשובה ומודל לחיקוי בהתפתחות ההצפנה המודרנית. השאיפה כיום להבטיח פרטיות באמצעות הצפנה חזקה באופן כזה שלא תהיה לגוף מרכזי כלשהו סמכות או יכולת להפר אותה ובד בבד להסתיר מעיני המשתמש הלא מיומן בנושאי אבטחת מידע את כל המנגנון הקריפטוגרפי המסובך. לאפשר שימוש חלק ואינטואיטיבי ללא צורך בהבנה יתרה של העיקרון התאורטי העומד מאחורי המערכת.

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

== היסטוריה ==
OTR הוצע כאלטרנטיבה ל-PGP ומערכת S/MIME , "בסדנא בנושא פרטיות בחברה האלקטרונית". הגרסה הראשונה 0.8.0 יצאה ב-21 בנובמבר 2004. בשנת 2005 מסמך שפורסם על ידי מריו ריימונדו, רוסאריו ג'נארו והוגו קרבצ'יק העלה מספר חולשות בפרוטוקול והציע תיקונים, בעיקר בחלק הקשור לשיתוף המפתח הנקרא בקיצור AKE (חילוף מפתח מאומת) שבגרסת הפרוטוקול המקורית היה חשוף להתקפת אדם באמצע. גם כן, האפשרות לפצל הודעות OTR על מנת להתמודד עם מערכות צ'אט בעלי גודל הודעה מוגבל, שיטה פשוטה של אימות נגד מתקפת האדם שבאמצע יושמה. במקום להשוות בין סיכום הביקורת לבין המפתח, ידיעה של סוד שרק שני הצדדים המשתתפים בשיחה יודעים אותו, יכול לשמש לאימות של שני הצדדים, משום שיש סבירות נמוכה שהתוקף ידע אותו. גרסה 3 של הפרוטוקול פורסמה בשנת 2012. כדאי להימנע ממצב שבו מספר מחשבים מתחברים לאותה שיחה עם אותו שם משתמש בו זמנית, נוצרה תווית זיהוי מדויקת יותר עבור כל משתמש שיושמה בגרסה 3. יתרה על כך, מפתח חדש נוצר שיוכל לשמש כערוץ נותנים נוסף. נכון ל-2016 הגרסה העדכנית ביותר היא libotr 4.1.1 וכן pidgin-otr 4.0.2 שמכילות מספר תיקונים בטיחותיים של הגרסאות הקודמות כמו גלישת חוצץ ומומלץ לעבור אליהן מיידית.

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

בנוסף, מתעורר כאן פרדוקס מסוים. מצד אחד בשיחה חברתית אינטימית המשתתפים מעוניינים לוודא שהם אכן משוחחים עם מי שהם חושבים ולא עם מתחזה, מצד שני הם לא מעוניינים שיהיה בכוחו של אף אחד אפילו לא אחד מהצדדים בעצמם, לשייך אליהם או להוכיח שהם אחראים לדברים שנאמרו לאחר מעשה. זהו מאפיין חשוב שנקרא יכולת הכחשה שקיים, במידה מסוימת, בשיחה פרטית פיזית (בהנחה שלא מצותתים להם). למשל אפילו בוב עצמו לא יוכל לטעון שאליס אמרה לו דברים כלשהם כי היא יכולה להכחיש ולטעון שהוא בעצם זה שאמר אותם ואין לו דרך להוכיח זאת אם רק שניהם היו נוכחים בזמן שהדברים נאמרו. פרוטוקולים כמו PGP או SSL אינם בנויים לספק מאפיין זה. את היעדים האמורים אפשר להשיג בדרך הבאה:
* סודיות קדימה. כל השיחות יהיו מוצפנות באמצעות מפתחות חד פעמיים קצרי טווח שנוצרים לפי הצורך באופן אקראי ומושמדים מיד לאחר השימוש הם נקראים מפתח שיחה או המפתח הארעי (באנגלית: Ephemeral key). לכן גם אם מפתח סודי ארוך טווח של אחד מהמשתתפים נחשף לא ניתן יהיה לעשות בו שימוש כדי לפענח שיחות שנעשו בעבר. כדי לשתף את המפתח החד-פעמי הם משתמשים בפרוטוקול דיפי-הלמן שמאפשר למשתתפים לשתף מפתח מעל גבי ערוץ פתוח הנתון לציתות מבלי לחשוף אותו לאף אחד. בקצרה, תחילה הם בוחרים מספר ראשוני גדול <math>p</math> ויוצר <math>g</math> של תת-חבורה של <math>\mathbb{Z}_p^*</math> מסדר ראשוני גדול, שניהם גלויים ומפורסמים לכל. ואז אליס ובוב בוחרים את המפתחות הפרטיים שלהם שהם השלמים <math>a</math> ו-<math>b</math> בהתאמה ומשדרים אחד לשני את המפתחות הציבוריים שלהם שהם <math>g^a</math> ו-<math>g^b</math> מודולו <math>p</math> בהתאמה. אליס יכולה כעת לחשב את המפתח המשותף על ידי הכפלה של המפתח הפרטי שלה עם המפתח הציבורי של בוב: <math>g^{ab}\equiv (g^b)^a</math> ובאותה דרך בוב מחשב את המפתח על ידי <math>g^{ab}\equiv (g^a)^b</math> (מודולו <math>p</math>). המפתח המשותף <math>g^{ab}</math> מודולו <math>p</math> אינו ידוע לאיש מלבדם. ההנחה היא שמבחינה מתמטית כל עוד לא קיים מחשב קוונטי, קשה מאוד לגלות את <math>a</math> או את <math>b</math> מתוך <math>g^{ab}</math> מודולו <math>p</math> ולכן הסוד שלהם בטוח. אלא אם כן מישהו יגלה דרך מתוחכמת לפתור את בעיית הלוגריתם הבדיד או בעיית דיפי-הלמן הנחשבות לבעיות מתמטיות קשות מזה שנים רבות. 
* חתימה דיגיטלית. כדי להבטיח את זהות הצדדים המשתתפים בשיחה יש צורך בחתימה דיגיטלית כמו DSA או RSA. ההנחה היא שלכל משתמש חתימה דיגיטלית קבועה שבדרך כלל אמורה להחזיק מעמד שנים רבות. חתימה דיגיטלית מאושרת על ידי רשות מאשרת אינה ניתנת להכחשה, החתימה משמשת כהוכחה לשייכות התוכן החתום לחותם מבחינה חוקית. כאן מעוניינים להשיג בדיוק את ההפך לכן במקום לחתום על השיחות עצמן החתימה משמשת רק לאימות המפתחות הציבוריים <math>g^a</math> ו-<math>g^b</math> בהתאמה. בדרך זו כל אחד יכול לאמת שאכן אליס או בוב הם הבעלים של המפתחות הללו אך לא מעבר לכך. בכל אופן, בידי אליס ובוב קיים מידע נוסף והוא המפתחות הפרטיים שלהם, מידע זה שנשמר בסוד ישמש אותם לאחר מכן לאימות השיחות עצמן. 
* קוד אימות מסרים. קוד אימות בקיצור MAC מאפשר לאליס ובוב להבטיח את אותנטיות ומקור השיחות שלהם, אך בד בבד למנוע מצד שלישי מלהוכיח זאת בעצמו. התכונה של קוד אימות מסרים היא שבניגוד לחתימה דיגיטלית אינו מכיל אי-יכולת הכחשה, למעשה כל מי שיודע מהו המפתח הפרטי איתו הוכן קוד האימות יכול בעצמו להכין קוד אימות של תוכן כל שיחה אחרת. בקצרה, פונקציית אימות כמו HMAC היא פונקציה המקבלת את השיחה המיועדת לאימות ומפתח סודי ומפיקה תג אימות קצר אותו מצרפים לשיחה עצמה במהלך שידורה. המקבל משתמש בפונקציית האימות המתאימה, עם אותו מפתח סודי כדי לוודא באמצעות התג המצורף שאכן תוכן השיחה נותר שלם ואינו מכיל שינויים זדוניים על ידי צד שלישי כלשהו וכן שהשיחה אכן הגיעה מהמקור ממנו היא אמורה להגיע. לעומת זאת, למתבונן מהצד, אין בתג האימות כל מידע שיכול להוכיח ממי הגיעה השיחה. יתרה מזו, הפרוטוקול אף מכתיב לחשוף את מפתח האימות במכוון (לאחר שמקבל השיחה אישר שקיבל אותה), עובדה זו מוסיפה פרטיות כי לאחר קבלת השיחה ובדיקת תג האימות אין צורך במפתח האימות, כך שחשיפתו בעצם מטשטשת לחלוטין את הקשר בין מפתח האימות לבעל השיחה.
* הצפנה חשילה. בנוסף ליכולת ההכחשה האמורה מנסים להשיג תכונה נוספת הנקראת חשילות או יכולת זיוף. כל השיחות מוצפנות באופן כזה שניתן יהיה לבצע מניפולציה שלהן מבלי שהדבר יתגלה. לעובדה זו שלכאורה נשמעת מנוגדת למטרה, יש חשיבות רבה כי היא בעצם מאפשרת לשלול כל הוכחה שתינתן בעתיד לגבי מקור השיחה כי כל אחד יכול היה "לזייף" את תוכנה. כמובן שהמשתתפים בשיחה בזמן אמת יכולים לוודא שלא נעשו שינויים כי בידם מפתח אימות סודי. לאחר מעשה, כאשר מפתח האימות נחשף אי אפשר להשתמש בו כדי להוכיח שהמסר המקורי לא שונה. אפשר להשיג זאת על ידי צופן זרם או במצב הפעלה של צופן בלוקים המדמה צופן זרם כמו מצב מונה. צופן זרם מצפין את המידע על ידי XOR עם מפתח הצפנה באורך המידע עצמו, סיבית אחר סיבית או מילה אחר מילה. ההשפעה של מניפולציות (היפוך סיביות) של הטקסט המוצפן משפיעה אך ורק על הסיביות המתאימות בטקסט המקורי לאחר פענוח. אם מישהו מצליח לנחש חלק מהטקסט המוצפן ביכולתו לשנות את הטקסט המוצפן למה שיחפוץ אפילו מבלי לגלות את מפתח ההצפנה.

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

לצורך תיאור הפרוטוקול, נניח שאליס רוצה לשלוח את המסר "HELLO" כשהוא מוצפן לבוב. נניח שהמפתח הציבורי הטרי ביותר של אליס הוא <math>g^{x_{i}}</math> אליו משויך המספר הסידורי <math>kIDa_i</math>, נניח עוד שבוב שלח לאליס קודם לכן את המפתח הציבורי שלו <math>g^{y_{j}}</math> יחד עם המזהה הייחודי שלו (המפתח האחרון של כל אחד מהם יכול להיות זה שנוצר בעת הרצת פרוטוקול AKE המתואר להלן או שהוא מפתח חדש שהתקבל במסגרת חילופי ההודעות ביניהם). היא מבצעת את המהלכים הבאים:

# תחילה נוטלת את המפתח הציבורי האחרון שקיבלה מבוב <math>g^{y_{j}}</math> מכפילה במפתח הפרטי שלה <math>x_{i}</math> כדי לקבל את המפתח המשותף הבא <math>k_{ij}</math> ומכינה את מפתח האימות הבא <math>mk_i=H(k_{ij})</math> (מפתח האימות מופק באמצעות פונקציית הגיבוב של המפתח המשותף) וכן מקדמת את המונה <math>c</math> לצורך ההצפנה הסימטרית של גוף ההודעה. שלושת הערכים הללו יהיו חד פעמיים, איתם אליס תשתמש רק עבור הודעה אחת ואז תמחוק אותם.
# כמו כן היא מייצרת מפתח דיפי-הלמן חדש; בוחרת שלם אקראי חדש <math>x_{i+1}</math> שמקבל את המספר הסידורי <math>kIDa_{i+1}</math> ומחשבת את <math>g^{x_{i+1}}</math>.
# ואז היא שולחת לבוב את המסר הבא:
:::<math>T_a=\{kIDa_i,kIDb_i,g^{x_{i+1}},c,E_{k_{ij},c}(\text{HELLO})\},\text{MAC}_{mk_i}(T_a), mk_{i-1}</math>.

במילים, אליס שולחת לבוב מסר המורכב ממספר חלקים; החלק הראשון מכיל את גוף ההודעה כשהוא מוצפן באמצעות הצופן הסימטרי במצב מונה עם המפתח והמונה שהכינה, את המפתח הציבורי שלה לצורך ההודעה הבאה, מזהי המפתחות הציבוריים שלה ושל בוב והמונה ששימש אותה להצפנת ההודעה. החלק השני מכיל את תג האימות של ההודעה שהוכן באמצעות פונקציית MAC. והחלק השלישי הוא מפתח האימות הישן שאיתו השתמשה כדי לאמת את ההודעה הקודמת ואין לה צורך בו יותר. המטרה של שליחת המפתח היא רק כדי לחשוף אותו כך שאף אחד לא יכול להוכיח בעתיד מי היה מקור ההודעה. כי אם מפתח האימות הסימטרי ידוע לכולם, כל אחד יכול להכין הודעה מזויפת ולייצר לה תג אימות מתאים עם מפתח זה, אך מרגע שהמפתח נחשף אין בזה כל הוכחה לכך שמקור ההודעה מאליס. בוב מצידו מייצר מפתח דיפי הלמן חדש מהמפתח הציבורי של אליס המסומן בתווית <math>kIDa_i</math> והמפתח הפרטי שלו המסומן בתווית <math>kIDb_i</math> ומקבל את מפתח ההצפנה <math>k_{ij}</math> (אותו מפתח בדיוק שיצרה אליס) איתו הוא מפענח את החלק המוצפן של ההודעה <math>T_a</math>, בודק שהיא תקינה על ידי תג האימות המצורף וקורא את ההודעה המיועדת אליו. ואותו תהליך חוזר על עצמו באופן דומה הפעם מצד בוב.

באופן תמציתי שיחת OTR יכולה להראות כך:
{| dir="ltr"
|-
|
:<math>A\longrightarrow B:g^{a_1}</math>
:<math>B\longrightarrow A:g^{b_1}</math>
:<math>A\longrightarrow B:g^{a_2}, E(M_1,k_{11})</math>
:<math>B\longrightarrow A:g^{b_2}, E(M_2,k_{21})</math>
:<math>A\longrightarrow B:g^{a_3}, E(M_3,k_{22})</math>
:<math>\vdots</math>
|}
וכן הלאה. כאשר <math>E(M,k)</math> מייצג הצפנה באמצעות AES במצב מונה.

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

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

===שיתוף מפתח מאומת===
בגלל ליקויים בטיחותיים שהתגלו בגרסה המקורית, כדי לסכל התקפת אדם באמצע, פרוטוקול OTR גרסה 2 משתמש בפרוטוקול משני הנקרא SIGMA כדי לבצע שיתוף מפתח מאומת (בקיצור AKE) בארבעה מהלכים. בתמצית הרעיון הוא שהמשתתפים בפרוטוקול תחילה יוצרים ערוץ בטוח באמצעות פרוטוקול דיפי הלמן ללא אימות, ולאחר מכן מבצעים אימות דו כיווני בתוך הערוץ הזה. ביתר פירוט בוב מתחיל במסר:
:(1) <math>B\longrightarrow A:E_r(g^b), H(g^b)</math>
כאשר <math>E</math> הוא הצפנת AES של המפתח הציבורי הארעי של דיפי הלמן (<math>r</math> הוא ערך אקראי חד פעמי המשמש כמפתח הצפנה) ו-<math>H</math> היא פונקציית גיבוב. אליס מחזירה לבוב את:
:(2) <math>A\longrightarrow B:g^a</math>
לאחר בדיקה שהערכים תקינים ונמצאים בגבולות המותרים, בוב מחשב את המפתח המשותף על ידי <math>s=(g^a)^b</math> ומכין ממנו עם פונקציית גיבוב בתצורות שונות, שני מפתחות הצפנה <math>c_1,c_2</math> וארבעה מפתחות אימות <math>m_1,m_2,m_3,m_4</math> (מחציתם להצפנה ואימות המסרים שלו ומחציתם לפענוח ואימות המסרים של אליס). בוחר מזהה ייחודי טרי הנקרא <math>kID_b</math>, משתמש בפונקציית MAC כדי להכין תג אימות של האלמנטים הבאים: המפתחות הציבוריים שלו ושל אליס <math>g^a</math> ו-<math>g^b</math>, מזהה המפתח שלו <math>kID_b</math> ומפתח האימות הציבורי <math>Pub_b</math> של החתימה הדיגיטלית שלו: <math>m_b=\text{MAC}_{m_1}(g^b,g^a,Pub_b, kID_b)</math>. חותם באמצעות החתימה הדיגיטלית שלו על תג האימות: <math>x_b=\text{Sign}_b(m_b)</math> ומצרף לחתימה את המפתח האימות הציבורי שלו וכן את מזהה מפתח השיחה כך שמתקבל <math>X_b=\{Pub_b,kID_b,x_b\}</math>. ואז שולח לאליס את:
:(3) <math>B\longrightarrow A:E_{c_1}(X_b), \text{MAC}_{m_2}(E_{c_1}(X_b)),r</math>
אליס פועלת בדרך דומה, תחילה היא מפענחת את ההצפנה של <math>g^b</math> עם המפתח <math>r</math> ובודקת את תקינות כל הערכים שקיבלה. אם הכול תקין היא מחשבת את מפתח השיחה המשותף <math>s=(g^b)^a</math> ומכינה ממנו באמצעות פונקציית הגיבוב באותה דרך את שני מפתחות ההצפנה וארבעה מפתחות האימות שהכין בוב אצלו. משתמשת במפתח <math>m_2</math> כדי לבדוק את תג האימות שקיבלה מבוב במסר האחרון, משתמשת במפתח <math>c_1</math> כדי לפענח את החתימה הדיגיטלית של בוב <math>X_b</math> מחשבת את תג האימות <math>m_b</math> עם המפתח <math>m_1</math> ומשתמשת במפתח הציבורי של החתימה הדיגיטלית של בוב <math>Pub_b</math> כדי לוודא ש-<math>m_b</math> אכן הגיע מבוב. כעת בוחרת מזהה מפתח משלה <math>kID_a</math> ומחשבת את תג האימות שלה: <math>m_a=\text{MAC}_{m_3}(g^a,g^b,Pub_a,kID_a)</math> חותמת עליו עם החתימה הדיגיטלית שלה: <math>x_a=\text{Sign}_a(m_a)</math> ומכינה את ההודעה <math>X_a=\{Pub_a,kID_a,x_a\}</math> ושולחת לבוב את:
:(4) <math>A\longrightarrow B:E_{c_2}(X_a),\text{MAC}_{m_4}(E_{c_2}(X_a))</math>
מה שנשאר לבוב זה לוודא תקינות ערכים, לבדוק את החתימה הדיגיטלית ואת תג האימות לפענח את החלקים הדרושים פענוח וכעת שניהם משתפים מפתח מאומת בצורה כזו שלא רק שהם בטוחים שאיש לא יודע מהו, אלא הם גם בטוחים בהסתמך על החתימה הדיגיטלית שלהם, שזהותם וודאית והם אינם מתחזים.

== בעיית המיליונרים ==
החסרון בפרוטוקול AKI הוא שבכל שלבי הפרוטוקול ההנחה היא שאליס מכירה את בוב ויודעת מהו המפתח הציבורי שלו וכן בוב מכיר את אליס ויודע מהו המפתח הציבורי שלה. אך אם בוב לא מכיר את אליס או שאליס אינה מכירה את בוב איב יכולה להתחזות לאחד מהם בקלות על ידי ביצוע כל מהלכי הפרוטוקול המתוארים אך עם המפתחות שלה במקום של אליס או בוב. ההתחזות לא תתגלה אלא אם כן אליס או בוב ינסו לברר מהו המפתח הציבורי שלהם באמצעים אחרים מחוץ לפרוטוקול. התקפה כזו קלה לביצוע במיוחד על ידי גורם מרכזי שיש לו שליטה על שרת ההודעות. למעשה קיים תוסף ל-Jabber (כיום נקרא XMPP) הנקרא mod_otr שמבצע באופן אוטומטי התקפת אדם באמצע נגד שיחת OTR. כדי לסכל את ההתקפה אפשר לפעול בדרך פשוטה. כל משתמש יאחסן רשימה של המפתחות הציבוריים של כל החברים איתם הוא משוחח. במידה שמצטרף לשיחה חבר חדש שהמפתח שלו אינו מוכר (לא נמצא ברשימה), תופיע התראה שמבקשת מהמשתמש לוודא שהמפתח נכון. למעשה OTR הציג למשתמש "טביעת אצבע" בדמות QR של תוצאת הפונקציה SHA-1 של המפתח הלא מוכר והמשתמש נדרש להשוות את טביעת האצבע מול טביעת אצבע שהוא השיג בעצמו באמצעים אחרים (מחוץ למהלכי הפרוטוקול). הבעיה היא שרוב המשתמשים לא מבינים את משמעות טביעת האצבע, הם מעדיפים להתעלם מההודעה או מנסים להשוות רק מספר בתים מתחילת טביעת האצבע ומספר בתים מסופה. מה שמאפשר התקפה מצד איב עם מפתח ציבורי הדומה למפתח הציבורי של אליס או בוב רק בבתים הראשונים והאחרונים. בנוסף השאיפה היא להסתיר מעיני המשתמש את המנגנון הקריפטוגרפי המסובך שפועל מאחורי הקלעים ולדמות שימוש חלק ככל האפשר בתוכנת המסרים כאילו לא היה קיים. 

הפתרון שננקט ב-OTR גרסה 3 ומעלה הוא שימוש בפרוטוקול משני הנקרא "פרוטוקול המיליונרים הסוציאליסטיים" בקיצור (SMP) שהוא עצמו וריאציה של בעיית המיליונרים שניתן לה פתרון מעשי על ידי Yao. ב-2001 פורסם פתרון יעיל לבעיית המיליונרים הסוציאליסטיים על ידי Boudot, Schoenmakers, ו-Traoré בהתבסס על בעיית הכרעת דיפי-הלמן בקיצור DDH. הפתרון מאפשר לשני מיליונרים לדעת האם עושרם שווה מבלי לחשוף את עושרם המדויק לאף אחד מהצדדים או לצד שלישי. במילים אחרות זהו פרוטוקול כמעט אפס ידיעה שבו המידע הנחשף בסיומו שווה לסיבית אחת בלבד - אמת או שקר. בהקשר של OTR במקום להשוות כסף, משווים את המידע המשותף לאליס ובוב. אם איב המנסה להתחזות לאליס לא תצליח לנחש נכון את הסוד בניסיון הראשון הפרוטוקול יסתיים מיד בכישלון. לכל היותר איב תצליח לשבש או לקטוע זמנית את השיחה בין אליס ובוב. כדי למנוע מאיב מלהונות את המשתתפים על ידי העברת חילופי המסרים של פרוטוקול SMP כלשונם מאחד לשני הסוד אותו משווים כולל טביעת אצבע עם SHA-2 של מזהה השיחה, טביעות האצבע של מפתחות שני הצדדים והסוד המשותף. במצב כזה רוב הסיכויים שהתקפת MITM תכשל מיד משום שאצל בוב ואליס יתקבלו טביעות אצבע שונות. בד בבד הפרוטוקול מבטיח שאף אחד לא יוכל ללמוד מאומה מחלופי המסרים על הסוד המשותף שלהם מעבר לעובדה שהוא שווה אצל שניהם. כל התהליך מתרחש מאחורי הקלעים ללא מעורבות המשתמשים עצמם.

===פרוטוקול SMP===
ב-OTR כל החישובים של פרוטוקול SMP מבוצעים בחבורה <math>G</math> מסדר ראשוני <math>q</math> באורך 1536 סיביות. המספר הראשוני הוא בדיוק זה המופיע בתקן בשם קבוצה 5. בנוסף קיים יוצר <math>g_1</math>, שניהם ידועים ומפורסמים (בתקן היוצר הוא 2). ההנחה בתחילת הפרוטוקול שאליס ובוב מחזיקים בסודות פרטיים <math>x</math> ו-<math>y</math> בהתאמה שאליהם מתייחסים כאל אלמנטים של השדה <math>\mathbb{Z}_q</math> והמטרה של הפרוטוקול היא להוכיח ש-<math>y=x</math> מבלי לחשוף מאומה פרט לעובדה האם הם שווים או לא. הפרוטוקול מבוסס על הרעיון של אפס ידיעה, שאומר בתמצית היכולת להוכיח ידיעת סוד מבלי לחשוף מידע כלשהו לגבי הסוד עצמו שלא היה אפשר לדעת בדרכים אחרות. כל מהלכי הפרוטוקול מלווים בהוכחת אפס ידיעה על מנת להבטיח שלא שונו בטעות או בזדון (כלומר הבטחת הגינות). 

תחילה, לצורך הפרוטוקול נחוצים עוד שני יוצרים אותם מכינים ומשתפים בשיטת דיפי-הלמן: אליס בוחרת אלמנט אקראי <math>a_2\in_R\mathbb{Z}_q</math> ושולחת לבוב את <math>g_1^{a_2}</math> ובוב בוחר אלמנט אקראי <math>b_2\in_R\mathbb{Z}_q</math> ושולח לאליס את <math>g_1^{b_2}</math> ושניהם מחשבים את <math>g_2=g_1^{a_2b_2}</math>. הם חוזרים על התהליך המתואר עם שני אלמנטים אקראיים נוספים <math>a_3</math> ו-<math>b_3</math> ומחליפים ביניהם את <math>g_1^{a_3}</math> ו-<math>g_1^{b_3}</math> ומתקבל ערך משותף נוסף <math>g_3=g_1^{a_3b_3}</math>. צריך לזכור שכל החישובים נעשים מודולו <math>q</math>. 

בשלב השני, מסתירים את הסודות <math>x</math> ו-<math>y</math>. אליס ובוב בוחרים אלמנטים אקראיים נוספים <math>a</math> ו-<math>b</math> בהתאמה ומחשבים ומחליפים ביניהם את <math>(P_a,Q_a)=(g_3^a,g_1^ag_2^x)</math> וכן <math>(P_b,Q_b)=(g_3^b,g_1^bg_2^y)</math>. אליס משתמשת ב-<math>a_3</math> כדי לחשב את <math>\textstyle{R_a=\left(\frac{Q_a}{Q_b}\right)^{a_3}}</math>. באופן דומה בוב מחשב את <math>\textstyle{R_b=\left(\frac{Q_a}{Q_b}\right)^{b_3}}</math> ואז הם מחליפים ביניהם את התוצאות. שניהם מחשבים את הערך המשותף <math>R_{ab}=R_a^{b_3}=R_b^{a_3}</math> ואז היות שמתקיים:
{| dir="ltr"
|-
|
:<math>R_{ab}=\left(\frac{Q_a}{Q_b}\right)^{a_3b_3}</math>
:<math>\ \ \ \ \ \ \ =(g_1^{a-b}g_2^{x-y})^{a_3b_3}</math>
:<math>\ \ \ \ \ \ \ =g_3^{a-b}g_2^{(x-y)a_3b_3}</math>
:<math>\ \ \ \ \ \ \ =\left(\frac{P_a}{P_b}\right)\cdot\left(g_2^{a_3b_3}\right)^{x-y}</math>
|}
לכן בשלב ההוכחה, כדי לוודא ש-<math>x=y</math> כל שעליהם לעשות הוא לבדוק האם <math>\textstyle{R_{ab}=\left(\frac{P_a}{P_b}\right)}</math>. אף אחד מהצדדים לא יודע מהו <math>g_2^{a_3b_3}</math> שהוא יוצר אקראי של <math>G</math> לכן אם <math>x\ne y</math> הערך <math>\textstyle{\left(R_{ab}\cdot\frac{P_b}{P_a}\right)}</math> יהיה אלמנט אקראי כלשהו ב-<math>G</math> שאינו תורם שום מידע לאף אחד ואילו אם <math>x=y</math> הוא יהיה שווה 1 כי החזקה מתאפסת. כדי להבטיח הגינות כלומר שהצדדים פעלו בדיוק לפי הפרוטוקול אליס נדרשת להוכיח לבוב (וההפך) שאותו סוד שימש להכנת <math>P_a</math> ו-<math>Q_a</math> וכן שהיא יודעת את הסוד שלה <math>x</math>. כדי למנוע מאליס ובוב מלהעתיק את ההוכחות אחד לשל השני, בשלב הכנת היוצרים הפרוטוקול מנצל טכניקה מאלגוריתם של שנור בשילוב פונקציית הגיבוב SHA-2 עם תחיליות שונות למשל <math>H_n(x)</math> הוא גיבוב של הקבוע <math>n</math> שאליו משורשר <math>x</math>. יש לשים לב שאקראיות הערך <math>\textstyle{\left(R_{ab}\cdot\frac{P_b}{P_a}\right)}</math> אינה תלויה באנטרופיה של הסודות <math>x</math> או <math>y</math>, במילים אחרות הפרוטוקול יעבוד היטב גם אם הסודות המשותפים אינם מספרים אקראיים אלא מילים בעלי משמעות בשפה כלשהי עם יתירות גבוהה.

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

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

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

== קישורים חיצוניים ==
* 
* [https://otr.cypherpunks.ca/Protocol-v3-4.0.0.html מבנה הפרוטוקול] באנגלית

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

קטגוריה:מסרים מיידיים
קטגוריה:הצפנה