פנקס חד-פעמי - הצופן המושלם (?)

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

ראשית כל - מה זה “צופן” בהקשר שלנו? צופן הוא שיטה כלשהי לקחת טקסט, או כל פיסת מידע אחרת, ולבצע בה מניפולציות אלו ואחרות כך שבסופו של דבר יתקבל משהו שנראה למתבונן מהצד כמו ג’יבריש חסר משמעות. למידע המקורי קוראים כתב גלוי ולמידע הג’יברישי קוראים כתב סתר ולפעולה של המרת הכתב הגלוי לכתב הסתר קוראים הצפנה. הרעיון הוא שאפשר יהיה לשחזר מכתב הסתר את הכתב הגלוי, בפעולה שנקראת פענוח, אבל שלא כל אחד יכול לבצע את הפענוח; רק מי שאנו חפצים ביקרו. בשביל מה זה טוב? כדי להעביר מידע סודי שיש סכנה שמישהו יצליח לצותת לו. למשל, תקשורת ברשת האינטרנט. אם אנחנו שולחים לאתר מכירות באינטרנט את מספר כרטיס האשראי שלנו, נרצה שרק האתר יוכל לקרוא את המספר ולא אף אחד אחר. בגלל שמעייף לדבר תמיד על עצמנו ועל אתר שאנחנו מנסים לתקשר איתו, בדרך כלל משתמשים בדמויות בשם אליס ובוב כדי לתאר את הסיטואציה.

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

פנקס חד-פעמי היא שיטה פשוטה עד להפתיע. ראשית, בואו נחשוב שהכתב הגלוי הוא בסך הכל סדרה של ביטים: 0 ו-1. זה לא מופרך כמו שזה נשמע - כל קובץ טקסט במחשב מקודד כך, בסופו של דבר (בשיטה הפשוטה לייצג קבצי טקסט - ASCII - כל קבוצה של שמונה ביטים מייצגת תו בודד כלשהו). נניח שבכתב הגלוי יש בסך הכל $latex n$ ביטים. ההצפנה שלו תשתמש במפתח שגם האורך שלו הוא $latex n$ ביטים, ומה שנעשה יהיה לבצע פעולת XOR בין הביטים של הכתב הגלוי והביטים של המפתח.

מהי פעולת XOR? השם הוא קיצור של eXclusive-OR, אבל זה לא קריטי. הרעיון הוא שאם מבצעים XOR לשני ביטים בעלי אותו הערך התוצאה היא 0, ואם מבצעים אותו לשני ביטים בעלי ערך שונה התוצאה היא 1. כלומר, $latex 0\ \mbox{XOR }0=1\ \mbox{XOR }1=0$ ואילו $latex 1\ \mbox{XOR }0=0\ \mbox{XOR }1=1$.

דוגמה: נניח שהכתב הגלוי הוא $latex 0101$ והמפתח הוא $latex 1100$. אז ההצפנה מתבצעת על ידי לקיחת הביט הראשון של הכתב הגלוי (0) והביט הראשון של המפתח (1), ביצוע XOR והחזרת התוצאה (1) בתור הביט הראשון בכתב הסתר. לאחר מכן עושים אותו דבר לביט השני בכתב הגלוי (1) והמפתח (1) ומקבלים 0, וכן הלאה. תוצאת ההצפנה הסופית היא $latex 1001$. אפשר לכתוב את זה בפשטות בכתיב המתמטי הבא: $latex 0101\oplus1100=1001$.

באופן כללי, אם $latex P$ הוא הכתב הגלוי, $latex K$ הוא המפתח ו-$latex C$ הוא כתב הסתר, אז הפעולה של פנקס חד-פעמי מתוארת על ידי $latex C=P\oplus K$. עד כדי כך פשוט.

