אלגוריתם פוליג-הלמן

בתורת החבורות ובקריפטוגרפיה אלגוריתם פוליג-הלמן (באנגלית: Pohlig–Hellman algorithm) הוא אלגוריתם לפתרון בעיית הלוגריתם הבדיד במקרה הפרטי כאשר סדר החבורה הוא מספר חלק (שגורמיו הראשוניים קטנים). האלגוריתם הומצא ב-1978 על ידי סטיבן פוליג ומרטין הלמן[1].

שיטת פוליג הלמן

בעיית הלוגריתם הבדיד

  ערך מורחב – בעיית הלוגריתם הבדיד

בעיית הלוגריתם הבדיד הכללית היא: בהינתן חבורה ציקלית 𝔾 מסדר q ויוצר g ויהי h𝔾 איבר כלשהו. מצא x המקיים h=gx. הוא נקרא הלוגריתם הבדיד של h בבסיס g בקיצור loggh. אם q ראשוני, אלגוריתם צעד-קטן צעד-גדול פותר את הבעיה בסיבוכיות זמן של q צעדים ובסיבוכיות מקום זהה. אלגוריתם רו של פולרד פותר את הבעיה בזמן דומה אך ללא צריכת זיכרון משמעותית.

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

רקע מתמטי

אלגוריתם פוליג הלמן מנסה להאיץ את חישוב הלוגריתם הבדיד במקרה שסדר החבורה q אינו ראשוני וידועים גורמים לא טריוויאליים שלו. ידוע שהסדר של האיבר g הוא השלם i הקטן ביותר המקיים gi=1. יהי q הסדר של g ונניח שקיים שלם p שהוא מחלק שלו (p|q) אז הסדר של gp הוא q/p. הכללה של משפט השאריות הסיני אומרת שאם ידוע הפירוק: q=Πi=1kqi כאשר כל qi זר יחסית לגורמים האחרים (כלומר gcd(qi,qj)=1 עבור כל ij) כאשר gcd היא מחלק משותף מקסימלי, אז קיימת התאמה או איזומורפיזם בין החבורות qi למכפלה הקרטזית שלהם q1×q2××qk וקיימת דרך יעילה לעבור בין הייצוגים השונים.

בהינתן היוצר g ואיבר כלשהו נניח h ואנחנו מעוניינים למצוא את x כך שמתקיים gx=h, נניח שהסדר של g הוא q וידועים לנו הגורמים שלו: q=Πi=1kqi (הגורמים לא חייבים להיות ראשונים כל עוד הם זרים זה לזה), אז ידוע שמתקיים:

(gq/qi)x=(gx)q/qi=hq/qi עבור כל i=1,...,k.

אם gi=gq/qi עבור כל i אז מתקבלות k בעיות של לוגריתם בדידי ב-k חבורות, כל אחת מסדר qi שהסדר שלהן קטן משמעותית מ-q. אם נפתור את k המופעים הללו בעזרת כל אלגוריתם כוח גס לפתרון בעיית לוגריתם בדיד, נוכל לפתור את הבעיה בחבורה הגדולה (נובע ממשפט השאריות הסיני). כלומר הלוגריתמים הבדידיים xi מ-1 עד k מקיימים: gixi=hq/qi=gix. היות ש-x שקול ל-xi מודולו qi עבור כל i לפי משפט השאריות הסיני למערכת המשוואות הבאה:

xx1 mod q1
xxk mod qk

יש פתרון יחיד x מודולו q. כך שאפשר לחשב אותו מתוך x1,...,xk עם אלגוריתם כמו אלגוריתם גאוס או אלגוריתם של גרנר (מתואר בהמשך).

תיאור האלגוריתם

תיאור אלגוריתם פוליג-הלמן מתוך הספר "מבוא למתמטיקה של ההצפנה"[2]. תהי 𝔾 חבורה ונניח שיש לנו אלגוריתם לפתרון בעיית הלוגריתם הבדיד ב-𝔾 עבור כל איבר מסדר שהוא חזקה ראשונית (מתואר בהמשך). למשל אם g𝔾 הוא מסדר qe ונניח שיש לנו אלגוריתם שפותר את הבעיה gx=h בסיבוכיות של qe/2. אם הסדר של g𝔾 הוא N שניתן לפירוק מהצורה N=q1e1q2e2qkek אז אפשר לפתור את בעיית הלוגריתם הבדיד gx=h בסיבוכיות של

O(i=1kqiei/2+logN) צעדים.

