פנקס חד-פעמי

קטע מפנקס חד-פעמי, במשמעותו הפשוטה: פנקס שבו מודפס רצף אקראי של אותיות
פנקס חד-פעמי (באנגלית: One time pad) הוא שיטת הצפנה שהומצאה בשנת 1917 ומבוססת על צופן ורנם. ייחודה בכך שקיימת הוכחה מתמטית לכך שאם המפתח המשמש להצפנה נבחר באקראי והשימוש בו הוא חד-פעמי, ההצפנה בלתי ניתנת לשבירה אפילו ליריב בעל עוצמת חישוב בלתי מוגבלת. שיטה זו היא הדוגמה הבולטת והפשוטה ביותר של שיטת הצפנה מושלמת (Perfect secrecy). למרות זאת מספר בעיות שיובהרו בהמשך מונעות שימוש נרחב בה.

==אופן ההצפנה==
לצורך הפשטות מניחים שהמסר להצפנה מיוצג כמחרוזת בינארית (שהוא הייצוג הטבעי במחשב). המפתח המשמש להצפנה מיוצג גם הוא כמחרוזת בינארית שאורכה כאורך הקלט. ההצפנה מבוצעת על ידי פעולת XOR (חיבור מודולו 2 המיוצג באמצעות הסמל <math>\oplus</math>) של המסר עם המפתח סיבית אחר סיבית. הפענוח מבוצע באותה דרך, אך עם הצופן והמפתח. בהצגה מתמטית:

הצפנה: <math>\ c=m\oplus k</math>

פענוח: <math>\ m=c\oplus k</math>

לדוגמה אם נתון המסר <math>m</math> והמפתח <math>k</math> שניהם באורך 32 סיביות תוצאת ההצפנה של <math>m</math> עם <math>k</math> היא <math>c</math> כך:
{| class="wikitable"
|-
! שם המשתנה !! בסיס בינארי !! בסיס הקסדצימלי
|-
| <math>m</math>||<math>\ 1011\ 0011\ 0000\ 1111\ 0001\ 1001\ 0100\ 1010\ </math>||<math>\ \text{B30F 194A}\ </math>
|-
| <math>k</math>||<math>\ 0010\ 0010\ 0111\ 0001\ 1111\ 0000\ 0011\ 1101\ </math>||<math>\ \text{2271 F03D}\ </math>
|-
| <math>c</math>||<math>\ 1001\ 0001\ 0111\ 1110\ 1110\ 1001\ 0111\ 0111\ </math>||<math>\ \text{917E E977}\ </math>
|}

יש לשים לב שאם <math>c=m\oplus k</math> מזה נובע בהכרח ש-<math>k=c\oplus m</math>.

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

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

לדוגמה, אם נתונים המסרים <math>\ m_1, m_2</math> ומפתח <math>\ k</math> והתוצאות לאחר הצפנה הם <math>\ c_1=m_1\oplus k</math> וכן <math>\ c_2=m_2\oplus k</math> בהתאמה. אזי מתקיים <math>c_1\oplus c_2=m_1\oplus m_2</math> היות ש-
{|
|-
| 
<div class="mw-content-ltr">
<math>c_1\oplus c_2 = (m_1\oplus k) \oplus (m_2\oplus k)</math>
:::<math>= m_1\oplus m_2\oplus k\oplus k</math> 
:::<math>= m_1\oplus m_2\oplus 0</math> 
:::<math>=m_1\oplus m_2</math>
</div>
 || 
:
: בגלל האסוציאטיביות.
: כי XOR של מספר בעצמו שווה אפס.
|}

כמו כן <math>c_1\oplus c_2\oplus m_2=m_1</math> ולהפך <math>\ c_1\oplus c_2\oplus m_1=m_2</math>.

הסיבה לשימוש ב-XOR במקום פעולה בינארית אחרת כמו OR או AND, נובעת מהעובדה ש-XOR משמר אקראיות. אפשר להוכיח זאת בכמה דרכים, אבל מספיק להתבונן בטבלת האמת של XOR ולראות שהיא מכילה בדיוק 50% אפס ו-50% אחד, לעומת הפעולות OR ו-AND בהן היחס הוא 1 ל-3. כלומר התפלגות התוצאות של פעולת חיבור סיביות מודולו 2 אחידה.

