הצפנת תרמיל גב

הצפנת תרמיל גב (באנגלית: Knapsack cryptosystem) היא מערכת הצפנת מפתח ציבורי שביטחונה מבוסס על הקושי המשוער שבפתרון בעיית תרמיל הגב שהיא בעיה NP-קשה. הצפנת תרמיל הגב הייתה הניסיון הראשון לבסס מערכת הצפנה על בעיה NP-קשה ואף על פי שהרעיון קיים כבר מאז 1978 רוב המערכות הקיימות שפותחו על בסיס זה נפרצו ולכן אינן בשימוש מעשי, אלא נחקרות לצורך אקדמי בלבד. השיטה הראשונה והמפורסמת ביותר היא הצפנת תרמיל גב של מרקל והלמן שפותחה ב-1978 על ידי רלף מרקל ומרטין הלמן. היא הייתה מערכת מפתח ציבורי מהראשונות שפותחו ופורסמה באותה שנה שבה פורסמה RSA. מערכת זו נפרצה לחלוטין בכמה התקפות מפורסמות שהראשונה שבהן הייתה של שמיר, אחריו פיתחו אדלמן, אודליצקו ולגריאס בנפרד קריפטואנליזה הנקראת התקפת צפיפות נמוכה לשבירת הצפנת מרקל-הלמן בזמן פולינומי. כל הגרסאות שהומצאו מאז כולל גרסת שור-ריבסט המכילה צפיפות גבוהה יחסית (הגדרה בהמשך), נמצאו לא בטוחות וניתנות לשבירה בזמן פולינומי או בזמן שהוא נמוך בהרבה מכוח גס עם הפרמטרים שהומלצו על ידי המפתחים. במרבית המקרים שינוי הפרמטרים לא יועיל במידה ניכרת ולכן מערכות אילו לא נכנסו לשימוש מעשי כלל למעט מערכת חדשה יחסית של Nasako-Murakami מ-2006 שעדיין לא התגלתה קריפטואנליזה יעילה שלה. העניין בהצפנת תרמיל הגב נובע מהעובדה שהיא נחשבת פוסט-קוונטית ולכן תהיה אטרקטיבית אם תמצא דרך בטוחה ליישמה. אם תמצא דרך כזו הרי שהמערכת אמורה לספק ביטחון גם לנוכח איום קריפטואנליזה על מחשב קוונטי כאשר יהיה מעשי. זאת בניגוד לשיטות כמו RSA ו-DSA המסתמכות על בעיית פירוק לגורמים ובעיית הלוגריתם הבדיד, אותם ניתן יהיה לשבור בקלות בהינתן מחשב קוונטי באמצעות אלגוריתם שור. בעיית תרמיל הגב קשורה בקשר הדוק עם סריגים. לאחר פרסום אלגוריתם LLL התברר שמערכת הצפנה מבוססת בעיית תרמיל הגב סובלת מבעיה מהותית. באופן כללי אם n ≤ 300 {\displaystyle n\leq 300} כאשר n {\displaystyle n} הוא פרמטר ביטחון (מפורט בהמשך) אז אלגוריתם לצמצום סריגים (Lattice reduction algorithm) מאפשר לגלות את הטקסט המקורי מתוך הטקסט המוצפן ללא ידיעת המפתח בזמן פולינומי. מאידך אם n > 300 {\displaystyle n>300} אז המפתחות מגיעים לממדים עצומים בערך 176KB למפתח מה שהופך את המערכת לבלתי יעילה. ערך מורחב – בעיית תרמיל הגב בעיית תרמיל הגב הנקראת גם בעיית הסכומים החלקיים - מהיבט קריפטוגרפי מוגדרת כדלהלן: נתונה הסדרה A {\displaystyle A} המכילה n {\displaystyle n} איברים שלמים, כאשר n {\displaystyle n} הוא פרמטר ביטחון (למשל n = 300 {\displaystyle n=300} ): A = { a 1 , a 2 , . . . , a n } {\displaystyle A=\{a_{1},a_{2},...,a_{n}\}} ונתון שלם חיובי S {\displaystyle S} הנקרא 'תרמיל גב'. הבעיה היא לגלות האם קיימת תת-קבוצה של איברים ב- A {\displaystyle A} שסכומה הוא S {\displaystyle S} . במילים אחרות המטרה היא לגלות את הווקטור e = ( e 1 , e 2 , . . . , e n ) ∈ { 0 , 1 } n {\displaystyle \mathbf {e} =(e_{1},e_{2},...,e_{n})\in \{0,1\}^{n}} המקיים: ∑ i = 1 n a i e i = S {\displaystyle \sum _{i=1}^{n}a_{i}e_{i}=S} . נניח ש- n = 6 {\displaystyle n=6} ונתונה הסדרה: M = { 2 , 3 , 4 , 9 , 14 , 23 } {\displaystyle M=\{2,3,4,9,14,23\}} ותרמיל הגב S = 27 {\displaystyle S=27} אפשר לראות בניסוי וטעייה שהפתרון הוא תת-הסדרה { 4 , 9 , 14 } {\displaystyle \{4,9,14\}} וקל לראות שזהו הפתרון היחיד במקרה זה. דרך אחרת להציג את הפתרון היא הווקטור e = ( 0 , 0 , 1 , 1 , 1 , 0 ) {\displaystyle \mathbf {e} =(0,0,1,1,1,0)} (כלומר הווקטור מכיל אחדים בכניסות המתאימות לאיברים הנכללים בסכום התרמיל ובכל היתר אפסים) במילים אחרות, אם ממספרים את כל האיברים בסדרה משמאל לימין M = { m 1 , m 2 , m 3 , m 4 , m 5 , m 6 } {\displaystyle M=\{m_{1},m_{2},m_{3},m_{4},m_{5},m_{6}\}} אז S = m 3 + m 4 + m 5 {\displaystyle S=m_{3}+m_{4}+m_{5}} . אפשר לפתור את הבעיה בכוח גס, פשוט על ידי ניסוי כל האפשרויות של הווקטור e {\displaystyle \mathbf {e} } עד למציאת הווקטור הנכון. סיבוכיות הפתרון היא מסדר גודל של O ( 2 n ) {\displaystyle O(2^{n})} , אולם אפשר לחתוך את סיבוכיות הפתרון בפקטור של שנים על ידי אלגוריתם ההתנגשות הבא. אם נתונה בעיית תרמיל-גב עם הפרמטרים M = ( m 1 , m 2 , . . . , m n ) {\displaystyle M=(m_{1},m_{2},...,m_{n})} באורך n {\displaystyle n} ושלם S {\displaystyle S} אפשר לפעול כדלהלן: מכינים קבוצת שלמים I {\displaystyle I} כך שמתקיים I ⊂ { i : 1 ≤ i ≤ 1 2 n } {\displaystyle \textstyle I\subset \{i:1\leq i\leq {\frac {1}{2}}n\}} , כלומר קבוצת כל האיברים הנמוכים מחצי של n {\displaystyle n} וכן, מכינים קבוצת שלמים J {\displaystyle J} כך שמתקיים J ⊂ { j : 1 2 n < j ≤ n } {\displaystyle \textstyle J\subset \{j:{\frac {1}{2}}n<j\leq n\}} , מחשבים את רשימת הערכים הבאים: A I = ∑ i ∈ I M i {\displaystyle \textstyle A_{I}=\sum _{i\in I}M_{i}} כלומר רשימת כל הסכומים האפשריים ב- I {\displaystyle I} , באותו אופן מחשבים את רשימת הערכים: B J = S − ∑ j ∈ J M j {\displaystyle \textstyle B_{J}=S-\sum _{j\in J}M_{j}} , ממיינים את הקבוצות לפי סדר מספרי ומחפשים התאמה כך שתתקבלנה שתי תת-רשימות I 0 {\displaystyle I_{0}} ו- J 0 {\displaystyle J_{0}} המקיימות: A I 0 = B J 0 {\displaystyle A_{I_{0}}=B_{J_{0}}} . רשימות אילו נותנות למעשה את הפתרון לבעיית תרמיל הגב כי S = ∑ i ∈ I 0 M i + ∑ j ∈ J 0 M j {\displaystyle S=\sum _{i\in I_{0}}M_{i}+\sum _{j\in J_{0}}M_{j}} . מספר האלמנטים ב- I {\displaystyle I} וב- J {\displaystyle J} הוא לכל היותר 2 n / 2 {\displaystyle 2^{n/2}} כל אחת ולכן זמן הריצה של האלגוריתם הוא O ( 2 n / 2 + ϵ ) {\displaystyle O(2^{n/2+\epsilon })} כאשר ϵ {\displaystyle \epsilon } הוא ערך קטן המייצג את התקורה הנוספת הנובעת מחישוב הרשימות ומיונן. בעיקרון אם n {\displaystyle n} גדול הפתרון המתואר אינו יעיל ולכן הבעיה הכללית מוגדרת קשה, אולם אינה מתאימה לקריפטוגרפיה כיוון שלא קיימת "דלת צונחת", אותו מידע סודי שהופך את פתרון הבעיה לקל מאוד למי שמחזיק בו ואילו עבור כל האחרים שאינם יודעים מהו הבעיה נותרת קשה. דרך אחת להכניס דלת צונחת היא להשתמש בבעיית תרמיל הגב עם תכונה מיוחדת שפתרונה קל. הרעיון של מרקל והלמן היה להשתמש בתרמיל גב המורכב מסדרה מונוטונית עולה שבה כל איבר גדול לפחות פי שניים מקודמו. בניסוח רשמי זוהי סדרה של n {\displaystyle n} איברים שלמים r = ( r 1 , r 2 , . . . , r n ) {\displaystyle r=(r_{1},r_{2},...,r_{n})} עם התכונה הבאה: r i + 1 ≥ 2 r i {\displaystyle r_{i+1}\geq 2r_{i}} עבור כל 1 ≤ i ≤ n − 1 {\displaystyle 1\leq i\leq n-1} . היא נקראת סופר-עולה (superincreasing) כיוון שעבור כל k {\displaystyle k} מתקיים: r k + 1 ≥ 2 r k {\displaystyle r_{k+1}\geq 2r_{k}} או r k + r k > r k + ( r k − 1 + ⋯ r 2 + r 1 ) {\displaystyle r_{k}+r_{k}>r_{k}+(r_{k-1}+\cdots r_{2}+r_{1})} . במקרה זה פתרון בעיית תרמיל הגב קל מאוד לפי האלגוריתם הבא: מבצעים רקורסיה שמתחילה באיבר האחרון ( M n {\displaystyle M_{n}} ) כלפי מטה עד האיבר הראשון ( M 1 {\displaystyle M_{1}} ) ובודקים עבור כל M i {\displaystyle M_{i}} : אם S ≥ M i {\displaystyle S\geq M_{i}} מציבים x i = 1 {\displaystyle x_{i}=1} ומחסרים S = S − M i {\displaystyle S=S-M_{i}} אחרת מציבים x i = 0 {\displaystyle x_{i}=0} וממשיכים עד ש- S = 0 {\displaystyle S=0} (בהנחה שפתרון קיים). לדוגמה הסדרה M = ( 3 , 11 , 24 , 50 , 115 ) {\displaystyle M=(3,11,24,50,115)} היא סופר עולה, נניח שנתון השלם S = 142 {\displaystyle S=142} מייצגים את S {\displaystyle S} כסכום איברים בסדרה M {\displaystyle M} כדלהלן: תחילה היות ש- S ≥ 115 {\displaystyle S\geq 115} לכן x 5 = 1 {\displaystyle x_{5}=1} ומחליפים את S {\displaystyle S} ב- S − 115 = 27 {\displaystyle S-115=27} . בשלב הבא היות ש- 27 < 50 {\displaystyle 27<50} מציבים x 4 = 0 {\displaystyle x_{4}=0} . בשלב הבא רואים ש- S = 27 > 24 {\displaystyle S=27>24} לכן x 3 = 1 {\displaystyle x_{3}=1} ו- S = S − 24 = 3 {\displaystyle S=S-24=3} . היות ש- 3 < 11 {\displaystyle 3<11} אנחנו יודעים ש- x 2 = 0 {\displaystyle x_{2}=0} ולבסוף x 1 = 1 {\displaystyle x_{1}=1} כי 3 ≥ 3 {\displaystyle 3\geq 3} ועוצרים כי S = S − 3 = 0 {\displaystyle S=S-3=0} . לסיכום, הפתרון הוא S = 1 ⋅ 3 + 0 ⋅ 11 + 1 ⋅ 24 + 0 ⋅ 50 + 1 ⋅ 115 = 142 {\displaystyle S=1\cdot 3+0\cdot 11+1\cdot 24+0\cdot 50+1\cdot 115=142} מרקל והלמן הציעו ב-1978 מערכת הצפנה המבוססת על בעיית תרמיל הגב עם סדרה סופר עולה שאותה מסתירים באמצעות שקילויות. כדי לייצר מפתח פרטי ומפתח ציבורי אליס בוחרת סדרה סופר עולה בעלת n {\displaystyle n} איברים r = ( r 1 , r 2 , . . . , r n ) {\displaystyle r=(r_{1},r_{2},...,r_{n})} כך שעבור כל 1 < i ≤ n {\displaystyle 1<i\leq n} מתקיים r i ≥ 2 r i − 1 {\displaystyle r_{i}\geq 2r_{i-1}} וכן בוחרת שני שלמים גדולים A {\displaystyle A} ו- B {\displaystyle B} המקיימים: B > 2 r n {\displaystyle B>2r_{n}} וכן gcd ( A , B ) = 1 {\displaystyle {\text{gcd}}(A,B)=1} כאשר gcd {\displaystyle {\text{gcd}}} היא פונקציית מחלק משותף מקסימלי, בדרך זו מובטח של- A {\displaystyle A} יהיה הופכי כפלי מודולו B {\displaystyle B} . אליס מכינה סדרה M {\displaystyle M} שאינה סופר עולה על ידי הכפלה ב- A {\displaystyle A} כך: M i ≡ A r i (  mod  B ) {\displaystyle M_{i}\equiv Ar_{i}({\text{ mod }}B)} כאשר 0 ≤ M i < B {\displaystyle 0\leq M_{i}<B} . הסדרה M {\displaystyle M} היא המפתח הציבורי של אליס שהוסתר על ידי הכפל ב- A {\displaystyle A} מודולו B {\displaystyle B} ואילו המפתח הסודי כולל את הסדרה r {\displaystyle r} והשלמים A {\displaystyle A} ו- B {\displaystyle B} בגלל החשבון המודולרי לא קל לנחש את A {\displaystyle A} או B {\displaystyle B} מתוך המפתח הציבורי. אם בוב רוצה להצפין את המסר x {\displaystyle x} עבור אליס הוא משתמש במפתח הציבורי שלה ומחשב את S = x ⋅ M = ∑ i = 1 n x i M i {\displaystyle S=x\cdot M=\sum _{i=1}^{n}x_{i}M_{i}} . את הטקסט המוצפן S {\displaystyle S} הוא שולח לאליס. לפענוח אליס פועלת כדלהלן, תחילה מחשבת את S ′ ≡ A − 1 S (  mod  B ) {\displaystyle S'\equiv A^{-1}S({\text{ mod }}B)} דהיינו מכפילה את S {\displaystyle S} בהופכי הכפלי של A {\displaystyle A} מודולו B {\displaystyle B} ואז משתמשת בסדרה הסופר עולה r {\displaystyle r} כדי לפתור את בעיית תרמיל הגב עם S ′ {\displaystyle S'} . הסיבה שהפענוח נכון היא בשל הזהות הבאה: S ′ ≡ A − 1 S ≡ A − 1 ∑ i = 1 n x i M i ≡ A − 1 ∑ i = 1 n x i A r i ≡ ∑ i = 1 n x i r i  (mod  B ) {\displaystyle S'\equiv A^{-1}S\equiv A^{-1}\sum _{i=1}^{n}x_{i}M_{i}\equiv A^{-1}\sum _{i=1}^{n}x_{i}Ar_{i}\equiv \sum _{i=1}^{n}x_{i}r_{i}{\text{ (mod }}B)} . היות ש- S ′ < B {\displaystyle S'<B} מובטח לאליס שתקבל תוצאה מדויקת ולא רק שקילות כלשהי מודולו B {\displaystyle B} . נניח שאליס בחרה סדרה סופר-עולה סודית מהדוגמה הקודמת r = ( 3 , 11 , 24 , 50 , 115 ) {\displaystyle r=(3,11,24,50,115)} וכן A = 113 , B = 250 {\displaystyle A=113,B=250} . כעת הסדרה המוסוות שלה M {\displaystyle M} תהיה הכפלה של r {\displaystyle r} ב- A {\displaystyle A} כך שמתקבל: M ≡ ( 113 ⋅ 3 , 113 ⋅ 11 , 113 ⋅ 24 , 113 ⋅ 50 , 113 ⋅ 115 )  (mod  250 ) {\displaystyle M\equiv (113\cdot 3,113\cdot 11,113\cdot 24,113\cdot 50,113\cdot 115){\text{ (mod }}250)} = ( 89 , 243 , 212 , 150 , 245 ) {\displaystyle =(89,243,212,150,245)} . שים לב שגם אם ממיינים את איברי M בסדר עולה הסדרה שהתקבלה רחוקה מלהיות סופר-עולה ולכן יהיה קשה לפתור את בעיית תרמיל הגב בסדרה זו לעומת הסדרה r {\displaystyle r} . כעת אם בוב מעוניין לשלוח לאליס את המסר x = ( 1 , 0 , 1 , 0 , 1 ) {\displaystyle x=(1,0,1,0,1)} , הוא מצפין אותו תחילה באמצעות הכפלה ב- M {\displaystyle M} כך שמתקבל: S = x ⋅ M = 1 ⋅ 89 + 0 ⋅ 243 + 1 ⋅ 212 + 0 ⋅ 150 + 1 ⋅ 245 = 546 {\displaystyle S=x\cdot M=1\cdot 89+0\cdot 243+1\cdot 212+0\cdot 150+1\cdot 245=546} . ושולח לאליס את S = 546 {\displaystyle S=546} . כאשר אליס מקבלת את הטקסט המוצפן S {\displaystyle S} היא מכפילה אותו תחילה בהופכי של 113 {\displaystyle 113} מודולו 250 {\displaystyle 250} שהוא A − 1 = 177 {\displaystyle A^{-1}=177} ומתקבל: S ′ ≡ 177 ⋅ 546 = 142  (mod  250 ) {\displaystyle S'\equiv 177\cdot 546=142{\text{ (mod }}250)} . כעת נותר לאליס להשתמש באלגוריתם המתואר לעיל כדי לפתור את בעיית תרמיל הגב בסדרה r {\displaystyle r} עם הערך S ′ = x ⋅ r = 142 {\displaystyle S'=x\cdot r=142} וכך מחלצת את הטקסט המקורי x {\displaystyle x} . בעיית תרמיל הגב הכללית נחשבת ל-NP-קשה והיא מהווה מועמדת טובה לפונקציה חד-כיוונית. אולם לצורך קריפטוגרפי יש צורך גם בדלת צונחת שהיא המידע הנסתר המאפשר למקבל הלגיטימי לפתור את הבעיה בזמן פולינומי. הגרסה הראשונה של הצפנת תרמיל הגב שהסתמכה על סדרה סופר-עולה הכילה כמה חסרונות מהותיים שהעיקרית שבהן היא העובדה שתרמיל גב מכיל צפיפות נמוכה מדי מה שגורם לנקודת תורפה היות שבמקרה של תרמיל גב בעל תכונה זו קיימים אלגוריתמים יעילים לפתרון הבעיה. במרוצת הזמן הוצעו מספר רב של גרסאות משופרות שנועדו להתמודד עם הבעיות הללו בין היתר על ידי שימוש בתרמילי גב מרובים או הסתרה של תרמיל הגב באמצעות חשבון מודולרי ואלגברה בחוג הפולינומים. ב-1985 פורסם בנפרד על ידי בריקל, לגריאס ואודליצקו אלגוריתם LO המסתמך על אלגוריתם צמצום סריגים (LLL) שמצליח לפתור את הבעיה כמעט תמיד בזמן פולינומי בתנאי שצפיפות תרמיל הגב נמוכה מ-0.6463. צפיפות תרמיל הגב d {\displaystyle d} מוגדרת כדלהלן: d = n / ( log 2 ⁡  max  a i ) {\displaystyle d=n/(\log _{2}{\text{ max }}a_{i})} . אלגוריתם CJLOSS משפר את החסם לגריאס-אודליצקו ל- d < 0.9408 {\displaystyle d<0.9408} . היות שהאלגוריתמים האמורים מסתמכים על צפיפות תרמיל הגב הם נקראים באופן כללי "התקפת צפיפות נמוכה". אולם הבעיה הכללית, דהיינו אם צפיפות תרמיל הגב גבוהה מהגבול האמור נותרה בעיה קשה. הרעיון של אלגוריתם LO הוא להמיר את הבעיה לבעיה אחרת מתורת הסריגים הנקראת בעיית מציאת הווקטור הקצר ביותר (SVP) שהיא בעיה קשה מאוד. אף על פי שלא קיים אלגוריתם פולינומי ל-SVP, מעשית אלגוריתם LLL של האחים לנסטרה ולובאז' מצליח לפתור את בעיית הווקטור הקצר בקירוב טוב, הרבה יותר ממה שמציע הגבול התאורטי. האמור הוא אם מתבצעת קריאה אחת לאורקל SVP. אולם במקרה של קריאות מרובות קיים שיפור שלו שנקרא אלגוריתם CJLOSS+‎ שמשפר את התוצאות האמורות מהיבט אסימפטוטי. The Rise and Fall of Knapsack Cryptosystems R. C. Merkle and M. E. Hellman, Hiding information and signatures in trapdoor knapsacks, IEEE Transactions on Information Theory, Vol.24 (1978) pp.525–534. A. Shamir, A polynomial time algorithm for breaking the basic Merkle-Hellman cryptosystems, Proc. Crypto’82, LNCS, pp.279–288, Springer-Verlag, Berlin, 1982. L. M. Adleman, On breaking the titrated Merkle-Hellman public-key cryptosystem, Plenum Press. Crypto’82, pp.303–308. 1982. J. C. Lagarias, and A. M. Odlyzko, Solving low-density subset sum problems, Journal of the Association for Computing Machinery, Vol.32, No.1 (1985) pp.229–246 B. Chor, and R. L. Rivest, A knapsack-type public key cryptosystem based on arithmetic in finite fields, IEEE Transactions on Information Theory, Vol.34, No.5 (1988) pp.901–909. T. Nasako and Y. Murakami, A high-density knapsack cryptosystem using combined trapdoor, the Japan Society for Industrial and Applied Mathematics, Vol.16, No.4, pp.519-605, 2006 E. F. Brickell, Breaking iterated knapsacks, Advances in Cryptology: Proceedings of CRYPTO’84 (G. R. Blakley and D. Chaum, eds.), Lecture Notes in Computer Science, Springer-Verlag, New York, 196 (1985) pp.342–358 J. C. Lagarias, and A. M. Odlyzko, Solving low-density subset sum problems, Journal of the Association for Computing Machinery, Vol.32, No.1 (1985) pp.229–246. M. J. Coster, A. Joux, B. A. LaMacchia, A. M. Odlyzko, C. P. Schnorr, and J. Stern, Improved low-density subset sum algorithms, Computational Complexity, Vol.2 (1992) pp.111–128.