חידות מרקל

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

== חידת מרקל ==
חידת מרקל היא הצפנת טקסט גלוי כלשהו המכיל בתוכו סוד מסוים, המוחלשת במכוון באופן שניתן יהיה לפענחה באמצעות כוח גס, במאמץ מסוים שהוא בפקטור שניתן לשליטה. הדרך הפשוטה להכנתה היא באמצעות צופן סימטרי, נניח AES. מצפינים מסר הכולל סוד (מפתח הצפנה חד-פעמי) באמצעות מפתח הצפנה מוחלש אותו מכינים מ-<math>n</math> ספרות אקראיות והיתר מקבוע כלשהו שאינו סודי כמו מחרוזת אפסים. לדוגמה אם המפתח באורך 128 סיביות, והוא מורכב מ-96 אפסים מובילים ו-32 ספרות אקראיות, סיבוכיות התקפת כוח גס כנגד הצופן, דהיינו ניסוי כל המפתחות האפשריים היא <math>2^{32}</math> שזה בר ביצוע מבחינה מעשית, אך דורש מאמץ מסוים. אפשר לשלוט בכמות העבודה על ידי שינוי <math>n</math>. כמו כן כדי שקל יהיה לדעת אם הפענוח הצליח, יש צורך להוסיף יתירות מכוונת כמו טקסט קבוע מוסכם מראש (למשל "חידה מספר..."). הטקסט הקבוע אינו סודי וידוע גם למצותת.

מחידה כזו אפשר לבנות פרוטוקול שיתוף מפתח כדלהלן; צד אחד, נניח אליס, מכינה חידות רבות, כאשר כל חידה היא הצפנה של מפתח-הצפנה סודי אקראי ומספר סידורי. שימו לב שמדובר במפתח שונה מהמפתח שאיתו אליס מצפינה את החידה. כל חידה מכילה מפתח הצפנה סודי אחר ומוצפנת במפתח שונה, למעשה מספר החידות הוא כמספר המפתחות האפשריים בטווח <math>[0-2^n]</math>. את החידות היא שולחת לצד השני, נניח בוב. בוב בוחר באקראי חידה אחת אותה הוא מפענח בכוח גס, דהיינו מנסה את כל המפתחות האפשריים עד <math>2^n</math> (במקרה הגרוע) עד שמוצא את המפתח הנכון, מחלץ את המפתח הסודי שבתוכה יחד עם המספר הסידורי, שולח את המספר הסידורי בחזרה לאליס ושומר את המפתח הסודי. אליס שהכינה את החידות בעצמה יודעת באמצעות המספר הסידורי איזו מהחידות פוענחה לכן יודעת איזה מפתח הצפנה ברשות בוב וכעת הם משתפים ביניהם את אותו מפתח.

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

== תיאור הפרוטוקול ==
אליס ובוב מעוניינים לשתף ביניהם מפתח הצפנה סודי על מנת שיוכלו להתקשר זה עם זה בבטחה בערוץ פתוח. נניח לצורך הפרוטוקול שהם משתמשים בצופן AES עם מפתח 128 סיביות המיוצג כאן על ידי <math>E</math> ונניח שכל מפתח <math>p_i</math> בנוי משרשור מחרוזת של <math>128-n</math> אפסים עם מספר אקראי כלשהו בגודל <math>n</math> סיביות. עם מפתח זה אליס משתמשת כדי להצפין חידה אחת. מבנה החידה הוא מפתח אקראי סודי בגודל 128 סיביות המסומן כאן <math>K_i</math> ומספר סידורי <math>i</math> כשהם מוצפנים יחד עם טקסט קבוע כלשהו כמו <math>\text{Puzzle }\#</math>. הם יפעלו כדלהלן:
# אליס קובעת פקטור <math>n</math> (למשל <math>n=32</math>), כך שהמאמץ הדרוש לפענוח חידה אחת יהיה <math>2^n</math>.
# בוחרת <math>2^n</math> מספרים אקראיים <math>p_i\in \{0,1\}^n</math> (בגודל <math>n</math> סיביות). כל אחד מהם מרופד באפסים משלימים לקבלת אורך 128 סיביות: <math>p_i=0^{128-n} \| \ p_i</math>.
# בוחרת <math>2^n</math> מפתחות הצפנה סודיים אקראיים <math>K_i</math> (בגודל 128 סיביות).
# מכינה <math>2^n</math> חידות כדלהלן עבור <math>i=1,...,2^n</math> החידה: <math>\text{Puzzle}_i=E_{p_i}(\text{Puzzle }\#\text{} \ i \ \| \ K_i)</math>. הסימן <math>\|</math> מייצג שרשור (הדבקת שתי מחרוזות למחרוזת אחת גדולה יותר).
# שולחת את <math>2^n</math> החידות לבוב.
# בוב בוחר באופן אקראי חידה אחת ומפענח אותה באמצעות כוח גס ומחלץ את הטקסט הגלוי <math>\text{Puzzle }\#\text{i}</math> ואת <math>K_i</math>.
# בוב מחזיר לאליס את המספר הסידורי של החידה <math>i</math> ושומר בסוד את <math>K_i</math>.
# אליס מוצאת את המפתח המתאים למספר הסידורי <math>i</math> וכעת הם משתפים ביניהם את <math>K_i</math> מבלי שהמצותת יוכל לדעת.

=== סיבוכיות ===
נניח <math>N=2^n</math>, מהפרוטוקול עולה שהמאמץ הדרוש לאליס להכנת כל החידות הוא <math>O(N)</math>, כמו כן המאמץ הדרוש לבוב לפיענוח חידה אחת גם הוא <math>O(N)</math>. אולם עבור המצותת איב המאמץ הדרוש לפתרון חידה אחת הוא <math>2^n</math> וישנן <math>N</math> חידות, במקרה הממוצע עליה לפענח לפחות מחצית מהן, כלומר <math>1/2N\cdot O(N)</math> שזה <math>O(N^2)</math>. כלומר הוכח שקיים פער ריבועי של פקטור העבודה בין המשתתפים בפרוטוקול לבין המצותת, אך לא יותר מזה. מסיבה זו הפרוטוקול אינו יעיל, כיוון שלכל היותר מושג ביטחון ריבועי. למשל אם <math>N=2^{32}</math> ביטחון המערכת הוא רק <math>2^{64}</math>, שזה מעט ולא מצדיק את ההשקעה הדרושה מצד אליס ובוב. למרות זאת, עדיין אפשר לראות בשיטה כחלוצה ראשונה של תפישת המפתח הפומבי. רלף מרקל פיתח את שיטת החידות שלו כשהיה סטודנט בברקלי, וכבר אז צפה את הפוטנציאל הטמון במערכת מפתח פומבי, אולם לא הכול עמדו על חשיבותה. מאוחר יותר, כאשר דיפי והלמן פרסמו את עבודתם בנושא הצפנת מפתח ציבורי, ציינו שהרעיון של מרקל היווה בין היתר השראה עבורם לפיתוח מה שנודע לאחר מכן כפרוטוקול דיפי-הלמן, תגלית שהשפיעה מאוד על הקריפטוגרפיה המודרנית.

== קישורים חיצוניים ==
* Ralph C. Merkle, [https://web.archive.org/web/20100611193243/http://www.cse.msstate.edu/%7Eramkumar/merkle0.pdf Secure Communications Over Insecure Channels], 1978.

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