RSA

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

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

הפצת המפתח:

הצפנה:

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

דוגמה להצפנה

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

n=pq=3233φ(n)=(p1)(q1)=3120

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

d3120e131202753

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

y=x17 mod  3233=2790

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

x=27902753323365
ישנן כמה שאלות שעולות לנו

  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+q1)=n(p+q1)=pqpq+1=(p1)(q1)

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

טענה 2 : ydnx
מתקיים d=e1Um ולכן dem1 כלומר de=1+km. נשים לב גם ש yd=(xe)d=xedZn כאשר פעולת החזקה היא עם מודולו n.
נחלק למקרים:

yd=(xe)d=xed=x1+km=x(xm)k=x(xφ(n))knx xkm=xk(p1)(q1)=(xq1)k(p1)q1

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

yd=x1+km=xxkm=x(hq+1)=x+hqx=x+hqtp=x+nhpnx

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

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

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

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

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

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

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

עובדה

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

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

טענה 1 יהי p ראשוני ו xZp אזי x2=1x=±1 . כלומר x=1x=p1.

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

הבחנה חשובה

אם p ראשוני גדול מ 2 אז 2|p1 ולכן p1=2sr מכאן כבר אנחנו יכולים להבין לאן האלגוריתם הולך... נבטא את ap1 כ a2sr ונתחיל לחשב את השורשים. בהמשך נראה בידיוק איך זה יעבוד

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

  1. arn1
  2. a2jrn1 כאשר j{0,,s1}

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

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

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

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

חישוב ההופכי

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

xx1n1

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

n|(xx11)

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

nk=xx11xx1nk=1

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

דיפי-הלמן

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

א) נבחר p ראשוני גדול מאוד.
ב) בוחרים gUp מפורסם.
ג) אילן בוחר a בר בוחרת b .
ד) אילן שולח לבר את gamodp .
ה) בר שולחת לאילו את gbmodp .
ו) כל אחד מהם מעלה בחזקת המספר שבחר והם מקבלים gabpgba . הסוד המשותף הוא gabmodp .

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

הבחנה

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