RSA

דוגמה לשימוש מעשי בתורת החבורות הוא מערכת הצפנה RSA. מערכת זו מממשת שיטה להצפנה אסימטרית כלומר מערכת מבוססת מפתח ציבורי.

בר רוצה לשלוח מסר x לאילן.
נתאר את התרחיש הבא-
יצירת המפתח:

הפצת המפתח:

הצפנה:

פענוח:
אילן מחלץ את המספר על ידי החישוב הבא x=ydmodn

דוגמה להצפנה

אילן מגריל את p=61 ו q=53
כעת מתקיים

n=pq=3233φ(n)=(p−1)(q−1)=3120

אילן מגריל בנוסף e=17 (הוא ראשוני ולכן זר לנ״ל) ויתקיים שהמפתח הסודי הוא

d≡3120e−1≡31202753

כעת אילן מפרסם את (3233,17) ומחכה...
בר רוצה לשלוח את x=65 לאילן. היא מחשבת את ההודעה המוצפנה

y=x17 mod  3233=2790

בר שולחת את y לאילן... והוא מחלץ את המידע באמצעות d כלומר

x=27902753≡323365
ישנן כמה שאלות שעולות לנו

  1. איך בכלל מחשבים חזקות בצורה מהירה כדי לזרז את הליך החישוב?
  2. איך מגרילים שתי מספרים ומבטיחים שהם ראשוניים?
  3. איך מוצאים את ההופכי d?

נכונות

כדי להראות נכונות נוכיח שתי טענות מרכזיות
טענה 1 : φ(n)=m
אנחנו יודעים שהמשמעות של פונקציית אוילר היא סדר של חבורה אוילר כלומר כל המספרים שזרים ל n ב Zn . כיוון ש n=pq כלומר מכפלת שתי ראשוניים שקטנים ממנו אז נצטרך להסיך מהטווח [n] את כל המספרים שהם מחלקים של n שזה בעצם 1,q,p,n . כיוון שנרצה להשאיר רק את מי שזר ל n הרי שכל המספרים ש p,q מחלקים נצטרך להוריד גם אותם. אלו בעצם יהיו

{iq  | i∈[p]}  {jp | j∈[q]}

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

|[n]|−(p+q−1)=n−(p+q−1)=pq−p−q+1=(p−1)(q−1)

הורדנו 1 בגלל שבשתי הקבוצות ספרנו את n כלומר ספרנו אותו פעמיים.

טענה 2 : yd≡nx
מתקיים d=e−1∈Um ולכן de≡m1 כלומר de=1+k⋅m. נשים לב גם ש yd=(xe)d=xed∈Zn כאשר פעולת החזקה היא עם מודולו n.
נחלק למקרים:

yd=(xe)d=xed=x1+km=x⋅(xm)k=x⋅(xφ(n))k≡nx xkm=xk(p−1)(q−1)=(xq−1)k(p−1)≡q1

לכן, xkm=hq+1 ואם נציב ב y נקבל

yd=x1+km=xxkm=x(hq+1)=x+hqx=x+hqtp=x+nhp≡nx

העלאה מהירה בחזקה

התשובה לשאלה הראשונה תמונה בשאלה די יעילה להעלות בחזקה בצורה מהירה כאשר מחפשים את התוצאה לאחר שארית.
נרצה להעלות בחזקות ריבועיות. הכי קל יהיה להדגים:

נניח שנרצה לחשב את x17 נשים לב שמתקיים 17=16+1 כלומר נוכל לחשב את x16 באופן הבא

x,x2,(x2)2,(x4)2,(x8)2

ולהכפיל את התוצאה ב x. ביצענו פחות פעולות ואחרי כל העלאה בריבוע נבצע mod אם צריך וככה גם נעבוד עם מספרים נמוכים יותר.

אלגוריתם מילר רבין

נרצה למצוא מספרים ראשוניים גדולים.

עובדה

כמות הראשוניים עד n היא בערך nlog⁡n . כלומר הסיכוי שמספר אקראי עד n הוא ראשוני יהיה 1log⁡n.

האלגוריתם הינו אלגוריתם הסתברותי לאס וגאס ובבסיסו עומד המשפט הקטן של פרמה שאומר שעבור p ראשוני אז ap−1≡p1 . הבעיה עם המשפט הזה היא שיש מספרים לא ראשוניים שמקיימים אותו לכל a ולכן צריך לפתור את זה באופן הסתברותי ולצמצם את אחוז השגיאות. לפני שניגש לאלגוריתם מספר טענות חשובות