קל להבין זאת במקרה של סיבית בודדת. אם נתון משתנה מקרי <math>Y</math> מעל <math>\{0,1\}</math> בהתפלגות שאינה בהכרח אחידה, כלומר הסיכויים שיתקבל "0" הם <math>p_0</math> והסיכויים שיתקבל "1" הם <math>p_1</math>, כאשר <math>p_0+p_1=1</math>, ונניח שנתון משתנה מקרי בלתי תלוי <math>X</math> בהתפלגות אחידה (סיכויים של <math>1/2</math> לאפס או אחד כמו בהטלת מטבע). אפשר לראות שההסתברות ש-<math>Z=X\oplus Y</math> שווה "0" שווה להסתברות ש-<math>(x,y)=(0,0)</math> ועוד ההסתברות ש-<math>(x,y)=(1,1)</math> (כי לפי טבלת האמת של XOR רק בשני מקרים אלו התוצאה תהיה אפס). במקרה הראשון למשל ההסתברות היא <math>p_0</math> כפול <math>1/2</math>. בחשבון פשוט יוצא אם כך ש-<math>\textstyle\frac{p_0}{2}+\frac{p_1}{2}=1/2</math>. כלומר לא משנה מה הייתה ההתפלגות של <math>Y</math>, התוצאה <math>Z</math> תתפלג תמיד באופן אחיד.

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

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

דוגמה נוספת גרועה אף יותר היא פרוטוקול WEP שבגרסאות הראשונות שלו הכנת המפתח לצורך הצפנה הייתה באמצעות וקטור אתחול שיחד עם המפתח הסודי מוזן ל-RC4 המייצר את זרם המפתח לצורך הצפנת הפריים ב-XOR. כל פריים הוצפן עם מפתח אחר שהוא פונקציה של המפתח הסודי הקבוע יחד עם וקטור אתחול שונה. היו שתי בעיות חמורות. ראשית, וקטור האתחול היה בעצם מספר סידורי של הפריים והוא שודר בגלוי, היות שווקטור האתחול היה באורך 24 סיביות המשמעות היא שהוא מתאפס אחרי <math>2^{24}</math> או 16 מיליון פריימים שזה לא הרבה במונחים של ימינו. שנית, בכרטיסים מסוימים לאחר כיבוי והפעלה וקטור האתחול היה מתאפס. בשני מקרים אילו מה שקרה זה שמסרים שונים הוצפנו עם אותו מפתח, כשהמשמעות היא שבירה מוחלטת של הפרוטוקול. פרוטוקול זה הכיל כשלים רבים נוספים מה שהוביל לבסוף להחלפתו בפרוטוקול WPA.

==חשילות==
פנקס חד פעמי אינו מבטיח אותנטיות. החיסרון בהצפנה עם פעולת XOR של זרם המפתח עם המסר היא שניתן לבצע מניפולציה של סיביות מסוימות במסר המקורי מבלי לפענח את הטקסט המוצפן. השינוי יכול להיות נקודתי ולא ישפיע על חלקים אחרים של הצופן. תכונה זו נקראת "חשילות". למשל אם המסר המוצפן מכיל הצפנה של השם "דוד" (בקידוד אסקי נניח <math>\text{E3E5E3}</math>) אם המתקיף במקרה יודע שהשם המוצפן הוא דוד ביכולתו לשנותו ל"משה" (<math>\text{EEF9E4}</math>) מבלי שהמקבל יבחין בכך. כל שעליו לעשות הוא לחבר XOR של השמות משה ודוד <math>\text{EEF9E4}\oplus\text{E3E5E3}=\text{D1C07}</math> ואז לחבר את התוצאה ב-XOR עם הטקסט המוצפן במיקום הנכון. המקבל לאחר פענוח עלול לחשוב שהשם הנכון הוא משה בעוד שהמצפין שלח את השם דוד. מסיבה זו אין להשתמש בפנקס חד פעמי ללא אמצעי נוסף להבטחת שלמות ואימות.

==סודיות מושלמת==

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