השיטה היא כדלהלן:

  1. עבור i=1 עד k בצעו:
    1. gi=gN/qiei וכן hi=hN/qiei
    2. היות שכל gi הוא מסדר חזקה ראשונית, אפשר להשתמש באלגוריתם לפתרון בעיית הלוגריתם הבדיד עם סדר מחזקה ראשונית שמתואר להלן, כתת-שגרה שלו, כדי לפתור את הבעיה giy=hi.
    3. יהי y=yi הפתרון למשוואה זו.
  2. פותרים את מערכת המשוואות המודולרית בעזרת משפט השאריות הסיני:
xy1 (mod q1e1),
xy2 (mod q2e2),
xyk (mod qkek).

אלגוריתם פוליג-הלמן בעצם מצמצם את בעיית הלוגריתם הבדיד של איבר מסדר כלשהו לבעיית הלוגריתם הבדיד של איבר מסדר שהוא חזקה של ראשוני. לכן בעיית הלוגריתם הבדיד בחבורה 𝔾 קלה לפתרון אם הסדר של החבורה הוא כפולה של ראשוניים קטנים. למשל במקרה של השדה 𝔽p אם p1 מתפרק לגורמים קטנים אז לא מומלץ להשתמש בשדה הזה אם רוצים חבורה שבה הבעיה נחשבת קשה. מה שאפשר לעשות זה למצוא שדה כזה כך שהראשוני p שווה 2q+1 כאשר q ראשוני וכן לבחור יוצר מסדר q ואז עובדים בתת-חבורה מסדר q של 𝔽p וסיבוכיות פתרון בעיית הלוגריתם הבדיד בתת-חבורה זו יהיה מסדר O(q). בגלל שאלגוריתם תחשיב אינדקסים הוא תת-מעריכי q צריך להיות גדול.

יתרה מזו אפשר לצמצם את בעיית הלוגריתם הבדיד של איבר מסדר חזקה ראשונית לסדר ראשוני בסיבוכיות O(eq) (להיפטר מהחזקה). בגלל הטריק הבא: אם g הוא מסדר qe אז gqe1 הוא מסדר q. אם חוזרים על פעולה זו מספר פעמים אפשר להגיע לפתרון הלוגריתם הבדיד. הרעיון הוא לכתוב את המעריך x בצורה:

x=x0+x1q+x2q2+xe1qe1 כאשר 0xi<q.

ואז לחשב רקורסיבית את x0,x1,x2,.... היות ש-gqe1 הוא מסדר q מזה נובע ש:

hqe1=(gx)qe1
=(gx0+x1q+x2q2++xe1qe1)qe1
=gx0qe1(gqe)x1+x2q++xe1qe2
=(gqe1)x0

הראשון נובע מהעלאת שני האגפים של gx=h בחזקת qe1. השני נובע מההצגה המורחבת של x השלישי נובע מהעובדה ש-gqe=1. לכן המשוואה:

(gqe1)x0=hqe1

הוא לוגריתם בדיד שהבסיס שלו הוא איבר מסדר q. ההנחה היא שאפשר לפתור בעיה זו ב-q צעדים. אם פתרנו את המשווה הזו נוכל למצוא את x0 עם המאפיין:

gx0qe1=hqe1 בחבורה 𝔾.

בשלב הבא מבצעים חישוב דומה והפעם מעלים את שני האגפים של gx=h בחזקת qe2 ומקבלים את:

hqe2=(gx)qe2
=(gx0+x1q+x2q2++xe1qe1)qe2
=gx0qe2gx1qe1(gqe)x2+x3q++xe1qe3
=gx0qe2gx1qe1.

היות שאנחנו כבר יודעים את ערכו של x0, כדי למצוא את x1 אנחנו צריכים לחשב את הלוגריתם הבדיד

(gqe1)x1=(hgx0)qe2.

עבור הנעלם x1. שוב אפשר עם האלגוריתם לפתרון לוגריתם בדיד מסדר ראשוני ב-q צעדים למצוא את x1 ואז קיבלנו את x0 ו-x1 המקיימים:

g(x0+x1q)qe2=hqe2 ב-𝔾.

באותה דרך אפשר למצוא את x2, באופן כללי אחרי שאנחנו יודעים מהם הערכים של x0,...,xi1 אז אפשר לחשב את xi על ידי פתרון:

(gqe1)xi=(hgx0x1qxi1qi1)qei1 בחבורה 𝔾. כל לוגריתם כזה ניתן לפתרון בזמן שורש q צעדים. לכן אחרי eq צעדים אפשר לקבל את המעריך x=x0+x1q++xe1qe1 המקיים gx=h.