טענה 1 יהי p ראשוני ו x∈Zp אזי x2=1↔x=±1 . כלומר x=1∨x=p−1.

הוכחה-
בכיוון הראשון ברור שאם x הוא אחד מהערכים הנ״ל אז העלאה שלו בריבוע תיתן 1.
בכיוון השני מתקיים ש x2−1=0→(x−1)(x+1)=0
אמרנו כבר ש Zp הוא שדה ולכן אין מחלקי 0 ולכן x−1=0 או x+1=0 .

הבחנה חשובה

אם p ראשוני גדול מ 2 אז 2|p−1 ולכן p−1=2s⋅r מכאן כבר אנחנו יכולים להבין לאן האלגוריתם הולך... נבטא את ap−1 כ a2s⋅r ונתחיל לחשב את השורשים. בהמשך נראה בידיוק איך זה יעבוד

עד חזק לראשוניות
יהי n>1 טבעי (ואי זוגי, אחרת הוא בוודאות לא ראשוני) ויהי a∈[n] . נסמן n−1=2s⋅r ו
a ייקרא עד חזק לראשוניות של n אם אחד מהתנאים הבאים מתקיים

  1. ar≡n1
  2. a2jr≡n−1 כאשר j∈{0,…,s−1}

כעת נשים לב שאם p ראשוני מפרמה הקטן כל a יהיה עד חזק. אם p אינו ראשוני אז לכל היותר 14 מבין ערכי a יהיו עדים חזקים.

כעת נבין את הרעיון לפי דוגמה p=41 . לפי פרמה a40≡411 וכעת מתקיים a20≡±1 אם הוא 1 נוכל להמשיך אחרת נעצור... ולכן זאת הסיבה שמספר a יהיה עד חזק לראשוניות אם הוא יעמוד בתנאים הנ״ל. במקרה של הדוגמה הנ״ל אם נמשיך נקבל r=5 אם הוא היה 1 אז סיימנו והוא עד חזק, אחרת ממשיכים לעלות בחזקת 2 עד שמקבלים −1 בחזקה כלשהי או שיקרה אחד מהשניים:

  1. אם המספר שהגענו אליו שקול מודולו n ל 1 אז שום העלאה בריבוע שנעשה לא תוביל אותנו לשקילות מודולו של −1 ונוכל לצאת מהלולאה.
  2. אם הגענו לחזקה אחת לפני p−1 וקיבלנו 1 גם נוכל לצאת ולהחזיר פריק.

האלגוריתם:
Pasted image 20230228202832.png

חישוב ההופכי

חישוב ההופכי אפשר לעשות בקלות לפי אלגוריתם אוקלידס המורחב . נניח שיש לנו x∈Un עבורו נרצה לחשב את x−1 בחבורת אוילר Un . אם כן אנחנו יודעים שמתקיים

x⋅x−1≡n1

כלומר n מחלק את הביטוי

n|(xx−1−1)

המשמעות ש n מחלק את הביטוי היא שקיים k כלשהו כך ש

nk=xx−1−1→xx−1−nk=1

נשים לב ש gcd(x,n)=1 כי x∈Un כלומר הוא זר ל n ולכן הביטוי הנ״ל הוא צירוף ליניארי מינימלי עבור הgcd כלומר נוכל להשתמש באלגוריתם אוקלידס המורחב לחשב את (n,k) ולהציב כדי להגיע למקדמים האלו. באלגוריתם שלנו מדובר ב d שנמצא ב Um אבל הצעדים זהים.

דיפי-הלמן

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

א) נבחר p ראשוני גדול מאוד.
ב) בוחרים g∈Up מפורסם.
ג) אילן בוחר a בר בוחרת b .
ד) אילן שולח לבר את gamodp .
ה) בר שולחת לאילו את gbmodp .
ו) כל אחד מהם מעלה בחזקת המספר שבחר והם מקבלים gab≡pgba . הסוד המשותף הוא gabmodp .

הרעיון הוא שלחלץ את a או את b היא בעצם קשורה לפתרון של בעיית הלוג הדיסקרטי שזאת בעייה מאוד קשה. ב RSA הקושי בפתרון הוא למעשה בעובדה ש d הוא סודי והעלאה בחזקה מאוד גבוהה דיסקרטית היא גם בעיה מאוד קשה חישובית.

הבחנה

אלגוריתם זה הוא הבסיס להצפנה סימטרית