לצורך ההגדרה משתמשים במרחב הסתברות שבו הטקסט הגלוי נבחר באקראי (מתוך התפלגות כלשהי, לאו דווקא אחידה) ומוצפן על ידי מפתח שהוגרל באקראי (באופן אחיד). אם <math>\ M,\ C,\ K</math> הם משתנים מקריים של מרחב הסתברות המייצגים את המסר, המפתח והצופן בהתאמה, אז סודיות מושלמת מתקיימת אם מתקיים <math>\ P(M|C)=P(M)</math>, כלומר ההסתברות לכך שהוגרל מסר מסוים אם ידוע כתב הסתר המתאים לו, שווה להסתברות שאותו מסר הוגרל מבלי שידוע שום מידע נוסף עליו. במילים אחרות, המשתנה המקרי שמייצג את ההודעות שנבחרות באקראי, והמשתנה המקרי שמייצג את כתבי הסתר שנוצרים באקראי הם בלתי תלויים. בניסוחו השקול של שנון, אם <math>\ H()</math> מייצגת את פונקציית האנטרופיה אזי התנאי לסודיות מושלמת הוא <math>\ H(M|C)=H(M)</math> - כלומר, שהאינפורמציה שבמשתנה המקרי <math>\ M</math> שווה לאינפורמציה שבמשתנה המקרי המותנה <math>\ M|C</math>. (תנאי זה ניתן להצגה באופן שקול כ-<math>\ I(M;C)=0</math>, כלומר האינפורמציה המשותפת של שני המשתנים היא 0).

לדוגמה, אם ידוע כי תשובה לשאלה כלשהי, שיכולה להיות "כן" או "לא", הוצפנה, וידוע שההסתברות של כל "כן" היא 1/3 ושל "לא" היא 2/3 (ולכן ההסתברות של מילים אחרות, למשל "ים" היא 0), הרי ששיטת ההצפנה תיחשב מושלמת אם בהינתן ידיעת ההודעה המוצפנת (למשל, "םר") ההסתברות ש"כן" היא המילה שהוצפנה היא עדיין 1/3 וההסתברות ש"לא" הוצפנה היא עדיין 2/3.

בשיטת הפנקס החד פעמי, הכתבים הגלויים, כתבי הסתר והמפתחות הם כולם מחרוזות ביטים מאותו האורך, למשל <math>\ n</math>. אם <math>\ m</math> הוא כתב גלוי אפשרי כלשהו ו-<math>\ c</math> הוא כתב סתר אפשרי כלשהו, אז קיים בדיוק מפתח יחיד שמעביר את <math>\ m</math> אל <math>\ c</math>: המפתח <math>\ k=m\oplus c</math>. מכאן נובע בפרט שההסתברות לקבלת <math>\ c</math> ככתב סתר היא אחידה לכל כתבי הסתר האפשריים ושווה ל-<math>\ 2^{-n}</math>; שהרי לכל כתב גלוי שנבחר <math>\ m</math>, ההסתברות ש-<math>\ c</math> תתקבל ממנו היא בדיוק ההסתברות שייבחר המפתח היחיד שמעביר את <math>\ m</math> אל <math>\ c</math>, והסתברות זו היא <math>\ 2^{-n}</math>.

כעת נובעת הסודיות המושלמת של הצופן באופן כמעט מיידי: <math>\ P(M=m|C=c)=\frac{P(M=m\wedge C=c)}{P(C=c)}=\frac{2^{-n}P(M=m)}{2^{-n}}=P(M=m)</math> (ה-<math>\ 2^{-n}</math> במונה מגיע מההסתברות לקבל את <math>\ c</math> מתוך <math>\ m</math>; זה שבמכנה מגיע מההסתברות לקבל את <math>\ c</math> בכלל, מכל כתב גלוי אפשרי).

=== תכונות ===
שנון הוכיח כי תנאי הכרחי לכך שהצפנה תיקרא מושלמת (Perfect secrecy) הוא ש-<math>\ H(K) \ge H(M)</math> כלומר רמת אי הוודאות של המפתח תהיה לכל הפחות כרמת אי הוודאות של המסר. לפיכך אם המסרים מתפלגים באופן אחיד, אורך המפתח חייב להיות לכל הפחות כאורך המסר. באופן כללי, גודל מרחב המפתחות האפשריים חייב להיות לפחות כגודל מרחב ההודעות האפשריות.

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

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

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

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

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

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

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

==ראו גם==
* מסמכי וינונה
* צופן זרם

== קישורים חיצוניים==
*[http://www.schneier.com/blog/archives/2005/12/totally_secure.html הבלוג של ברוס שנייר: "Totally Secure Classical Communications?"]

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

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