אפשר להכליל את השיטה הזו גם למקרה שבו $latex P$ לא מורכב רק מאפסים ואחדים אלא, נאמר, מאותיות הא”ב. במקרה הזה נוח לחשוב על כל אות כמייצגת את המספר הסידורי שלה בא”ב פחות 1. למשל א’ היא 0, ב’ היא 1 ואילו ת’ היא 21. כעת אפשר “לחבר” אותיות על ידי כך שמחברים את המספרים שלהן; אם התוצאה היא לפחות 22 פשוט נחסר ממנה 22. כלומר, $latex 21+1=22$ שהוא גדול מכדי לייצג אות ולכן נחשוב על התוצאה כעל $latex 21+1=0$ (ובדומה, $latex 17+9=4$, למשל). לחשבון המוזר הזה שבו אם חורגים מגבול כלשהו $latex n$ פשוט מחסרים מהתוצאה $latex n$ קוראים חשבון מודולרי ואומרים שזה חשבון מודולו $latex n$ אם $latex n$ הוא הגבול; אם תחשבו על זה, XOR הוא בעצם חשבון מודולרי מודולו 2.

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

בואו נתחיל מהשאלה השניה. המילה “מושלמת” היא אכן קצת יומרנית כאן, אבל אני סבור שהיא מוצדקת גם כשמתרגמים אותה לטענה מתמטית פורמלית לגמרי. הפורמליזם שמאפשר לנו לומר שההצפנה מושלמת הוצע על ידי קלוד שנון, ממציא תורת האינפורמציה, בשנת 1949 (שנון פיתח את הפורמליזם במהלך מלחמת העולם השניה), למרות שהצופן עצמו היה קיים עוד לפני כן (ויקיפדיה מייחסת את התיאור הראשון שלו לאחד, פרנק מילר, ב-1882; מקור ידוע אחר הוא הצופן של גילברט ורנם שהוצע ב-1917 ואפשר לחשוב עליו פנקס חד-פעמי כנגזר ממנו).

לפני שנגיע לפורמליזם, הנה האינטואיציה. בדרך כלל כשאנחנו רוצים לפענח צופן, מה הדבר הראשון שאנחנו עושים? מסתכלים בכתב הסתר, שהרי אם לא נסתכל על כתב הסתר, על מה כן נסתכל? כתב הסתר הוא מקור אינפורמציה עבורנו בכל הנוגע לתוכן הכתב הגלוי המקורי. עם זאת, אולי יש מקורות אינפורמציה אחרים. למשל, אם אנחנו יודעים שהכתב הגלוי היה מספר כרטיס אשראי, אנחנו יודעים שהוא לא הולך להיות הטקסט של “מלחמה ושלום”, או אפילו לא רצף של 16 אותיות: אנחנו יודעים שזה הולך להיות רצף של 16 מספרים. אם אנחנו בישראל והכרטיס הוא של ויזה , אנחנו גם יודעים ש-4580 כנראה יהיו 4 הספרות הראשונות. כלומר, כבר לפני שראינו את כתב הסתר בכלל יש לנו אינפורמציה מסויימת על הכתב הגלוי, לפחות אינפורמציה הסתברותית (“סביר שהכתב הגלוי יתחיל ב-4580”). השאלה היא, אם כן, האם ראיית כתב הסתר מוסיפה לנו אינפורמציה חדשה מעבר לכך.

שנון הגדיר צופן מושלם ככזה שראיית כתב הסתר בו אינה מוסיפה לנו אינפורמציה. הנה דרך פשוטה לתאר איך דבר כזה קורה מבחינה מתמטית: אם לכל כתב גלוי $latex P$, ולכל כתב סתר $latex C$ קיים מפתח $latex K$ יחיד כך שהצפנת $latex P$ עם $latex K$ מחזירה את $latex C$, וגם ההסתברות של כל $latex K$ לשמש כמפתח היא שווה, אז הצופן יהיה מושלם. אבל למה?

בואו נסתכל על דוגמה, ועוד כזו שהיא הטריוויאלית ביותר שאפשר: הכתב הגלוי $latex P$ יכול להיות או 0, או 1. כדי שיהיה מעניין, נניח שאנחנו יודעים שיש סיכוי של $latex \frac{3}{4}$ שהוא יהיה 1 ורק סיכוי של $latex \frac{1}{4}$ שהוא יהיה 0. כעת, המפתח $latex K$ יכול להיות בעצמו או 0 או 1, עם הסתברות $latex \frac{1}{2}$ לכל אחת מהאפשרויות.