דוגמאות להמחשה

נתונים הערכים:

p=11251,g=23,h=9689.
N=(p1)=q1e1q2e2q3e3=23254

והבעיה היא לפתור את המשוואה gx=9689 בשדה 𝔽11251* שהוא מסדר 11250. במקרה זה פותרים את הלוגריתם הבדיד של תת-בעיות מסדר נמוך לפי הגורמים הראשוניים של N. שני הגורמים הראשונים קטנים לכן הפתרון שלהם טריוויאלי. להלן דוגמה לפתרון בעיית הלוגריתם הבדיד בסדר של הגורם השלישי. אנחנו מנסים לפתור את המשוואה 5448x=6909 בשדה 𝔽11251*. היות שהראשוני p=11251 נבחר בצורה כזו ש-p1 מתחלק ב-54 ולכן 5448 הוא מסדר 54 בשדה 𝔽11251*. פותרים אותו בהדרגה כדי לקבל את x כדלהלן:

1. הצעד הראשון הוא לפתור את המשוואה (544853)x0=690953, שמצטמצמת למשוואה 11089x0=11089 זה קל כי x0=1 הוא הפתרון היחיד ובשלב זה ערכו של x הוא x=x0=1.

2. בצעד השני מנסים לפתור את:

(544853)x1=(69095448x0)52=(690954481)52,

שמצטמצמת למשוואה 11089x1=3742. כל מה שצריך לבדוק עבור x1 זה ערכים בטווח 1 עד 4. כך שאפשר לפתור את זה בכוח גס די בקלות. במקרה זה הפתרון הוא x1=2, לכן בשלב זה ערכו של x הוא x=11=1+25.

3. ממשיכים לצעד הבא ומנסים לפתור את:

(544853)x2=(69095448x0x15)5=(6909544811)5,

שמצטמצמת למשוואה 11089x2=1 לכן x2=0 והמשמעות במקרה זה היא שערכו של x נשאר 11 בשלב זה.

4. הצעד הבא והאחרון הוא לפתור את:

(544853)x3=69095448x0x15x252=6909544811.

5. התוצאה האחרונה היא 11089x3=6320, שהפתרון שלה הוא x3=4 לכן התשובה הסופית היא:

x=511=1+25+453.
אפשר לראות שמתקיים 5448511=6909 בשדה 𝔽11251*.

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

q e gN/qe hN/qe (gN/qe)x=hN/qe
2 1 11250 11250 1
3 2 5029 10724 4
5 4 5448 6909 511


הבעיה המופיעה בשורה השלישית היא הבעיה מהדוגמה הקודמת.

בשלב זה מנצלים את משפט השאריות הסיני כדי לפתור את מערכת המשוואות המודולרית:

x1 (mod 2)
x4 (mod 32)
x511 (mod 54)

והפתרון הוא 234261=9689 מודולו 11251.

אלגוריתם גרנר לפתרון CRT

אלגוריתם גרנר לפתרון מערכת משוואות מודלרית לפי משפט השאריות הסיני[3].

קלט: שלם חיובי m שהוא כפולה של t שלמים חיוביים זרים זה לזה m1m2mt וייצוג מודולרי v(x)=(v1,v2,...,vt) (השאריות) של x מודולו mi בהתאמה.

פלט: שלם x המקיים את משוואת CRT.

  1. עבור i=2 עד t מצבעים:
    1. Ci=1
    2. עבור j=1 עד (i1) מבצעים:
      1. u=mj1 mod mi
      2. Ci=uCi mod mi
  2. u=v1,x=u
  3. עבור i=2 עד t מחשבים את: u=(vix)Ci mod mi,x=x+uΠj=1i1mj.
  4. מחזירים את x.

הערות שוליים

  1. ^ S. Pohlig and M. Hellman, "An improved algorithm for computing logarithms over GF(p) and its cryptographic significance (Corresp.)," Information Theory, IEEE Transactions on 24, no. 1 (1978): 106-110.
  2. ^ An Introduction to Mathematical Cryptography Hoffstein, Jeffrey, Pipher, Jill, Silverman, J.H. Springer 2014, Chapter 2: The Pohlig-Hellman algorithm, Page 86
  3. ^ Handbook of Applied Cryptography Number-Theoretic Reference Problems, Paul van Oorschot, Alfred J. Menezes, Scott A. Vanstone, CRC Press 1997