קריפטוגרפיה עם מפתח א-סימטרי
בשיעור זה נסקור את קריפטוגרפיה עם מפתח א-סימטרי, שמהווה את הבסיס לאינטראקציות רשת מאובטחות רבות כיום.
עד סוף השיעור נכסה:
- מהי קריפטוגרפיה עם מפתח א-סימטרי
- שימושים בקריפטוגרפיה עם מפתח א-סימטרי, כולל חילופי מפתחות וחתימות דיגיטליות
- אבטחת קריפטוגרפיה עם מפתח א-סימטרי באופן כללי
- פרטים נוספים על אלגוריתמים ואבטחת RSA, DSA ועקומות אליפטיות
- דוגמאות קוד Python שמראות כיצד האלגוריתמים עובדים בפועל
- איומים על אלגוריתמים אלה מקומפיוטרים קלאסיים וקוונטיים כאחד
מבוא לקריפטוגרפיה עם מפתח א-סימטרי
כפי שלמדנו בשיעור הקודם, קריפטוגרפיה עם מפתח סימטרי מהירה ויעילה מאוד להגנת מידע, אך יש לה כמה מגבלות:
- ככל שמספר הצדדים שרוצים להחליף מידע מאובטח גדל, מספר המפתחות הנדרשים גדל בצורה קומבינטורית. אין מנגנון לחלוקה מאובטחת של מפתחות אלה בין שולחים ומקבלים.
- אין הוראה לאי-כפירה. כל צד יכול לפענח או להצפין הודעות ללא דרך להבטיח שהודעה התקבלה או מאיפה היא הגיעה
הפתרון לשתי בעיות אלה מסופק על-ידי קריפ טוגרפיה עם מפתח א-סימטרי (AKC), הידועה גם בשם קריפטוגרפיה עם מפתח ציבורי (PKC), שמהווה אבן יסוד של האבטחה הדיגיטלית המודרנית.
קריפטוגרפיה עם מפתח א-סימטרי (AKC) כוללת שימוש בזוג מפתחות — אחד ציבורי ואחד פרטי. המפתחות הציבורי והפרטי מקושרים קריפטוגרפית ונוצרים בדרך כלל בו-זמנית כ-זוג מפתחות באמצעות אלגוריתם מתמטי מיוחד. המפתח הציבורי, כפי שמשמו ניכר, מיועד לחלוקה חופשית, בעוד שהמפתח הפרטי נשמר בסוד על-ידי הצד שיצר את זוג המפתחות. אבטחת תקשורת שמשתמשת בזוגות מפתחות א-סימטריים מובטחת כל עוד המפתח הפרטי נשאר סודי.
איור 1. הצפנה עם מפתח א-סימטרי
AKC מציעה מספר פונקציות שימושיות, כגון:
- הצפנה ופענוח לאפשור סודיות בתקשורת.
- חתימות דיגיטליות להבטחת אותנטיות, שלמות, ואי-כפירה.
- חילופי מפתחות מאובטחים להקלת השימוש הבא בקריפטוסיסטמות סימטריות.
ביישומים מודרניים, AKC משמשת בעיקר לחתימות דיגיטליות ולחילופי מפתחות מאוב טחים. בשיעור זה נציג שתי פונקציות מפתח אלה, ולאחר מכן נדון במספר וריאציות של פרוטוקולים קריפטוגרפיים לפונקציות אלה.
חילופי מפתחות עם קריפטוגרפיה א-סימטרית
אחת הבעיות הבסיסיות בקריפטוגרפיה היא חילופי מפתחות מאובטחים. לדוגמה, אם שני צדדים רוצים להשתמש בהצפנה סימטרית, שני הצדדים צריכים את אותו מפתח כדי להצפין ולפענח הודעות. אבל כיצד הם מחליפים את המפתח באופן מאובטח? קריפטוגרפיה א-סימטרית פותרת זאת דרך מנגנוני חילופי מפתחות אינטראקטיביים ולא-אינטראקטיביים.
חילופי מפתחות אינטראקטיביים
פרוטוקול חילופי מפתחות אינטראקטיבי מתייחס לשיטה שבה שני צדדים משתפים פעולה ליצירת מפתח סוד משותף דרך ערוץ תקשורת לא מאובטח. מפתח הסוד המשותף הזה יכול לשמש לאחר מכן למשימות הצפנה ופענוח סימטריות.
הפרוטוקול הידוע ביותר בקרב פרוטוקולים אלה הוא אלגוריתם Diffie-Hellman (DH), שתוכנן במיוחד לאפשר חילופי מפתחות. בפרוטוקול זה, כל צד מייצר זוג מפתחות (ציבורי ופרטי) ומשדר את המפתח הציבורי שלו. לאחר מכן כל צד משתמש במפתח הפרטי שלו ובמפתח הציבורי של הצד השני ליצירת מפתח סוד משותף. DH מנצל את עקרונות האריתמטיקה המודולרית כדי להבטיח שכל שני הצדדים מגיעים לאותו סוד משותף למרות שלכל צד יש גישה רק למפתח הציבורי של הצד השני.
קריפטוסיסטמות מודרניות המבוססות על קריפטוגרפיה עם עקומות אליפטיות (ECC) מרחיבות מושג זה עם חילופי מפתחות Diffie-Hellman עם עקומה אליפטית) (ECDH). ECDH פועל בצורה דומה ל-DH אך מנצל את תכונות העקומות האליפטיות, מה שמביא למערכת מאובטחת ויעילה יותר.
איור 2. פרוטוקול חילופי מפתחות
חילופי מפתחות לא-אינטראקטיביים
בניגוד לפרוטוקולי חילופי מפתחות כמו DH ו-ECDH, שהם אינטראקטיביים ודורשים תקשורת הלוך ושוב לקביעת המפתח הסימטרי, AKC מספקת גם דרכים לא-אינטראקטיביות לביסוס מפתח סוד משותף. בסכמות כאלה, צד אחד מייצר זוג מפתחות (ציבורי ופרטי) ומשתף את המפתח הציבורי עם הצד השני. הצד השני מייצר מפתח סימטרי אקראי, מצפין אותו עם המפתח הציבורי שקיבל, ושולח אותו חזרה לצד הראשון. הצד הראשון משתמש במפתח הפרטי שלו לפענוח ההודעה שהתקבלה, ובכך מקבל את המפתח הסימטרי המשותף. הסכמה הזו היא לא-אינטראקטיבית בכך שהמפתח הסימטרי נקבע על-ידי צד אחד ופשוט מועבר באופן מאובטח לצד השני בצורה מוצפנת.
שיקול חשוב בחילופי מפתחות לא-אינטראקטיביים קשור להפרש באורך בסיביות בין המפתח הסימטרי שהצדדים רוצים להחליף לבין גדלי ההודעות המומלצים ב-AKC. בדרך כלל, מפתחות סימטריים מודרניים הם בטווח של 128-256 סיביות, בעוד שקריפטוסיסטמות א-סימטריות כמו RSA עובדות עם גדלי הודעות של כ-1024-4096 סיביות. לכן, כאשר משתמשים ב-AKC להעברת מפתח סימטרי, יש לקודד אותו להודעה ארוכ ה יותר של 1024-4096 סיביות. ניתן להשיג זאת בשתי גישות:
-
חילופי מפתחות מבוססי-ריפוד: בגישה זו, המפתח הסימטרי הקצר יותר (128-256 סיביות) נוצר תחילה, ולאחר מכן משתמשים בסכמת ריפוד הפיכה מוסכמת כמו OAEP להטמעתו בהודעה ארוכה יותר (1024-4096 סיביות). הודעה ארוכה זו מוצפנת באמצעות AKC ומשודרת כטקסט מוצפן. המקבל מפענח תחילה את הטקסט המוצפן ואז מסיר את הריפוד כדי לחלץ את המפתח הסימטרי הקצר יותר.
-
מנגנוני אנקפסולציה של מפתחות (KEMs): עם חילופי מפתחות מבוססי-KEM, נוצרת תחילה הודעת טקסט פשוט אקראית וארוכה (1024-4096 סיביות), ממנה ניתן לחלץ מפתח סימטרי קצר יותר (128-256 סיביות) באמצעות פונקציית גזירת מפתח (KDF) מוסכמת. הטקסט הפשוט הארוך יותר מוצפן באמצעות AKC ומשודר למקבל כטקסט מוצפן. המקבל מפענח את הטקסט המוצפן באמצעות המפתח הפרטי שלו ואז משתמש ב-KDF לחילוץ המפתח הסימטרי הקצר יותר (128-256 סיביות). קריפטוסיסטמות פופולריות כמו RSA, עם היכולת שלהן להצפין נתונים ישירות, יכולות לשמש ליישום KEMs.
איור 3. מנגנון אנקפסולציה של מפתחות
חתימות דיגיטליות עם קריפטוגרפיה א-סימטרית
חתימות דיגיטליות הן יישום נוסף ועוצמתי של קריפטוגרפיה א-סימטרית. הן מספקות אימות, שלמות ואי-כפירה המאופשרות על-ידי העובדה שבתוך AKC, לישויות יש מפתחות פרטיים ייחודיים. הרעיון הבסיסי שעומד מאחורי פרוטו קולי חתימה הוא ששולחי הודעות מאובטחות יחתמו דיגיטלית על ההודעות באמצעות המפתח הפרטי הייחודי שלהם. המקבל יאמת את החתימה הדיגיטלית באמצעות המפתח הציבורי של השולח. בתוך AKC, חתימות דיגיטליות ניתן ליישם באמצעות אלגוריתמים שתוכננו במיוחד למטרה זו או באמצעות קריפטוסיסטמות כלליות.
איור 4. חתימות דיגיטליות עם קריפטוגרפיה א-סימטרית
אלגוריתמים ייעודיים לחתימה דיגיטלית
כיום, תקן עיבוד המידע הפדרלי האמריקאי (FIPS) לחתימות דיגיטליות הוא סכמה ייעודית הנקראת פשוט אלגוריתם החתימה הדיגיטלית (DSA). בדומה מסוים לפרוטוקול Diffie-Hellman, ה-DSA משתמש בתכונות האלגבריות של חזקה מודולרית והיפוכים כפליים ליצירה ואימות חתימות.
אלגוריתם החתימה הדיגיטלית עם עקומה אליפטית (ECDSA) הוא גרסת ECC של DSA, שמספקת את אותה פונקציונליות אך עם מפתחות קצרים משמעותית. הדבר מביא ליעילות משופרת, מה שהופך אותו לבחירה פופולרית למערכות עם מגבלות משאבים.
גם DSA וגם ECDSA יומחשו בפירוט רב יותר בהמשך.
סכמות חתימה דיגיטלית באמצעות קריפטוסיסטמות כלליות
בנוסף לאלגוריתמים ייעודיים, חתימות דיגיטליות ניתן לייצר גם באמצעות קריפטוסיסטמות א-סימטריות כלליות, כגון RSA.
RSA, שיידון בפירוט בסעיף מאוחר יותר, מנצל גם הוא היפוכים כפליים מודולריים וחזקה מודולרית כפעולות בסיסיות אך משלב אותן ברצף שונה מ-DSA. ב-RSA, החותם בדרך כלל יוצר hash של ההודעה ואז מצפין את ה-hash עם המפתח הפרטי שלו, מה שיוצר את החתימה הדיגיטלית. כל צד יכול לאמת את החתימה הזו על-ידי פענוחה עם המפתח הציבורי של החותם והשוואתה עם ה-hash של ההודעה.
יישומים של קריפטוגרפיה א-סימטרית
קריפטוגרפיה א-סימטרית היא נפוצה בכל מקום ביישומי הטכנולוגיה הדיגיטלית המודרנית. הפונקציונליות הבסיסית של AKC המתוארת לעיל מהווה אבני בניין לפרוטוקולי יישומים ברמה גבוהה יותר, כולל:
-
תקשורת אינטרנטית: תקשורת מאובטחת דרך האינטרנט, כמו HTTPS, מסתמכת רבות על קריפטוגרפיה א-סימטרית. Transport Layer Security (TLS) וקודמו, Secure Sockets Layer (SSL), משתמשים בקריפטוגרפיה א-סימטרית במהלך תהליך לחיצת היד הראשונית לביסוס מפתח סימטרי, שמשמש לאחר מכן לשאר הפגישה התקשורתית.
-
אימות: קריפטוגרפיה א-סימטרית משמשת ליצירת חתימות דיגיטליות, המאפשרות לישות לאמת מסמך דיגיטלי או הודעה כבאים משולח מסוים. הדבר משמש בתרחישים רבים, החל מאימות עדכוני תוכנה ועד חוזים דיגיטליים מחייבים מבחינה משפטית.
-
הצפנת דואר אלקטרוני: פרוטוקולי הצפנת דואר אלקטרוני כמו PGP (Pretty Good Privacy) והחלופה הקוד-פתוח שלו GPG (GNU Privacy Guard) משתמשים בקריפטוגרפיה א-סימטרית להבטחה שרק הנמען המיועד יוכל לקרוא את תוכן המייל.
-
מעטפת מאובטחת (SSH): SSH הוא פרוטוקול להתחברות מרחוק מאובטחת ושירותי רשת מאובטחים אחרים ברשת לא מאובטחת. הוא משתמש בקריפטוגרפיה א-סימטרית לאימות השרת מול הלקוח, ובאופן אופציונלי, של הלקוח מול השרת.
-
VPN (רשת פרטית וירטואלית): הצפנה א-סימטרית משמשת לביסוס חיבורים מאובטחים ב-VPNs, להבטחת ת קשורת מאובטחת ברשתות ציבוריות.
-
בלוקצ'יין ומטבעות קריפטוגרפיים: טכנולוגיות בלוקצ'יין, כולל Bitcoin ו-Ethereum, משתמשות בקריפטוגרפיה א-סימטרית. לדוגמה, בעלות על Bitcoin מוקמת דרך חתימות דיגיטליות המשתמשות בקריפטוגרפיה א-סימטרית.
-
רשויות אישורים: קריפטוגרפיה א-סימטרית משמשת רשויות אישורים (CAs) להנפקה ולחתימה על אישורים דיגיטליים, המשמשים בתקשורת TLS, חתימת קוד, הצפנת דואר אלקטרוני ועוד. אישור דיגיטלי קושר מפתח ציבורי לישות מסוימת (לדוגמה, אדם או שרת).
איור 5. הנפקה וחתימה על אישורים דיגיטליים באמצעות קריפטוגרפיה א-סימטרית
אבטחת קריפטוגרפיה א-סימטרית
מספר מושגים קריפטוגרפיים משתלבים כדי לאפשר קריפטוגרפיה א-סימטרית מאובטחת, כולל:
סודיות המפתח הפרטי: דרישת האבטחה הבסיסית ביותר של AKC היא שהמפתח הפרטי נשאר סודי. עם זאת, מאחר שהמפתח הפרטי חייב להיות מקושר מתמטית למפתח הציבורי, סודיות המפתח הפרטי דורשת גם שיהיה בלתי-אפשרי מבחינה חישובית לגזור את המפתח הפרטי מידיעת המפתח הציבורי. סכמות ייצור מפתחות בתוך AKC מסתמכות על בעיות מתמטיות קשות חישובית כדי לאפשר דרישה זו.
פונקציונליות פח המלכודת ב-AKC, פעולות ההצפנה והפענוח כוללות מפתחות משלימים שונים מזוג מפתח יחיד. טקסט מוצפן שנוצר על-ידי הצפנה באמצעות אחד המפתחות (לדוגמה המפתח הציבורי) חייב להיות בלתי-מובן לצדדים שלישיים בעוד שהוא בר-פענוח בקלות על-ידי מחזיק המפתח המשלים (במקרה זה המפתח הפרטי). במילים אחרות, ההצפנה צריכה לדמות פונקציה חד-כיוונית עם פח מלכודת כך שצדדים שלישיים לא יוכלו להפוך את הפעולה ולשחזר את הטקסט הפשוט, אך המפתח הפרטי מספק פח מלכודת סודי המאפשר היפוך קל. אלגוריתמי AKC פופולריים משתמשים בחזקה מודולרית כדי ליצור התנהגות של פונקציה חד-כיוונית עם פח מלכודת.
אקראיות: גם תהליך ייצור המפתחות צריך לנצל אקראיות כדי להבטיח שהמפתחות אינם ניתנים לחיזוי, שכן כל תבנית או ניתנות לחיזוי בייצור מפתחות עלולה להיות מנוצלת על-ידי תוקף. אקראיות משמשת גם לריפוד במהלך ההצפנה כדי לייצר טקסטים מוצפנים מאובטחים סמנטית ובתוך סכמות חתימה דיגיטלית לייצור חתימות ייחודיות אפילו כאשר אותה הודעה נחתמת מספר פעמים. מסיבה זו, שימוש בגנרטורים חזקים של מספרים אקראיים הוא חלק חשוב של AKC.
גודל מפתח גדול: כמו במקרה של SKC, גדלי מפתח גדולים מבטיחים הגנה מפני מתקפות כוח גס. עם זאת, מכיוון שגדלי מפתח גדולים מגדילים גם את העלות החישובית של תהליך ההצפנה והפענוח, פתרון אופטימלי צריך לאזן בין שיקולי אבטחה ויעילות. הטבלה הבאה מציגה גדלי מפתח טיפוסיים לפרוטוקולי קריפטוגרפיה א-סימטרית שונים ויישומיהם:
| פרוטוקול | גדלי מפתח טיפוסיים (בסיביות) | יישום |
|---|---|---|
| RSA | 1024 (מיושן), 2048, 3072, 4096 | הצפנה, חתימות דיגיטליות |
| DSA | 1024 (מיושן), 2048, 3072 | חתימות דיגיטליות |
| DH | 2048, 3072, 4096 | חילופי מפתחות |
| ECDH | 224, 256, 384, 521 | חילופי מפתחות |
| ECDSA | 224, 256, 384, 521 | חתימות דיגיטליות |
תשתית מפתחות ציבוריים: ב-AKC, המפתחות הפרטיים חייבים להישמר בסוד על-ידי הבעלים בעוד שהמפתחות הציבוריים משותפים. יש צורך במנגנון מאובטח לניהול והפצה של מפתחות ציבוריים אלה בין משתמשים. תשתית מפתחות ציבוריים (PKI) מספקת דרך לעשות זאת באמצעות אישורים דיגיטליים. אישור דיגיטלי מספק הוכחה לזהות הבעלים של המפתח הציבורי ומונפק על-ידי רשות מהימנה כמו רשות אישורים (שהיא חלק מ-PKI). לכן, PKI ממלאת תפקיד בלתי-נפרד באבטחת יישומים מודרניים המשתמשים ב-AKC על-ידי אפשור ניהול מפתחות בקנה מידה רחב (יצירה, ניהול, הפצה וביטול אישורים דיגיטליים).
סיכוני אבטחה לקריפטוגרפיה א-סימטרית
כפי שמפורט בטבלה לעיל, אלגוריתמי מפתח א-סימטרי מודרניים כמו RSA משתמשים בדרך כלל בגדלי מפתח גדולים בהרבה ממקביליהם הסימטריים הנפוצים כמו AES-128. אפילו הפרוטוקולים מבוססי-ECC (ECDH ו-ECDSA) שיש להם מפתחות קטנים יותר משתמשים לפחות ב-224 סיביות למפתחות. זה בתורו מרמז שמתקפת כוח גס הכוללת חיפוש ממצה של מרחב המפתחות הפרטיים לזיהוי המפתח הנכון אינה ישימה חישובית בעתיד הנראה לעין. זה נכון אפילו אם יופעלו קומפיוטרים קוונטיים למשימה זו. לכן, מתקפות נגד AKC מתמקדות בדרך כלל בניצול חולשות פוטנציאליות אחרות של קריפטוסיסטמות ספציפיות. כמה מצבי מתקפה מתועדים היטב מכוונים ל:
-
חולשה אלגורית מית על-ידי שימוש באמצעים מתמטיים וחישוביים מתוחכמים לפגיעה בהנחות הקושי המשמשות לניסוח אלגוריתמי מפתח א-סימטרי. לדוגמה, האבטחה של RSA מבוססת על קושי פירוק מספרים ראשוניים גדולים, והתקדמות חישובית אחרונה אפשרה פירוק מוצלח של מפתחות RSA של 829 סיביות. לכן, RSA של 1024 סיביות מיושן כיום. כפי שיידון בהמשך, הסיכון העיקרי שמציבים קומפיוטרים קוונטיים ל-AKC נכלל גם בקטגוריה זו.
-
אקראיות לא מושלמת, שעלולה להוביל לחולשה בתהליך ייצור המפתחות. לדוגמה, אם גנרטור המספרים האקראיים המשמש ליצירת המפתחות פגום ומייצר מפתחות שאינם באמת אקראיים, תוקף עשוי להיות מסוגל לחזות את המפתחות.
-
פגמי יישום כמו שגיאות ביישום אלגוריתמים קריפטוגרפיים שחושפים בטעות מידע על המפתחות. לדוגמה, ריפוד שגוי עלול לחשוף פרטים על מפתחות.
-
ערוצי צד המתייחסים לדליפת מידע מהמערכת הפיזית המבצעת את הקריפטוגרפיה. דליפות כאלה יכולות להיות בצורת מידע תזמון, צריכת חשמל, או אפילו קול, שניתן לנצל במתקפת ערוץ צד. לדוגמה, ניתוח משך הביצוע של פעולות קריפטוגרפיות עשוי לחשוף את מספר ה-'1'ים במפתח בינארי. דליפה לכאורה תמימה זו מצמצמת משמעותית את מרחב החיפוש, ומגלה פתרונות אפשריים לבעיות שנראו בתחילה כבלתי-אפשריות.
-
חילופי מפתחות על-ידי יירוט מפתחות בזמן חילופם, כמו במתקפת אדם-באמצע (MITM). פרוטוקול DH רגיש למתקפות MITM אם לא משולבים שלבי אימות נוספים.
-
אחסון מפתחות שמטרתו לגנוב מפתחות מאחסון לא מאובטח דיו. זה כולל מתקפות פיזיות כמו מניפולציה או גניבה של אמצעי אחסון.
אבטחת קריפטוסיסטמות א-סימטריות מפני מגוון המתקפות האפשריות היא לכן משימה משמעותית הכוללת שיקולים מתמטיים, חומרתיים, תוכנתיים, לוגיסטיים ומשפטיים.
RSA
אלגוריתם RSA (Rivest-Shamir-Adleman) הוא אחת מהקריפטוסיסטמות הראשונות עם מפתח ציבורי ומשמשת באופן נרחב להעברת נתונים מאובטחת. מדובר בקריפטוסיסטמה מגוונת שמספקת את הפעולות הנחוצות לאפשור הצפנה, פענוח, חתימות דיגיטליות וחילופי מפתחות במסגרת משותפת.
בסעיף זה, נמחיש קריפטוגרפיה א-סימטרית (AKC) באמצעות RSA דרך דוגמאות פשוטות.
נשתמש בתרחיש הסטנדרטי של שני צדדים, אליס ובוב, שרוצים לתקשר באופן מאובטח באמצעות AKC.
אלגוריתם RSA
אלגוריתם RSA הבסיסי כולל ארבע פעולות: ייצור מפתח, הפצת מפתח, הצפנה ופענוח:
-
ייצור מפתח:
מפתחות ציבוריים ופרטיים נוצרים על בסיס עקרונות מתמטיים סביב מספרים ראשוניים, שחישובם קל אך ההפך קשה.
נתייחס לאלה:
- מפתח ציבורי:
- מפתח פרטי:
שים לב ש- משותף למפתח הציבורי ולמפתח הפרטי, ומכונה המודולוס. נצטרך להשתמש בזה בהמשך.
Mathematical detail
- בחר שני מספרים ראשוניים שונים, ו-.
- נבחרים באקראי (מטעמי אבטחה).
- הם צריכים להיות דומים בסדר גודל, אך להשתנות באורך בכמה ספרות, כדי להקשות על פירוק.
- מספרים ראשוניים ניתן לבחור ביעילות באמצעות בדיקת ראשוניות.
- חשב .
- הוא המודולוס עבור שני המפתחות הציבורי והפרטי.
- חשב את הטוטיינט .
- הטוטיינט מיועד להישמר בסוד ובדרך כלל נמחק לאחר ייצור המפתח.
- בחר מספר שלם כך ש- ו.
- כלומר, ו צריכים להיות קופריים.
- המספר זה מהווה את המעריך של המפתח הציבורי ובדרך כלל נבחר כמספר קטן ליעילות חישובית.
- המספר הראשוני משמש לעתים קרובות.
- חשב כדי לספק את יחס הקונגרואנס .
- כלומר, הוא ההיפוך הכפלי של מודולו .
- חישוב זה יעיל יותר באמצעות אלגוריתם אויילר המורחב.
- המספר זה הוא המעריך של המפתח הפרטי.
- המפתח הציבורי מורכב מ-, והמפתח הפרטי הוא .
-
הפצת מפתח:
- המפתח הציבורי מפורסם לאלה שעשויים לרצות לשלוח הודעה
- המפתח הפרטי נשמר בסוד.
-
הצפנה:
- אליס רוצה לשלוח הודעה לבוב. במקרה זה מספר שלם פשוט
- אליס משתמשת במפתח הציבורי של בוב להצפנת ההודעה לטקסט מוצפן
Mathematical detail
- הוא מספר שלם .
- , כאשר הוא הטקסט המוצפן.
-
פענוח:
- בוב מקבל את הטקסט המוצפן
- בוב משתמש במפתח הפרטי שלו לפענוח ההודעה חזרה להודעה
Mathematical detail
- .
זה קו המתאר הבסיסי של RSA. בפועל, סכמות ריפוד מתוחכמות יותר מוחלות על הטקסט הפשוט לפני ההצפנה כדי להבטיח שטקסטים פשוטים שווים מביאים לטקסטים מוצפנים שונים. זה מונע מגוון של מתקפות אפשריות נגד יישומים נאיביים של RSA ומא פשר אבטחה סמנטית.
המחשת RSA ב-Python
בתאי הקוד הבאים, נמחיש דוגמה פשוטה של אלגוריתם RSA באמצעות מספרים שלמים קטנים ואחר כך נדגים יישומים מעשיים של הפצת מפתחות וחתימות דיגיטליות באמצעות ספריות Python המיישמות RSA.
הערה: בסעיף זה נציג את חישובי המתמטיקה בפירוט כחלק מקוד ה-Python
ייצור מפתח RSA
בוא נעבור שלב-אחר-שלב על מופע פשוט של אלגוריתם RSA עם מספרים ראשוניים קטנים.
נצטרך להיות מסוגלים לחשב את המחלק המשותף המקסימלי של שני מספרים שלמים, שכן יהיה צורך בו כדי לבדוק האם שני מספרים שלמים הם קופריים.
נסביר דרך פשוטה אחת לחישוב זה, אך הרבה יותר יעיל עם מספרים שלמים גדולים יותר להשתמש בפונקציה math.gcd של Python.
# Added by doQumentation — required packages for this notebook
!pip install -q cryptography
import math
# Example function to compute the gcd (greatest common divisor)
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# let's calculate some examples using algorithm
n1 = gcd(50, 10)
n2 = gcd(99, 33)
n3 = gcd(59, 9)
# do the same with the python library call
m1 = math.gcd(50, 10)
m2 = math.gcd(99, 33)
m3 = math.gcd(59, 9)
# Confirm they are the same
assert n1 == m1
assert n2 == m2
assert n3 == m3
# They are - print out the values for explanation
print("gcd(50,10) =", m1)
print("gcd(99,33) =", m2)
print("gcd(59,9) =", m3)
השלב הראשון בזרימת עבודה של RSA הוא ייצור מפתח. תהליך זה מתחיל בבחירת שני מספרים ראשוניים, שאמורים להישמר בסוד על-ידי הישות המייצרת את המפתחות.
# Choosing two prime numbers and keep them secret
p = 13
q = 19
print("The secret prime numbers p and q are:", p, q)
לאחר מכן, המודולוס , שהוא פשוט המכפלה של שני הראשוניים שנבחרו, מחושב. מודולוס זה יפורסם כחלק מהמפתח הציבורי.
# Calculate n which is the modulus for both the public and private keys
n = p * q
print("modulus n (p*q)=", n)
פונקציית הטוטיינט של אויילר מחושבת לאחר מכן, שכן היא נדרשת לפעולת ההיפוך הכפלי המודולרי המשמשת לקביעת המפתחות ב-RSA. גם נשמר בסוד ובדרך כלל נמחק לאחר ייצור המפתח.
# Compute Euler's totient function, φ(n) and keep it secret
phi = (p - 1) * (q - 1)
print("The secret Euler's function (totient) [phi(n)]:", phi)
אנחנו מוכנים כעת לחשב את המפתחות הציבוריים והפרטיים. ב-RSA, כל אחד מהם מצוין על-ידי טאפל של שני מספרים שלמים. הערך הראשון בכל טאפל הוא מספר שלם שונה, והערך השני הוא המודולוס שמשותף לשני המפתחות.
הערך הראשון במפתח הציבורי יכול להיות כל מספר שלם גדול מ-1 שהוא קופרי ל-. שני מספרים שלמים הם קופריים אם המחלק המשותף המקסימלי שלהם הוא 1. לכן אנחנו משתמשים בפונקציה math.gcd כדי למצוא מספר שלם קופרי ל-.
# Choose an integer e such that e and φ(n) are coprime
e = 2
while e < phi:
if math.gcd(e, phi) == 1:
break
else:
e += 1
print("Public Key (e):", e)
המפתח הפרטי דורש מספר שלם , שהוא ההיפוך הכפלי של מודולו ; כלומר, הוא מספק את יחס הקונגרואנס . להמחשה פשוטה זו שבה אנחנו עוסקים במספרים שלמים קטנים, אנחנו יכולים פשוט לעבור על המספרים השלמים החיוביים כדי לאתר מתאים. בהגדרות ריאליסטיות,