בואו נניח שאנחנו מגרילים כתב גלוי ומפתח. מה ההסתברות שכתב הסתר יהיה 1, או בסימון מתמטי מהי $latex \mbox{Pr}\left[C=1\right]$? ובכן, $latex C=1$ אם קורה אחד משניים: או ש-$latex P$ מוגרל להיות 1 (בהסתברות $latex \frac{3}{4}$) ו-$latex K$ מוגרל להיות 0 (בהסתברות $latex \frac{1}{2}$), או ש-$latex P$ מוגרל להיות 0 (בהסתברות $latex \frac{1}{4}$ ו-$latex K$ מוגרל להיות 1 (בהסתברות $latex \frac{1}{2}$). בסך הכל נקבל $latex \mbox{Pr}\left[C=1\right]=\frac{3}{4}\cdot\frac{1}{2}+\frac{1}{4}\cdot\frac{1}{2}=\frac{1}{2}\left(\frac{3}{4}+\frac{1}{4}\right)=\frac{1}{2}$ . באופן דומה נקבל שגם הסיכוי ל-$latex C=0$ הוא $latex \frac{1}{2}$.

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

נניח כעת שהתגלגל לידינו כתב סתר מוצפן, ונניח שהוא 1. מה ההסתברות, בהינתן המידע הזה, שהכתב הגלוי היה גם כן 1? בלשון מתמטית הסתברותית משתמשים במונח של הסתברות מותנית שתיארתי בעבר בבלוג. ההסתברות הזו היא ההסתברות שהכתב הגלוי יהיה 1 וגם כתב הסתר יהיה 1 (הסתברות זו היא $latex \frac{3}{4}\cdot\frac{1}{2}$ - ההסתברות שהכתב הגלוי יהיה 1 כפול ההסתברות שיצא המפתח 0), חלקי ההסתברות שכתב הסתר יהיה 1. בניסוח מתמטי:

$latex \mbox{Pr}\left[P=1\ |\ C=1\right]=\frac{\mbox{Pr}\left[P=1,C=1\right]}{\mbox{Pr}\left[C=1\right]}=\frac{\frac{3}{4}\cdot\frac{1}{2}}{\frac{1}{2}}=\frac{3}{4}=\mbox{Pr}\left[P=1\right]$

כלומר, קיבלנו שההסתברות ש-$latex P=1$, כשהיא מותנית בכך ש-$latex C=1$, היא אותה הסתברות בדיוק כמו ההסתברות ש-$latex P=1$ בלי שום התניה. בלשון מתמטית זה אומר שהמאורע $latex P=1$ והמאורע $latex C=1$ הם בלתי תלויים - אין בידיעה שאחד מהם התקיים כדי לתת לנו אינפורמציה כלשהי על השני.

כפי שאתם בוודאי מנחשים, התופעה הזו היא כללית, וזה גם הקריטיון של שנון כשהוא מנוסח פורמלי: צופן מושלם הוא צופן שבו מתקיים $latex \mbox{Pr}\left[P=a\ |\ C=b\right]=\mbox{Pr}\left[P=a\right]$ לכל $latex a,b$ שהם ערכים חוקיים שאותם $latex P,C$ יכולים לקבל.

אם לכל כתב גלוי $latex P=a$ וכתב סתר $latex C=b$ קיים מפתח אחד ויחיד $latex k_{a,b}$ שמעביר את $latex a$ ל-$latex b$, ואם הסתברות כל המפתחות שווה לאיזה ערך $latex p_{K}$, אז ראשית כל

$latex \mbox{Pr}\left[P=a,C=b\right]=\mbox{Pr}\left[P=a,K=k_{a,b}\right]=\mbox{Pr}\left[P=a\right]\cdot p_{K}$

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

כעת, אם אשכנע אתכם ש-$latex \mbox{Pr}\left[C=b\right]=p_{K}$ אסיים, כי ינבע מכך ש-$latex \mbox{Pr}\left[P=a\ |\ C=b\right]=\frac{\mbox{Pr}\left[P=a,C=b\right]}{\mbox{Pr}\left[C=b\right]}=\frac{\mbox{Pr}\left[P=a\right]\cdot p_{K}}{p_{K}}=\mbox{Pr}\left[P=a\right]$ כנדרש. אם כן, אני רוצה להוכיח לכם שבלי תלות ב-$latex P$, כתבי הסתר מתפלגים בצורה אחידה בדיוק כמו המפתחות.

ההוכחה הזו היא מה שכבר הזכרתי קודם וראינו איך הוא מתקיים במקרה הפשוט ביותר. בואו נסמן את הקבוצה של כל הכתבים הגלויים האפשריים ב-$latex \mathcal{P}$. אז מתקיים:

$latex \mbox{Pr}\left[C=b\right]=\sum_{a\in\mathcal{P}}\mbox{Pr}\left[P=a,K=k_{a,b}\right]=\sum_{a\in\mathcal{P}}\mbox{Pr}\left[P=a\right]\cdot p_{K}=p_{K}\cdot\left(\sum_{a\in\mathcal{P}}\mbox{Pr}\left[P=a\right]\right)=p_{K}$

וזאת כי $latex \sum_{a\in\mathcal{P}}\mbox{Pr}\left[P=a\right]=\mbox{Pr}\left[P\in\mathcal{P}\right]=1$, כי אנחנו יודעים בודאות ש-$latex P$ מקבל ערך כלשהו מהקבוצה $latex \mathcal{P}$.

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

יפה. אז אם הכל כל כך מושלם, מה הבעיה? למה לא משתמשים רק בפנקס חד-פעמי וחסל? למה בכלל יש קריפטוגרפיה? שלל סיבות, שאציג את הבסיסיות שבהן. בראש ובראשונה, פנקס חד-פעמי היא שיטה בזבזית מאוד של משאב לא זול במיוחד: המפתח. כבר ראינו שמדובר על שיטה שדורשת מפתח שאורכו הוא כאורך ההודעה המוצפנת. זה לא מקרי; אם המפתח קטן ולו בביט אחד מההודעה המוצפנת, התכונה של “לכל $latex P,C$ קיים מפתח שמעביר מ-$latex P$ אל $latex C$” כבר לא יכולה להתקיים, פשוט כי אין מספיק מפתחות. בלי התכונה הזו, לא קשה יותר מדי להראות, הצפנה מושלמת היא בלתי אפשרית. לכן נדרש מפתח ארוך יחסית לצורך ההצפנה.

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

וגם זה כנראה לא היה נורא ואיום לחלוטין אלמלא הדרישה מהמפתח הזה הייתה שהוא יהיה אקראי לגמרי. מפתח שאינו אקראי לגמרי, והתוקף יודע בערך למה לצפות מההתפלגות שלו, פותח פתח למתקפות על הצופן. זה לא אומר שחייבים מפתח אקראי לגמרי, אלא רק שאם לא משתמשים במפתח שהמקור שלו הוא אקראי לגמרי אז נשאלת השאלה איך מייצרים את המפתח הזה, ומדוע השיטה הזו בטוחה יחסית; בעצם, אפשר לחשוב על שיטת ייצור המפתח הזה בתור משהו שמגדיר צופן מסוג חדש, קצת יותר חלש מפנקס חד-פעמי ולכן גם לא מושלם. לצפנים כאלו קוראים צפני שטף (כי מה שהם עושים הוא לייצר “שטף” של מפתח אקראי שבעזרתו ניתן לבצע הצפנה דמויות פנקס חד-פעמי) וחלקם טובים מאוד - אבל הם לא מושלמים. אחד מה”גביעים הקדושים” של עולם הקריפטוגרפיה היא יצירה של מחולל מספרים פסאודו-אקראיים שיהיה בטוח קריפטוגרפית מבחינה תיאורטית (כיום יש הרבה מחוללים אבל אין הוכחה מתמטית לבטיחות שלהם), כי הוא יוביל ליצירת צופן שטף שאמנם לא יהיה מושלם, אבל גם מבחינה תיאורטית הוא לא יהיה ניתן לפיצוח (בקריפטוגרפיה מבדילים בין “בטוח מבחינת תורת האינפורמציה” - שזה מה שדיברנו עליו בפוסט עד כה - ובין “בטוח מבחינה חישובית” שזה המובן של “לא ניתן לפיצוח” כאן). כדאי להעיר שהוכחת קיום של מחולל כזה תגרור, בין היתר, ש-$latex \mbox{P}\ne\mbox{NP}$. כלומר, הבעיה הזו קשה לפחות כמו הבעיה הפתוחה המרכזית במדעי המחשב.

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

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

דוגמה אחרת לבעייתיות שבשימוש בפנקס חד-פעמי באופן יומיומי היא מה שקורה כאשר אותם רוצים להצפין קובץ כלשהי במחשב שלכם - נאמר, קובץ ZIP או קובץ וורד שכתבתם. הרי אין לכם מפתח, אז מה עושים? משתמשים בססמא; אתם כותבים טקסט כלשהו שקל לכם לזכור, והמחשב ממיר אותו בדרך מסויימת למפתח שבו הוא משתמש לצורך ההצפנה והפענוח. אם הייתם רוצים להצפין עם פנקס חד פעמי, היה עליכם להשתמש בססמא שאורכה כאורך הדבר שאתם רוצים להצפין - אם כתבתם קובץ וורד של 1,000 אותיות, תצטרכו ססמא של 1,000 אותיות! ואם חשבתם על תעלול כמו לפתוח את המלט ולהעתיק את מה שקורה במערכה השניה, תשכחו מזה - המפתח לא יהיה אקראי לחלוטין ולכן ההצפנה לא תהיה מושלמת. אז איך בדיוק תוכלו לזכור 1,000 אותיות אקראיות? לא תוכלו, אתם תכתבו אותן אי שם - וססמא כתובה היא ססמא פגיעה, בעוד שססמא שזוכרים בראש היא פגיעה פחות. ההצפנה עצמה אמנם מושלמת, אבל זה לא אומר שאין סכנות “צדדיות” שיגרמו לפריצה שלה.

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

בנוסף, בעולם האמיתי, כשאנחנו יוצרים קשר עם מישהו באמצעות המפתח הפומבי שלו, בדרך כלל משתמשים במפתח הפומבי לא לצורך כל התקשורת איתו, אלא רק כדי להתחיל אותה; כחלק מתהליך ההתחלה הזה אנחנו מסכימים איתו על מפתח סימטרי ואז משתמשים בשיטת הצפנה סימטרית טובה כדי לקיים את כל התקשורת. באופן הזה ההצפנה מהירה יותר ובטוחה יותר. עם זאת, לצורך כך צריך להשתמש בשיטת הצפנה סימטרית שדורשת מפתח קטן - למשל, מפתח של 256 ביט הוא סטנדרט גבוה היום בשיטת ההצפנה החזקה AES. 256 ביט! זה הכל! זה שווה ערך ל-32 בייטים, כלומר 32 תווים של טקסט ASCII. ועם זה אפשר לאתחל חיבור בטוח שבו יישלחו קבצים של מאות ג’יגות. עם פנקס חד-פעמי זה פשוט היה בלתי אפשרי - גם אם היה אפשר לשלוח אותו כך, מוצפן על ידי הצפנת המפתח הציבורי, עדיין היינו צריכים לשלוח כמויות אדירות של מידע וכבר היה עדיף לנו לשלוח את המידע שאנחנו רוצים להעביר וחסל; הרי ההצפנה כולה לא תהיה חזקה יותר מאשר ההצפנה הפומבית שבה השתמשנו כדי לשתף את המפתח.

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

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


נהניתם? התעניינתם? אם תרצו, אתם מוזמנים לתת טיפ:

Buy Me a Coffee at ko-fi.com