לדלג לתוכן

NTRU – הבדלי גרסאות

מתוך ויקיפדיה, האנציקלופדיה החופשית
תוכן שנמחק תוכן שנוסף
אפשרות הצעות קישורים: נוסף קישור אחד.
 
(28 גרסאות ביניים של 11 משתמשים אינן מוצגות)
שורה 1: שורה 1:
'''NTRU'''{{הערה|[http://grouper.ieee.org/groups/1363/lattPK/submissions/ntru.pdf NTRU: A PUBLIC KEY CRYPTOSYSTEM]}} היא מערכת [[קריפטוגרפיה|הצפנת]] [[הצפנת מפתח ציבורי|מפתח ציבורי]] ו[[חתימה דיגיטלית]] מבוססת [[הצפנה מבוססת סריג|סריגים]] מוגנת ב[[פטנט]] ו[[קוד פתוח]] ברישיון [[GPL]], שהומצאה ב-1996 והוצעה כתקן חלופי למערכות הקיימות [[RSA]] ו-[[הצפנה מבוססת עקום אליפטי|ECC]]. נכללת ברשימת האלגוריתמים ה[[הצפנה פוסט-קוונטית|פוסט-קוונטיים]] וידועה כמערכת האסימטרית המהירה והיעילה ביותר נכון לשנת 2016.
'''NTRU'''{{הערה|[http://grouper.ieee.org/groups/1363/lattPK/submissions/ntru.pdf NTRU: A PUBLIC KEY CRYPTOSYSTEM]}} היא מערכת [[קריפטוגרפיה|הצפנת]] [[הצפנת מפתח ציבורי|מפתח ציבורי]] ו[[חתימה דיגיטלית]] מבוססת [[הצפנה מבוססת סריג|סריגים]] מוגנת ב[[פטנט]] ו[[קוד פתוח]] ברישיון [[GPL]], שהומצאה ב-1996 והוצעה כתקן חלופי למערכות הקיימות [[RSA]] ו-[[הצפנה מבוססת עקום אליפטי|ECC]]. נכללת ברשימת האלגוריתמים ה[[הצפנה פוסט-קוונטית|פוסט-קוונטיים]] וידועה כמערכת האסימטרית המהירה והיעילה ביותר נכון לשנת 2016. למרות היותו בתהליך תיקנון Std 1363.1 של [[IEEE]] וכן X9.98 של [[ASC]], בשל [[קריפטואנליזה]] שלו ביטחונו אינו ברור והוא מוטל בספק. קיימת גרסה אחת של Damien Stehlé ו- Ron Steinfeld שנמצאת בתהליך תקנון וניתנת להוכחה כבטוחה לפי המודל הסטנדרטי, היא פחות יעילה ומסתמכת על [[R-LWE]]{{הערה|[https://www.iacr.org/archive/eurocrypt2011/66320027/66320027.pdf Making NTRU as Secure as Worst-Case Problems over Ideal Lattices]}}.


==היסטוריה==
==היסטוריה==
שורה 6: שורה 6:
שם הצופן הוא קיצור של Nth Degree Truncated Polynomial Ring Units כלומר [[חוג הפולינומים]] ממעלה <math>N-1</math> או בסימון מתמטי: <math>R[x]/(x^N-1)</math>. השם מבוטא: "אֶנְטרוּ".
שם הצופן הוא קיצור של Nth Degree Truncated Polynomial Ring Units כלומר [[חוג הפולינומים]] ממעלה <math>N-1</math> או בסימון מתמטי: <math>R[x]/(x^N-1)</math>. השם מבוטא: "אֶנְטרוּ".


ב-2013 פותחה גרסה של NTRU{{הערה|[https://eprint.iacr.org/2013/004 Making NTRUEncrypt and NTRUSign as Secure as Standard Worst-Case Problems over Ideal Lattices]}} המוכחת כבטוחה ואשר נחקרת על ידי קבוצות המחקר של [[IEEE]] ופרויקט PQCYPTO כמועמדת "פוסט-קוונטית" להחלפת האלגוריתמים התיקניים הנמצאים בשימוש מסחרי. ב-2016 הציעו [[דניאל ברנשטיין]] וחוקרים נוספים את NTRU Prime{{הערה|[https://ntruprime.cr.yp.to/ntruprime-20160511.pdf NTRU Prime]}} שהוא שיפור של NTRU המתמקד ב[[חוג פולינומים]] של המערכת ואמור לספק עמידות נגד קריפטואנליזה שמנצלת חולשות הנובעות ממבנה החוג.
ב-2013 פותחה גרסה של NTRU{{הערה|[https://eprint.iacr.org/2013/004 Making NTRUEncrypt and NTRUSign as Secure as Standard Worst-Case Problems over Ideal Lattices]}} המוכחת כבטוחה ואשר נחקרת על ידי קבוצות המחקר של [[IEEE]] ופרויקט PQCRYPTO כמועמדת "פוסט-קוונטית" להחלפת האלגוריתמים התיקניים הנמצאים בשימוש מסחרי. ב-2016 הציעו [[דניאל ברנשטיין]] וחוקרים נוספים את NTRU Prime{{הערה|[https://ntruprime.cr.yp.to/ntruprime-20160511.pdf NTRU Prime]}} שהוא שיפור של NTRU המתמקד ב[[חוג פולינומים]] של המערכת ואמור לספק עמידות נגד קריפטואנליזה שמנצלת חולשות הנובעות ממבנה החוג.


בהשוואת ביצועים לעומת [[RSA]] ו-[[הצפנה מבוססת עקום אליפטי|ECC]] למשל (ראה טבלה), נמצא ש-NTRU מציגה תוצאות טובות בהרבה{{הערה|[http://homes.esat.kuleuven.be/~fvercaut/papers/ntru_gpu.pdf Speed records for NTRU]}}. זמן הביצוע של הפעולות הפרטיות בצד המקבל אינו גדל באופן ריבועי כמו ב-RSA. בניסויים שנעשו NTRU השיגה זמן ביצוע בחומרה של כ-200,000 הצפנות לשנייה ברמת ביטחון של 256 סיביות.
בהשוואת ביצועים לעומת [[RSA]] ו-[[הצפנה מבוססת עקום אליפטי|ECC]] למשל (ראה טבלה), נמצא ש-NTRU מציגה תוצאות טובות בהרבה{{הערה|[http://homes.esat.kuleuven.be/~fvercaut/papers/ntru_gpu.pdf Speed records for NTRU]}}. זמן הביצוע של הפעולות הפרטיות בצד המקבל אינו גדל באופן ריבועי כמו ב-RSA. בניסויים שנעשו NTRU השיגה זמן ביצוע בחומרה של כ-200,000 הצפנות לשנייה ברמת ביטחון של 256 סיביות.
שורה 28: שורה 28:


==רקע מתמטי==
==רקע מתמטי==
הצפנת NTRU{{הערה|1= [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.182.9999&rep=rep1&type=pdf An Introduction to Mathematical Cryptography, פרק 6 - Lattices and Cryptography, עמוד 392]}} משתמשת בטכניקת ערבוב המבוססת על [[מבנה אלגברי|אלגברה]] ב[[חוג הפולינומים]] והאינטראקציה שלה עם [[חשבון מודולרי]] ואילו הפענוח הוא הפעולה ההפוכה כלומר שחזור פעולת הערבוב במידה מסוימת בסיוע [[תורת ההסתברות]]. בדומה ל-[[GGH]] ביטחון מערכת ההצפנה NTRU נשען במידה ניכרת על הבעיה הקשה שבמציאת הווקטור הקרוב ביותר ב[[תורת הסריגים]] בקיצור [[בעיית הוקטור הקצר ביותר|SVP]]. מערכת זו נכללת בקטגוריה [[הצפנה הסתברותית]], שפירושה שהיא כוללת אלמנט אקראי שונה בכל הצפנה. מה שמייחד אותה היא העובדה שההצפנה והפענוח הם ב[[סיבוכיות]] של <math>O(N^2)</math> פעולות עבור בלוק מסר בגודל <math>N</math> בהשוואה ל-[[RSA]] שדורשת <math>N^3</math> פעולות לפחות. אורך המפתח הוא <math>O(N)</math> והוא קטן במידה ניכרת בהשוואה לשיטות דומות כמו [[הצפנת מקאליס]] או [[GGH]].
הצפנת NTRU{{הערה|1= [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.182.9999&rep=rep1&type=pdf An Introduction to Mathematical Cryptography, פרק 6 - Lattices and Cryptography, עמוד 392]}} משתמשת בטכניקת ערבוב המבוססת על [[מבנה אלגברי|אלגברה]] ב[[חוג הפולינומים]] והאינטראקציה שלה עם [[חשבון מודולרי]] ואילו הפענוח הוא הפעולה ההפוכה כלומר שחזור פעולת הערבוב במידה מסוימת בסיוע [[תורת ההסתברות]]. בדומה ל-[[GGH]] ביטחון מערכת ההצפנה NTRU נשען במידה ניכרת על הבעיה הקשה שבמציאת הווקטור הקרוב ביותר ב[[הצפנה מבוססת סריג|תורת הסריגים]] בקיצור [[בעיית הווקטור הקצר ביותר|SVP]]. מערכת זו נכללת בקטגוריה [[הצפנה הסתברותית]], שפירושה שהיא כוללת אלמנט אקראי שונה בכל הצפנה. מה שמייחד אותה היא העובדה שההצפנה והפענוח הם ב[[סיבוכיות]] של <math>O(N^2)</math> פעולות עבור בלוק מסר בגודל <math>N</math> בהשוואה ל-[[RSA]] שדורשת <math>N^3</math> פעולות ביישום רגיל לא ממוטב. אורך המפתח הוא <math>O(N)</math> והוא קטן במידה ניכרת בהשוואה לשיטות דומות כמו [[הצפנת מקאליס]] או GGH.


הגרסה המקורית של NTRU כוללת ארבעה פרמטרים בסיסיים <math>(N,p,q,d)</math> וכן ארבע קבוצות פולינומים <math>\mathcal{L}_f,\mathcal{L}_g,\mathcal{L}_{\phi},\mathcal{L}_m</math> ממעלה <math>N-1</math> עם מקדמים שלמים המייצגים את טווח המפתח הפרטי והציבורי, טווח האלמנט האקראי וטווח המסר בהתאמה (מפורטים בהמשך). <math>N</math> הוא [[מספר ראשוני]] ונקרא כאן פרמטר ביטחון והוא קובע את רמת הביטחון של המערכת בהתאם לדרישה, <math>d</math> מציין את מספר המקדמים החיוביים והשליליים (מפורט בהמשך). <math>p</math> ו-<math>q</math> נקראים מודולוס ומשמשים לצמצום המקדמים. הם לא חייבים להיות ראשוניים אך נדרש שיתקיים <math>\text{gcd}(p,q)=\text{gcd}(N,q)=1</math> (כאשר <math>\text{gcd}</math> היא פונקציית [[מכנה משותף מינימלי]]). וכן <math>q</math> צריך להיות גדול משמעותית מ-<math>p</math> למשל <math>q>(6d+1)p</math> (אם כי זה לא הכרחי ומסיבות של יעילות רצוי <math>q</math> פחות גדול). הפעולות של הצופן הן ב[[חוג הפולינומים]] <math>R=\mathbb{Z}[X]/(X^N-1)</math>. האלמנט <math>F\in R</math> הוא פולינום המיוצג על ידי הווקטור:
הגרסה המקורית של NTRU כוללת ארבעה פרמטרים בסיסיים <math>(N,p,q,d)</math> וכן ארבע קבוצות פולינומים <math>\mathcal{L}_f,\mathcal{L}_g,\mathcal{L}_{\phi},\mathcal{L}_m</math> ממעלה <math>N-1</math> עם מקדמים שלמים המייצגים את טווח המפתח הפרטי והציבורי, טווח האלמנט האקראי וטווח המסר בהתאמה (מפורטים בהמשך). <math>N</math> הוא [[מספר ראשוני]] ונקרא כאן פרמטר ביטחון והוא קובע את רמת הביטחון של המערכת בהתאם לדרישה, <math>d</math> מציין את מספר המקדמים החיוביים והשליליים (מפורט בהמשך). <math>p</math> ו-<math>q</math> נקראים מודולוס ומשמשים לצמצום המקדמים. הם לא חייבים להיות ראשוניים אך נדרש שיתקיים <math>\text{gcd}(p,q)=\text{gcd}(N,q)=1</math> (כאשר <math>\text{gcd}</math> היא פונקציית [[מכנה משותף מינימלי]]). וכן <math>q</math> צריך להיות גדול משמעותית מ-<math>p</math> למשל <math>q>(6d+1)p</math> (אם כי זה לא הכרחי ומסיבות של יעילות רצוי <math>q</math> פחות גדול). הפעולות של הצופן הן ב[[חוג הפולינומים]] <math>R=\mathbb{Z}[X]/(X^N-1)</math>. האלמנט <math>F\in R</math> הוא פולינום המיוצג על ידי הווקטור:
<center>
<center>
:<math>F=\sum_{i=0}^{N-1}F_ix^i</math> או בקיצור <math>[F_0,F_1,...,F_{N-1}]</math>.
:<math>F=\sum_{i=0}^{N-1}F_ix^i</math> או בכתיב מקוצר <math>[F_0,F_1,...,F_{N-1}]</math>.
</center>
</center>
כאן מכפלת שני פולינומים (וקטורים ב-<math>R</math>) מיוצגת על ידי הסימן <math>\circledast</math>. היא נקראת גם [[קונוולוציה מעגלית]] והיא מוגדרת כך:
כאן מכפלת שני פולינומים (וקטורים ב-<math>R</math>) מיוצגת על ידי הסימן <math>\circledast</math>. היא נקראת גם [[קונבולוציה#קונבולוציה מעגלית|קונבולוציה מעגלית]] והיא מוגדרת כך:
<center>
<center>
:<math>F\circledast G=H\text{ and }H_k=\sum_{i=0}^{k}F_iG_{k-i}+\sum_{i=k+1}^{N-1}F_iG_{N+k-i}=\sum_{i+j\equiv k\text{ (mod }N)}F_iG_j</math>.
:<math>F\circledast G=H\text{ and }H_k=\sum_{i=0}^{k}F_iG_{k-i}+\sum_{i=k+1}^{N-1}F_iG_{N+k-i}=\sum_{i+j\equiv k\text{ (mod }N)}F_iG_j</math>.
שורה 44: שורה 44:
:<math>f(x)=x^{10}+x^8-x^3+x^2-1\in\mathcal{T}(3,2)</math>.
:<math>f(x)=x^{10}+x^8-x^3+x^2-1\in\mathcal{T}(3,2)</math>.
</center>
</center>
קיים מיפוי טבעי (הומומורפי) בין האלמנטים בחוג <math>R</math> לבין אלמנטים מהחוג <math>R_q</math> (מודולו <math>q</math>) המיפוי הוא פשוט צמצום המקדמים מודולו <math>q</math>. לפעמים דרוש מעבר בכיוון ההפוך, כלומר אם <math>a(x)\in R_q</math> הוא פולינום, אפשר לבצע "הגבהה" או "מירכוז" (center lift) שלו כך שיתקבל פולינום <math>a'(x)\in R</math> המקיים <math>a'(x)\text{ mod }q=a(x)</math>, בוחרים את המקדמים באופן כזה שהם יהיו בטווח:
קיים מיפוי טבעי (הומומורפי) בין האלמנטים בחוג <math>R</math> לבין אלמנטים מהחוג <math>R_q</math> (מודולו <math>q</math>) המיפוי הוא פשוט צמצום המקדמים מודולו <math>q</math>. לפעמים דרוש מעבר בכיוון ההפוך, כלומר אם <math>a(x)\in R_q</math> הוא פולינום, אפשר לבצע "הגבהה" או "מרכוז" (center lift) שלו כך שיתקבל פולינום <math>a'(x)\in R</math> המקיים <math>a'(x)\text{ mod }q=a(x)</math>, בוחרים את המקדמים באופן כזה שהם יהיו בטווח:
:<math>-\frac{q}{2}<a_i'\le \frac{q}{2}</math>
:<math>-\frac{q}{2}<a_i'\le \frac{q}{2}</math>


שורה 50: שורה 50:


==תיאור האלגוריתם==
==תיאור האלגוריתם==
תיאור הפונקציה '''NTRUencrypt'''. להכנה המקבל '''בוב''' מכין בסוד שני פולינומים טרינאריים <math>f,g\in\mathcal{L}_g</math>. הפולינום <math>f</math> חייב להיות [[הופכי כפלי מודולרי|הפיך]] מודולו <math>p</math> ומודולו <math>q</math>. לכן הוא נבחר בצורה <math>\mathcal{T}(d+1,d)</math> אחרת לא יהיו לו הופכיים. חישוב ההופכי שלו נעשה עם [[אלגוריתם אוקלידס#אלגוריתם אוקלידס המורחב|אלגוריתם אוקלידס המורחב]]. ההופכיים שלו מסומנים כאן <math>f_p^{-1}</math> ו-<math>f_q^{-1}</math> כאשר מתקיים כרגיל:
תיאור הפונקציה '''NTRUencrypt'''. להכנה המקבל '''בוב''' מכין בסוד שני פולינומים טרינאריים <math>f,g\in\mathcal{L}_g</math>. הפולינום <math>f</math> חייב להיות [[הופכי כפלי מודולרי|הפיך]] מודולו <math>p</math> ומודולו <math>q</math>. לכן הוא נבחר בצורה <math>\mathcal{T}(d+1,d)</math> (במקרה של <<math>\mathcal{T}(d,d)</math> לפולינום אף פעם אין הופכי ב<math>R_q</math>). חישוב ההופכי שלו נעשה עם [[אלגוריתם אוקלידס#אלגוריתם אוקלידס המורחב|אלגוריתם אוקלידס המורחב]]. ההופכיים שלו מסומנים כאן <math>f_p^{-1}</math> ו-<math>f_q^{-1}</math> כאשר מתקיים כרגיל:
<center>
<center>
:<math>f_q^{-1}\circledast f\equiv 1\text{ (mod }q), \ \ \ f_p^{-1}\circledast f\equiv 1\text{ (mod }p)</math>.
:<math>f_q^{-1}\circledast f\equiv 1\text{ (mod }q), \ \ \ f_p^{-1}\circledast f\equiv 1\text{ (mod }p)</math>.
שורה 56: שורה 56:
לאחר מכן בוב מחשב את מכפלת הפולינומים: <math>h\equiv f_q^{-1}\circledast g\text{ (mod }q)</math>.
לאחר מכן בוב מחשב את מכפלת הפולינומים: <math>h\equiv f_q^{-1}\circledast g\text{ (mod }q)</math>.


המפתח הציבורי של בוב הוא <math>h</math> אותו הוא שולח לאליס בערוץ פתוח כלשהו (כמובן כמו בכל מערכת הצפנה חלה החובה לאמתו). המפתח הפרטי הוא הפולינום <math>f</math> (וכן ההופכיים שלו כאמור) והוא נשמר בסוד. הפולינום <math>g</math> אינו נחוץ להצפנה ופענוח ולכן יש להשמידו.
המפתח הציבורי של בוב הוא <math>h</math> אותו הוא שולח לאליס בערוץ פתוח כלשהו (כמו בכל מערכת הצפנה חלה החובה לאמתו). המפתח הפרטי הוא הפולינום <math>f</math> (וכן ההופכיים שלו כאמור) והוא נשמר בסוד. הפולינום <math>g</math> אינו נחוץ להצפנה ופענוח ולכן יש להשמידו.


===הצפנה===
===הצפנה===
שורה 90: שורה 90:


==חתימה דיגיטלית==
==חתימה דיגיטלית==
הרעיון של האלגוריתם '''NTRUsign''' הוא שהחתימה היא הוכחה שהחותם יכול פתור את בעיית הוקטור הקצר ביותר (SVP) בסריג NTRU של הנקודה המיוצגת על ידי המסמך או תמצית שלו. המפתח הפרטי (מפתח החתימה) שלו הוא בסיס קצר של הסריג NTRU והמפתח הציבורי (מפתח האימות) הוא בסיס הרבה יותר ארוך. המוודא יכול בקלות לראות שאכן החתימה היא באמת וקטור קרוב ביותר למסמך. אך עם המפתח הציבורי המוודא אינו יכול בעצמו או שזה קשה מאוד עבורו למצוא וקטור קרוב.
הרעיון של האלגוריתם '''NTRUsign''' הוא שהחתימה היא הוכחה שהחותם יכול פתור את בעיית הווקטור הקצר ביותר (SVP) בסריג NTRU של הנקודה המיוצגת על ידי המסמך או תמצית שלו. המפתח הפרטי (מפתח החתימה) שלו הוא בסיס קצר של הסריג NTRU והמפתח הציבורי (מפתח האימות) הוא בסיס הרבה יותר ארוך. המוודא יכול בקלות לראות שאכן החתימה היא באמת וקטור קרוב ביותר למסמך. אך עם המפתח הציבורי המוודא אינו יכול בעצמו או שזה קשה מאוד עבורו למצוא וקטור קרוב.


מאז המצאתו והצגתו ביורוקריפט 2001, אלגוריתם החתימה NTRUSign סובל מהיסטוריה של בעיות וכשלים רבים ובוצעו מספר תיקונים ותוספות טלאים. תחילה גילו Craig Gentry ו-Mike Szydlo{{הערה|[http://www.szydlo.com/ntru-revised-full02.pdf Cryptanalysis of the Revised NTRU Signature Scheme]}} בגרסה המקורית תקלה חמורה, עותקים של החתימה הדיגיטלית חושפים מידע לגבי המפתח הפרטי. המפתחים תקנו את הבעיה ופרסמו אלגוריתם משופר וכן הצעה לתקן R-NSS. ב-2006 פרסמו [[עודד רגב]] ו-Phong Nguyen
מאז המצאתו והצגתו ביורוקריפט 2001, אלגוריתם החתימה NTRUSign סובל מהיסטוריה של בעיות וכשלים רבים ובוצעו מספר תיקונים ותוספות טלאים. תחילה גילו Craig Gentry ו-Mike Szydlo{{הערה|[http://www.szydlo.com/ntru-revised-full02.pdf Cryptanalysis of the Revised NTRU Signature Scheme]}} בגרסה המקורית תקלה חמורה, עותקים של החתימה הדיגיטלית חושפים מידע לגבי המפתח הפרטי. המפתחים תקנו את הבעיה ופרסמו אלגוריתם משופר וכן הצעה לתקן R-NSS. ב-2006 פרסמו [[עודד רגב (מדען מחשב)|עודד רגב]] ו-Phong Nguyen
קריפטואנליזה{{הערה|[ftp://ftp.di.ens.fr/pub/users/pnguyen/FullLEARNING.pdf Learning a Parallelepiped: Cryptanalysis of GGH and NTRU Signatures]}} של חתימת NTRU המאפשרת לחשוף את המפתח הפרטי בזמן מאוד קצר תוך שימוש ב-400 חתימות בלבד. הפתרון שהוצע היה "הסטה" (perturbation) כלומר החותם מסיט את הנקודה המייצגת את המסר על ידי וקטור סודי קצר. שוב נמצא שהתיקון לא שיפר בהרבה את המצב, בהתקפה שפורסמה{{הערה|[http://www.di.ens.fr/~ducas/NTRUSign_Cryptanalysis/DucasNguyen_Learning.pdf Learning a Zonotope and More: Cryptanalysis of NTRUSign Countermeasures]}} אפשר לחשוף את המפתח הפרטי עם 300,000 חתימות בלבד. נכון לשנת 2016 לא ברור אם האלגוריתם ראוי לשימוש במתכונתו הנוכחית למרות התיקונים והטלאים שנוספו.
קריפטואנליזה{{הערה|[ftp://ftp.di.ens.fr/pub/users/pnguyen/FullLEARNING.pdf Learning a Parallelepiped: Cryptanalysis of GGH and NTRU Signatures]}} של חתימת NTRU המאפשרת לחשוף את המפתח הפרטי בזמן מאוד קצר תוך שימוש ב-400 חתימות בלבד. הפתרון שהוצע היה "הסטה" (perturbation) כלומר החותם מסיט את הנקודה המייצגת את המסר על ידי וקטור סודי קצר. שוב נמצא שהתיקון לא שיפר בהרבה את המצב, בהתקפה שפורסמה{{הערה|[http://www.di.ens.fr/~ducas/NTRUSign_Cryptanalysis/DucasNguyen_Learning.pdf Learning a Zonotope and More: Cryptanalysis of NTRUSign Countermeasures]}} אפשר לחשוף את המפתח הפרטי עם 300,000 חתימות בלבד. נכון לשנת 2016 לא ברור אם האלגוריתם ראוי לשימוש במתכונתו הנוכחית למרות התיקונים והטלאים שנוספו.


===תיאור האלגוריתם===
===תיאור האלגוריתם===
תחילה החותם בוב בוחר פרמטרים מתאימים <math>(N,q,d)</math> באופן כזה שבעיית הוקטור הקצר תהיה קשה לפתרון בסריג בעל מימד <math>2N</math> מודולו <math>q</math>. כמפתח הסודי הוא בוחר שני פולינומים טרינאריים <math>f(x)</math> ו-<math>g(x)</math> מהצורה <math> \mathcal{T}(d+1,d)</math> ומחשב את המפתח הציבורי <math>h(x)=f(x)^{-1}\circledast g(x)\text{ (mod }q)</math> בדיוק כמו בתהליך ההכנה של הצפנת NTRU. את <math>h(x)</math> הוא שולח כמפתח אימות לאליס ושומר בסוד את כל היתר.
תחילה החותם בוב בוחר פרמטרים מתאימים <math>(N,q,d)</math> באופן כזה שבעיית הווקטור הקצר תהיה קשה לפתרון בסריג בעל מימד <math>2N</math> מודולו <math>q</math>. כמפתח הסודי הוא בוחר שני פולינומים טרינאריים <math>f(x)</math> ו-<math>g(x)</math> מהצורה <math> \mathcal{T}(d+1,d)</math> ומחשב את המפתח הציבורי <math>h(x)=f(x)^{-1}\circledast g(x)\text{ (mod }q)</math> בדיוק כמו בתהליך ההכנה של הצפנת NTRU. את <math>h(x)</math> הוא שולח כמפתח אימות לאליס ושומר בסוד את כל היתר.


כדי לחתום על מסמך <math>D=(d_1,d_2)</math> (המסמך מחולק לשני פולינומים שווים), תחילה באמצעות אלגוריתם אוקלידס המורחב מחשב שני פולינומים נוספים <math>F(x),G(x)</math> שנקראים "חצי בסיס משלים" לסריג NTRU כך שמתקיים <math>f(x)\circledast G(x)-g(x)\circledast F(x)=q</math>. ומחשב את שני הוקטורים:
כדי לחתום על מסמך <math>D=(d_1,d_2)</math> (המסמך מחולק לשני פולינומים שווים), תחילה באמצעות אלגוריתם אוקלידס המורחב מחשב שני פולינומים נוספים <math>F(x),G(x)</math> שנקראים "חצי בסיס משלים" לסריג NTRU כך שמתקיים <math>f(x)\circledast G(x)-g(x)\circledast F(x)=q</math>. ומחשב את שני הווקטורים:
:<math>v_1(x)=\left\lfloor\frac{d_1(x)\circledast G(x)-d_2(x)\circledast F(x)}{q}\right\rceil</math>
:<math>v_1(x)=\left\lfloor\frac{d_1(x)\circledast G(x)-d_2(x)\circledast F(x)}{q}\right\rceil</math>
:<math>v_2(x)=\left\lfloor\frac{d_1(x)\circledast g(x)-d_2(x)\circledast f(x)}{q}\right\rceil</math>
:<math>v_2(x)=\left\lfloor\frac{d_1(x)\circledast g(x)-d_2(x)\circledast f(x)}{q}\right\rceil</math>


כאשר הסימון <math>\left\lfloor p(x)\right\rceil</math> מייצג פולינום עם מקדמים המעוגלים לשלם הקרוב ביותר. החתימה של בוב על המסמך <math>d(x)</math> היא: <math>s(x)=v_1(x)\circledast f(x)+v_2(x)\circledast F(x)</math>. את החתימה <math>(D, s)</math> הוא שולח לאליס.
כאשר הסימון <math>\left\lfloor p(x)\right\rceil</math> מייצג פולינום עם מקדמים המעוגלים לשלם הקרוב ביותר. החתימה של בוב על המסמך <math>d(x)</math> היא: <math>s(x)=v_1(x)\circledast f(x)+v_2(x)\circledast F(x)</math>. את החתימה והמסמך <math>(D, s)</math> הוא שולח לאליס.


המקבלת אליס המעוניינת לוודא את חתימתו של בוב משתמשת במפתח הציבורי שלו <math>h(x)</math> כדי לחשב את:
המקבלת אליס המעוניינת לוודא את חתימתו של בוב משתמשת במפתח הציבורי שלו <math>h(x)</math> כדי לחשב את:
:<math>t(x)=h(x)\circledast s(x)\text{ (mod }q)</math>.
:<math>t(x)=h(x)\circledast s(x)\text{ (mod }q)</math>.


היא בוחרת את המקדמים שלו מודולו <math>q</math> כך שיהיו קרובים ככל האפשר למקדמים המקבילים של המסמך <math>d(x)</math> ומוודא שהוקטור <math>(s,t)</math> אכן קרוב למסמך <math>d_1,d_2</math> (כאמור קל לוודא זאת אך קשה למצוא וקטור כזה, מסיבה זו אליס עצמה או כל אחד אחר לא יוכל לחתום על המסמך מבלי שהדבר יתגלה כתרמית ללא המפתח הפרטי המתאים, כיוון שבהסתברות גבוהה מאוד התוצאה תהיה וקטור רחוק למדי).
היא בוחרת את המקדמים שלו מודולו <math>q</math> כך שיהיו קרובים ככל האפשר למקדמים המקבילים של המסמך <math>d(x)</math> ומוודא שהווקטור <math>(s,t)</math> אכן קרוב למסמך <math>d_1,d_2</math> (כאמור קל לוודא זאת אך קשה למצוא וקטור כזה, מסיבה זו אליס עצמה או כל אחד אחר לא יוכל לחתום על המסמך מבלי שהדבר יתגלה כתרמית ללא המפתח הפרטי המתאים, כיוון שבהסתברות גבוהה מאוד התוצאה תהיה וקטור רחוק למדי).


==ביטחון==
==ביטחון==
*כדי לשבור את הצופן המתקיף יכול לנסות כמה דרכים. בשיטת [[כוח גס]] המתקיף יכול לנסות לנחש את המפתח הפרטי על ידי ניסוי כל האפשרויות של <math>f\in\mathcal{L}_f</math> ובדיקה אם המכפלה <math>f\circledast h</math> מודולו <math>q</math> מכילה כניסות קטנות. באותה שיטה אפשר לנסות לנחש את המסר. בעיקרון סודיות המפתח תלויה בגודל הקבוצה <math>\mathcal{L}_g</math> וביטחון מסר מוצפן ב-<math>\mathcal{L}_{\phi}</math>.
*כדי לשבור את הצופן המתקיף יכול לנסות כמה דרכים. בשיטת [[כוח גס]] המתקיף יכול לנסות לנחש את המפתח הפרטי על ידי ניסוי כל האפשרויות של <math>f\in\mathcal{L}_f</math> ובדיקה אם המכפלה <math>f\circledast h</math> מודולו <math>q</math> מכילה כניסות קטנות. באותה שיטה אפשר לנסות לנחש את המסר. בעיקרון סודיות המפתח תלויה בגודל הקבוצה <math>\mathcal{L}_g</math> וביטחון מסר מוצפן ב-<math>\mathcal{L}_{\phi}</math>.
*אם זיכרון זמין [[התקפת ניפגש באמצע]] מאפשרת לקצר את זמן הניחוש של המפתח הפרטי בפקטור ריבועי. מחלקים את <math>f</math> לשני חצאים נניח <math>f=(f_1,f_2)</math> ואז משווים זוגות שונים של <math>f_1\circledast c</math> ו-<math>-f_2\circledast c</math> כן שמקדמיהם בעלי ערך דומה בקירוב. החיפוש מתבצע עם טבלה המכילה רשימה ממויינת של החצי האחד והחיפוש מתבצע על החצי השני עד שנמצא מועמד טוב. לאור זאת הטווח או מספר האלמנטים בקבוצה צריך להיות כפול כדי להגיע לרמת ביטחון נדרשת. לדוגמה עבור ביטחון מינימלי בסטנדרטים של ימינו <math>2^{80}</math> הטווח של <math>f</math>, <math>g</math> ו-<math>\phi</math> צריך להיות בסביבות <math>2^{160}</math>.
*אם זיכרון זמין [[התקפת ניפגש באמצע]] מאפשרת לקצר את זמן הניחוש של המפתח הפרטי בפקטור ריבועי. מחלקים את <math>f</math> לשני חצאים נניח <math>f=(f_1,f_2)</math> ואז משווים זוגות שונים של <math>f_1\circledast c</math> ו-<math>-f_2\circledast c</math> כן שמקדמיהם בעלי ערך דומה בקירוב. החיפוש מתבצע עם טבלה המכילה רשימה ממוינת של החצי האחד והחיפוש מתבצע על החצי השני עד שנמצא מועמד טוב. לאור זאת הטווח או מספר האלמנטים בקבוצה צריך להיות כפול כדי להגיע לרמת ביטחון נדרשת. לדוגמה עבור ביטחון מינימלי בסטנדרטים של ימינו <math>2^{80}</math> הטווח של <math>f</math>, <math>g</math> ו-<math>\phi</math> צריך להיות בסביבות <math>2^{160}</math>.
*אם אליס מצפינה מסרים רבים (נגיד ארבעה או חמשה) עם אותו מפתח ציבורי אך עם מספר אקראי שונה עבור כל מסר כנדרש, המתקיף יכול לנצל נתון זה כדי לשבור את המערכת ולנחש את המסר כדלהלן: נניח שאליס הצפינה את <math>c_i=\phi_i\circledast h + m\text{ (mod }q)</math> בסך הכול <math>r</math> פעמים עם <math>r</math> ערכי <math>\phi</math> שונים. המתקיפה איב יכולה לחשב את <math>(c_i-c_1)\circledast h^{-1}</math> ומתקבל <math>\phi_i-\phi_1</math> עבור <math>1\le i\le r</math>. היות שהמקדמים של <math>\phi_i</math> קטנים למעשה היא מקבלת בהסתברות גבוהה את <math>\phi_i-\phi_1</math> ממנו היא יכולה לגלות מקדמים רבים של <math>\phi_1</math> ואת היתר היא יכולה לנחש בכוח גס. אם <math>\phi_1</math> ידוע אפשר לגלות את <math>m</math>. מסיבה זו הצפנה חוזרת של מסר נתון אינה מומלצת מבלי להסתיר את המסר על ידי פעולת ערבוב נוספת כלשהי. כמובן שההתקפה המתוארת יעילה רק עבור מסר אחד ואין בה כדי לסייע בפענוח מסרים אחרים.
*אם אליס מצפינה מסרים רבים (נגיד ארבעה או חמישה) עם אותו מפתח ציבורי אך עם מספר אקראי שונה עבור כל מסר כנדרש, המתקיף יכול לנצל נתון זה כדי לשבור את המערכת ולנחש את המסר כדלהלן: נניח שאליס הצפינה את <math>c_i=\phi_i\circledast h + m\text{ (mod }q)</math> בסך הכול <math>r</math> פעמים עם <math>r</math> ערכי <math>\phi</math> שונים. המתקיפה איב יכולה לחשב את <math>(c_i-c_1)\circledast h^{-1}</math> ומתקבל <math>\phi_i-\phi_1</math> עבור <math>1\le i\le r</math>. היות שהמקדמים של <math>\phi_i</math> קטנים למעשה היא מקבלת בהסתברות גבוהה את <math>\phi_i-\phi_1</math> ממנו היא יכולה לגלות מקדמים רבים של <math>\phi_1</math> ואת היתר היא יכולה לנחש בכוח גס. אם <math>\phi_1</math> ידוע אפשר לגלות את <math>m</math>. מסיבה זו הצפנה חוזרת של מסר נתון אינה מומלצת מבלי להסתיר את המסר על ידי פעולת ערבוב נוספת כלשהי עם אקראיות. כמובן שההתקפה המתוארת יעילה רק עבור מסר אחד ואין בה כדי לסייע בפענוח מסרים אחרים.
*בעיית חישוב המפתח הפרטי מתוך המפתח הציבורי היא: בהינתן <math>h(x)</math> מצא שני פולינומים טרינאריים <math>f(x)</math> ו-<math>g(x)</math> המקיימים <math>f(x)\circledast g(x)\equiv h(x)\text{ (mod }q)</math>. הוכח שבעייה זו כמעט שקולה לבעיית הוקטור הקצר ביותר במחלקה מיוחדת של סריגים. תיאורטית המתקיף יכול לנסות לשבור את המערכת על ידי ניסיון לפתור את בעיית הווקטור הקצר ביותר. אפשר למצוא וקטור כזה בחיפוש ממצא או עם אלגוריתם [[LLL]] אך סיבוכיות התקפה כזו לרוב אינה מעשית היות שבעיית הווקטור הקצר ביותר ידועה כבעיה קשה מאוד ולא ידוע על פתרון פולינומי.
*בעיית חישוב המפתח הפרטי מתוך המפתח הציבורי היא: בהינתן <math>h(x)</math> מצא שני פולינומים טרינאריים <math>f(x)</math> ו-<math>g(x)</math> המקיימים <math>f(x)\circledast g(x)\equiv h(x)\text{ (mod }q)</math>. הוכח שבעיה זו כמעט שקולה לבעיית הווקטור הקצר ביותר במחלקה מיוחדת של סריגים. תאורטית המתקיף יכול לנסות לשבור את המערכת על ידי ניסיון לפתור את בעיית הווקטור הקצר ביותר. אפשר למצוא וקטור כזה בחיפוש ממצא או עם אלגוריתם [[LLL]] אך סיבוכיות התקפה כזו לרוב אינה מעשית היות שבעיית הווקטור הקצר ביותר ידועה כבעיה קשה מאוד ולא ידוע על פתרון פולינומי.


===בחירת פרמטרים===
===בחירת פרמטרים===
שורה 148: שורה 148:
:<math>f_p^{-1} = f(x)^{-1}\text{ mod }p= x^6+2x^5+x^3+x^2+x+1 \text{ (mod } 3)</math>
:<math>f_p^{-1} = f(x)^{-1}\text{ mod }p= x^6+2x^5+x^3+x^2+x+1 \text{ (mod } 3)</math>


בוב שומר את <math>f(x)</math> ואת ההופכי שלו כמפתח פרטי (או שהוא מחשב את ההופכי מאוחר יותר בעת הצורך).
בוב שומר את <math>f(x)</math> ואת ההופכי שלו <math>f_q^{-1}</math> כמפתח פרטי.


כעת בוב מחשב ומפרסם ברבים את המפתח הציבורי שלו:
כעת בוב מחשב ומפרסם ברבים את המפתח הציבורי שלו:
שורה 161: שורה 161:
:<math>f(x)\circledast c(x)\equiv x^6+10x^5+33x^4+40x^3+40x^2+x+40 \text{ (mod } 41)</math>
:<math>f(x)\circledast c(x)\equiv x^6+10x^5+33x^4+40x^3+40x^2+x+40 \text{ (mod } 41)</math>


ואז מבצע מירכוז (Centerlift) של מקדמי התוצאה מודולו <math>q</math> ומקבל את:
ואז מבצע מרכוז (Centerlift) של מקדמי התוצאה מודולו <math>q</math> ומקבל את:
:<math>a(x) = x^6+10x^5-8x^4-x^3-x^2+x-1</math>
:<math>a(x) = x^6+10x^5-8x^4-x^3-x^2+x-1</math>


שורה 171: שורה 171:


==שיטות מתקדמות==
==שיטות מתקדמות==
הצפנות מבוססות סריגים נכשלו לא אחת בגלל התקפות שניצלו מבנה מיוחד של הסריג למשל ב[[חוג הפולינומים]] או [[שדה (מבנה אלגברי)|שדה]] [[סדר (תורת החבורות)|מסדר]] [[מספר ראשוני|ראשוני]] גבוה. מסיבה זו הוצעו מספר מבנים שונים שנועדו לחזק את המערכת נגד קריפטואנליזה המנצלת חולשות הנובעות ממבנה החוג וכן נגד קרפיטואנליזה קוונטית. כמה מבנים אפשריים הם:
הצפנות מבוססות סריגים נכשלו לא אחת בגלל התקפות שניצלו מבנה מיוחד של הסריג למשל ב[[חוג הפולינומים]] או [[שדה (מבנה אלגברי)|שדה]] [[סדר (תורת החבורות)|מסדר]] [[מספר ראשוני|ראשוני]] גבוה. מסיבה זו הוצעו מספר מבנים שונים שנועדו לחזק את המערכת נגד קריפטואנליזה המנצלת חולשות הנובעות ממבנה החוג וכן נגד קריפטואנליזה קוונטית. כמה מבנים אפשריים הם:
*<math>(\mathbb{Z}/q)[x](x^p-1)</math> כאשר <math>p</math> ראשוני ו-<math>q</math> הוא חזקה של 2 כמו בגרסה המקורית של NTRU.
*<math>(\mathbb{Z}/q)[x](x^p-1)</math> כאשר <math>p</math> ראשוני ו-<math>q</math> הוא חזקה של 2 כמו בגרסה המקורית של NTRU.
*<math>(\mathbb{Z}/q)[x](x^p+1)</math> כאשר <math>p</math> הוא חזקה של 2 ו-<math>q\in1+2p\mathbb{Z}</math> גם ראשוני. מבנה זה הוצע על ידי Damien Stehlé ו-Ron Steinfeld לשיפור NTRU כך שיהיה בעל ביטחון מוכח וכן נמצא בשימוש [[RingLWE]].
*<math>(\mathbb{Z}/q)[x](x^p+1)</math> כאשר <math>p</math> הוא חזקה של 2 ו-<math>q\in1+2p\mathbb{Z}</math> גם ראשוני. מבנה זה הוצע על ידי Damien Stehlé ו-Ron Steinfeld לשיפור NTRU כך שיהיה בעל ביטחון מוכח וכן נמצא בשימוש [[RingLWE]].
*<math>(\mathbb{Z}/q)[x](x^p-x-1)</math> כאשר <math>p</math> ראשוני. הוצע על ידי דניאל ברנשטיין ואחרים כתחליף טוב יותר למבנה החוג ב-NTRU.
*<math>(\mathbb{Z}/q)[x](x^p-x-1)</math> כאשר <math>p</math> ראשוני. הוצע על ידי דניאל ברנשטיין ואחרים כתחליף טוב יותר למבנה החוג ב-NTRU.


ב-2011 הציעו Damien Stehlé ו-Ron Steinfeld גרסה משופרת{{הערה|[https://eprint.iacr.org/2013/004 Making NTRUEncrypt and NTRUSign as Secure as Standard Worst-Case Problems over Ideal Lattices]}} בשינויים קלים של הצפנה/חתימה דיגיטלית NTRU המוכחת כבטוחה נגד [[התקפת מוצפן-נבחר]] במסגרת [[מודל אורקל אקראי]] או [[מודל סיבוכיות סטנדרטי]], תחת הנחת הקושי שבפתרון בעיות סריגים (במחשב קלאסי או קוונטי) עם הגבלה לסוג מסויים של סריגים מעל [[שדה ציקלוטומי]]. הם הראו שאם בוחרים את הפולינומים הסודיים של המקבל כפונקציית [[גאוסיין]] בדידית אז המפתח הציבורי ייראה מבחינה סטטיסטית אחיד ובלתי ניתן להבחנה מעל הטווח שלה. תכונת [[אי-הבחנה]] (indistinguishable) מהיבט קריפטוגרפי פירושה קושי בניחוש המפתח הפרטי מתוך המפתח הציבורי.
ב-2011 הציעו Damien Stehlé ו-Ron Steinfeld גרסה משופרת{{הערה|[https://eprint.iacr.org/2013/004 Making NTRUEncrypt and NTRUSign as Secure as Standard Worst-Case Problems over Ideal Lattices]}} בשינויים קלים של הצפנה/חתימה דיגיטלית NTRU המוכחת כבטוחה נגד [[התקפת מוצפן-נבחר]] במסגרת [[מודל אורקל אקראי]] או מודל [[סיבוכיות]] סטנדרטי, תחת הנחת הקושי שבפתרון בעיות סריגים (במחשב קלאסי או קוונטי) עם הגבלה לסוג מסוים של סריגים מעל [[שדה ציקלוטומי]]. הם הראו שאם בוחרים את הפולינומים הסודיים של המקבל כפונקציית [[גאוסיין]] בדידית אז המפתח הציבורי ייראה מבחינה סטטיסטית אחיד ובלתי ניתן להבחנה מעל הטווח שלה. תכונת [[ביטחון סמנטי#אי-יכולת הבחנה|אי-הבחנה]] בהקשר של מפתח ציבורי פירושה קושי בניחוש המפתח הפרטי מתוך המפתח הציבורי.


בתהליך ההכנה של NTRU. המפתח הפרטי הוא שני פולינומים "דלילים" ממעלה הנמוכה מ-<math>n</math> עם מקדמים <math>\{-1,0,1\}</math>. המפתח הציבורי הוא המנה שלהם בחוג <math>\mathbb{Z}_q[x]/(x^n-1)</math>. בחירת המפתח הפרטי נעשית כפונקצייה גאוסיאנית בדידית באופן כזה שסטיית התקן תהיה בערך <math>q^{1/2}</math>. השינויים שהוצעו לעומת הגרסה המקורית הם כדלהלן:
בתהליך ההכנה של NTRU. המפתח הפרטי הוא שני פולינומים "דלילים" ממעלה הנמוכה מ-<math>n</math> עם מקדמים <math>\{-1,0,1\}</math>. המפתח הציבורי הוא המנה שלהם בחוג <math>\mathbb{Z}_q[x]/(x^n-1)</math>. בחירת המפתח הפרטי נעשית כפונקציה גאוסיאנית בדידית באופן כזה שסטיית התקן תהיה בערך <math>q^{1/2}</math>. השינויים שהוצעו לעומת הגרסה המקורית הם כדלהלן:
# החלפת חוג הפולינומים ב-<math>R=\mathbb{Z}/(x^n+1)</math> כאשר <math>n</math> הוא חזקה של 2. כך מתקבל חוג שלמים מעל שדה ציקלוטומי.
# החלפת חוג הפולינומים ב-<math>R=\mathbb{Z}/(x^n+1)</math> כאשר <math>n</math> הוא חזקה של 2. כך מתקבל חוג שלמים מעל שדה ציקלוטומי.
# <math>q</math> הוא ראשוני כך שמתקיים <math>f=x^n+1</math> מתחלק ל-<math>n</math> גורמים (העתקות לינאריות) שונים מודולו <math>q</math>.
# <math>q</math> הוא ראשוני כך שמתקיים <math>f=x^n+1</math> מתחלק ל-<math>n</math> גורמים ([[העתקה ליניארית|העתקות ליניאריות]]) שונים מודולו <math>q</math>.
# <math>f</math> ו-<math>g</math> נלקחים מתוך דגימה גאוסיאנית דיסקרטית מעל החוג <math>R</math>, בתנאי שהם הפיכים מודולו <math>q</math>. אם הם אינם הפיכים מתעלמים מהדגימה ומנסים דגימה אחרת עד שהתנאי מתקיים. כמו כן <math>f</math> הוא מהצורה <math>f=p\bar f+1</math> כאשר <math>\bar f </math> הוא הדגימה הגאוסיאנית האמורה. התוספת האחרונה מקלה על הפענוח כי אם מתקיים <math>f = 1\text{ mod }p</math> לא צריך את ההכפלה האחרונה בהופכי של <math>f</math>.
# <math>f</math> ו-<math>g</math> נלקחים מתוך דגימה גאוסיאנית דיסקרטית מעל החוג <math>R</math>, בתנאי שהם הפיכים מודולו <math>q</math>. אם הם אינם הפיכים מתעלמים מהדגימה ומנסים דגימה אחרת עד שהתנאי מתקיים. כמו כן <math>f</math> הוא מהצורה <math>f=p\bar f+1</math> כאשר <math>\bar f </math> הוא הדגימה הגאוסיאנית האמורה. התוספת האחרונה מקלה על הפענוח כי אם מתקיים <math>f = 1\text{ mod }p</math> לא צריך את ההכפלה האחרונה בהופכי של <math>f</math>.
# מוסיפים וקטור שגיאה קטן <math>e</math> להצפנה כך שההצפנה כעת היא: <math>c=hs+pe + m\text{ (mod }q)</math>, כאשר <math>e</math> נבחר טווח השגיאה של בעיית [[R-LWE]].
# מוסיפים וקטור שגיאה קטן <math>e</math> להצפנה כך שההצפנה כעת היא: <math>c=hs+pe + m\text{ (mod }q)</math>, כאשר <math>e</math> נבחר טווח השגיאה של בעיית RingLWE.


השינויים הללו מעלים מעט את סיבוכיות ההצפנה לעומת ההצעה המקורית, בעיקר בגלל התוספות האמורות, אך בתמורה מושג שיפור משמעותי בביטחון ההצפנה.
השינויים הללו מעלים מעט את סיבוכיות ההצפנה לעומת ההצעה המקורית, בעיקר בגלל התוספות האמורות, אך בתמורה מושג שיפור משמעותי בביטחון ההצפנה.
שורה 191: שורה 191:
* תקן X9.98 של ASC X9 ([[מכון התקנים האמריקני]]){{הערה|[http://www.businesswire.com/news/home/20110411005309/en/Security-Innovation%E2%80%99s-NTRUEncrypt-Adopted-X9-Standard-Data Security Innovation’s NTRUEncrypt Adopted as X9 Standard for Data Protection]}}.
* תקן X9.98 של ASC X9 ([[מכון התקנים האמריקני]]){{הערה|[http://www.businesswire.com/news/home/20110411005309/en/Security-Innovation%E2%80%99s-NTRUEncrypt-Adopted-X9-Standard-Data Security Innovation’s NTRUEncrypt Adopted as X9 Standard for Data Protection]}}.


בנוסף האלגוריתם הוצע בטיוטת [[IETF]] כמועמד לפרוטוקול [[TLS]]. ב-2009 הוזכר NTRU על ידי [[NIST]] כמועמד אפשרי לאלגוריתם הצפנה אסימטרי פוסט-קוונטי, שיחליף את האלגוריתמים הנוכחיים. במסגרת המאמץ להתכונן לקראת העידן הקוונטי{{הערה|[http://csrc.nist.gov/publications/drafts/nistir-8105/nistir_8105_draft.pdf Report on Post-Quantum Cryptography]}} ב-NIST מתכוונים לפרסם בסוף 2016 תחרות פתוחה{{הערה|[http://csrc.nist.gov/groups/ST/post-quantum-crypto/workshops.html POST-QUANTUM CRYPTO PROJECT]}} שבה יבחנו הצעות לאלגוריתם פוסט-קוונטי.
בנוסף האלגוריתם הוצע בטיוטת [[IETF]] כמועמד לפרוטוקול [[TLS (פרוטוקול)|TLS]]. ב-2009 הוזכר NTRU על ידי [[NIST]] כמועמד אפשרי לאלגוריתם הצפנה אסימטרי פוסט-קוונטי, שיחליף את האלגוריתמים הנוכחיים. במסגרת המאמץ להתכונן לקראת העידן הקוונטי{{הערה|[http://csrc.nist.gov/publications/drafts/nistir-8105/nistir_8105_draft.pdf Report on Post-Quantum Cryptography]}} ב-NIST מתכוונים לפרסם בסוף 2016 תחרות פתוחה{{הערה|[http://csrc.nist.gov/groups/ST/post-quantum-crypto/workshops.html POST-QUANTUM CRYPTO PROJECT]}} שבה יבחנו הצעות לאלגוריתם פוסט-קוונטי.


==יישומים==
==יישומים==
NTRU זמינה כקוד פתוח תחת רישיון GPL ו-FOSS. בתנאי שכל שימוש בו יהיה זמין גם הוא כקוד פתוח. זאת במטרה להסיר מכשולים ולאפשר למפתחים להטמיע את האלגוריתם מהר ככל האפשר. כמו כן האלגוריתם ניתן לשימוש מסחרי תחת רישיון BSD. כיום ישנם ב-[[GitHub]] שני פרויקטי קוד פתוח ב-C וב-Java המיישמים את NTRU; פרויקט NTRU{{הערה|[https://github.com/NTRUOpenSourceProject/ntru-crypto Open Source NTRU Public Key Cryptography and Reference Code]}} תחת רישיון GPL וספריית NTRU{{הערה|[http://tbuktu.github.io/ntru The NTRU Project]}} ברישיון BSD.
NTRU זמינה כקוד פתוח תחת רישיון GPL ו-FOSS. בתנאי שכל שימוש בו יהיה זמין גם הוא כקוד פתוח. זאת במטרה להסיר מכשולים ולאפשר למפתחים להטמיע את האלגוריתם מהר ככל האפשר. כמו כן האלגוריתם ניתן לשימוש מסחרי תחת רישיון BSD. כיום ישנם ב-[[GitHub]] שני פרויקטי קוד פתוח ב-C וב-Java המיישמים את NTRU; פרויקט NTRU{{הערה|[https://github.com/NTRUOpenSourceProject/ntru-crypto Open Source NTRU Public Key Cryptography and Reference Code]}} תחת רישיון GPL וספריית NTRU{{הערה|[http://tbuktu.github.io/ntru The NTRU Project]}} ברישיון BSD.



==ראו גם==
==ראו גם==
שורה 201: שורה 200:
* [[חתימה דיגיטלית]]
* [[חתימה דיגיטלית]]
* [[GGH]]
* [[GGH]]



==הערות שוליים==
==הערות שוליים==
שורה 208: שורה 206:
{{קריפטוגרפיה}}
{{קריפטוגרפיה}}


[[קטגוריה:ערכים שבהם תבנית אתר רשמי אינה מתאימה להוספה אוטומטית]]
[[קטגוריה:הצפנה]]
[[קטגוריה:הצפנה]]
[[קטגוריה:מפתח ציבורי]]
[[קטגוריה:מפתח ציבורי]]

גרסה אחרונה מ־18:15, 1 במאי 2023

NTRU[1] היא מערכת הצפנת מפתח ציבורי וחתימה דיגיטלית מבוססת סריגים מוגנת בפטנט וקוד פתוח ברישיון GPL, שהומצאה ב-1996 והוצעה כתקן חלופי למערכות הקיימות RSA ו-ECC. נכללת ברשימת האלגוריתמים הפוסט-קוונטיים וידועה כמערכת האסימטרית המהירה והיעילה ביותר נכון לשנת 2016. למרות היותו בתהליך תיקנון Std 1363.1 של IEEE וכן X9.98 של ASC, בשל קריפטואנליזה שלו ביטחונו אינו ברור והוא מוטל בספק. קיימת גרסה אחת של Damien Stehlé ו- Ron Steinfeld שנמצאת בתהליך תקנון וניתנת להוכחה כבטוחה לפי המודל הסטנדרטי, היא פחות יעילה ומסתמכת על R-LWE[2].

הגרסה הראשונה הומצאה ב-1996 על ידי Jeffrey Hoffstein ,Joseph Silverman ו- Jill Pipher. מאוחר יותר באותה שנה חברו המפתחים ל-Daniel Lieman ויסדו את חברת NTRU Cryptosystems שנרכשה ב-2009 על ידי Security Innovation[3].

שם הצופן הוא קיצור של Nth Degree Truncated Polynomial Ring Units כלומר חוג הפולינומים ממעלה או בסימון מתמטי: . השם מבוטא: "אֶנְטרוּ".

ב-2013 פותחה גרסה של NTRU[4] המוכחת כבטוחה ואשר נחקרת על ידי קבוצות המחקר של IEEE ופרויקט PQCRYPTO כמועמדת "פוסט-קוונטית" להחלפת האלגוריתמים התיקניים הנמצאים בשימוש מסחרי. ב-2016 הציעו דניאל ברנשטיין וחוקרים נוספים את NTRU Prime[5] שהוא שיפור של NTRU המתמקד בחוג פולינומים של המערכת ואמור לספק עמידות נגד קריפטואנליזה שמנצלת חולשות הנובעות ממבנה החוג.

בהשוואת ביצועים לעומת RSA ו-ECC למשל (ראה טבלה), נמצא ש-NTRU מציגה תוצאות טובות בהרבה[6]. זמן הביצוע של הפעולות הפרטיות בצד המקבל אינו גדל באופן ריבועי כמו ב-RSA. בניסויים שנעשו NTRU השיגה זמן ביצוע בחומרה של כ-200,000 הצפנות לשנייה ברמת ביטחון של 256 סיביות.

דרגת ביטחון NTRU אורך מפתח ECC RSA NTRU פעולות/שנייה ECC RSA
בסיביות רגיל אופטימלי אורך מפתח רגיל אופטימלי פעולות/שנייה
112 5,951 4,411 224 2,048 2,284 10,638 951 156
128 6,743 4,829 256 4,096 1,896 9,901 650 12
192 9,757 6,523 384 7,680 1,034 6,849 285 8
256 12,881 8,173 512 15,360 638 5,000 116 1

חברת Security Innovation מציעה פרסים של עד 90,000 דולר למי שיצליח לפרוץ את אחד ממספרי האתגר מהרשימה שפורסמה[7].

הצפנת NTRU[8] משתמשת בטכניקת ערבוב המבוססת על אלגברה בחוג הפולינומים והאינטראקציה שלה עם חשבון מודולרי ואילו הפענוח הוא הפעולה ההפוכה כלומר שחזור פעולת הערבוב במידה מסוימת בסיוע תורת ההסתברות. בדומה ל-GGH ביטחון מערכת ההצפנה NTRU נשען במידה ניכרת על הבעיה הקשה שבמציאת הווקטור הקרוב ביותר בתורת הסריגים בקיצור SVP. מערכת זו נכללת בקטגוריה הצפנה הסתברותית, שפירושה שהיא כוללת אלמנט אקראי שונה בכל הצפנה. מה שמייחד אותה היא העובדה שההצפנה והפענוח הם בסיבוכיות של פעולות עבור בלוק מסר בגודל בהשוואה ל-RSA שדורשת פעולות ביישום רגיל לא ממוטב. אורך המפתח הוא והוא קטן במידה ניכרת בהשוואה לשיטות דומות כמו הצפנת מקאליס או GGH.

הגרסה המקורית של NTRU כוללת ארבעה פרמטרים בסיסיים וכן ארבע קבוצות פולינומים ממעלה עם מקדמים שלמים המייצגים את טווח המפתח הפרטי והציבורי, טווח האלמנט האקראי וטווח המסר בהתאמה (מפורטים בהמשך). הוא מספר ראשוני ונקרא כאן פרמטר ביטחון והוא קובע את רמת הביטחון של המערכת בהתאם לדרישה, מציין את מספר המקדמים החיוביים והשליליים (מפורט בהמשך). ו- נקראים מודולוס ומשמשים לצמצום המקדמים. הם לא חייבים להיות ראשוניים אך נדרש שיתקיים (כאשר היא פונקציית מכנה משותף מינימלי). וכן צריך להיות גדול משמעותית מ- למשל (אם כי זה לא הכרחי ומסיבות של יעילות רצוי פחות גדול). הפעולות של הצופן הן בחוג הפולינומים . האלמנט הוא פולינום המיוצג על ידי הווקטור:

או בכתיב מקוצר .

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

.

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

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

.

קיים מיפוי טבעי (הומומורפי) בין האלמנטים בחוג לבין אלמנטים מהחוג (מודולו ) המיפוי הוא פשוט צמצום המקדמים מודולו . לפעמים דרוש מעבר בכיוון ההפוך, כלומר אם הוא פולינום, אפשר לבצע "הגבהה" או "מרכוז" (center lift) שלו כך שיתקבל פולינום המקיים , בוחרים את המקדמים באופן כזה שהם יהיו בטווח:

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

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

[עריכת קוד מקור | עריכה]

תיאור הפונקציה NTRUencrypt. להכנה המקבל בוב מכין בסוד שני פולינומים טרינאריים . הפולינום חייב להיות הפיך מודולו ומודולו . לכן הוא נבחר בצורה (במקרה של < לפולינום אף פעם אין הופכי ב). חישוב ההופכי שלו נעשה עם אלגוריתם אוקלידס המורחב. ההופכיים שלו מסומנים כאן ו- כאשר מתקיים כרגיל:

.

לאחר מכן בוב מחשב את מכפלת הפולינומים: .

המפתח הציבורי של בוב הוא אותו הוא שולח לאליס בערוץ פתוח כלשהו (כמו בכל מערכת הצפנה חלה החובה לאמתו). המפתח הפרטי הוא הפולינום (וכן ההופכיים שלו כאמור) והוא נשמר בסוד. הפולינום אינו נחוץ להצפנה ופענוח ולכן יש להשמידו.

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

.

ושולחת את לבוב.

לפענוח בוב משתמש במפתח הפרטי שלו וההופכי שלו כדי לחשב את:

.

המקבל משנה את המקדמים של כך שיהיו בטווח פעולה זו נקראת center-lift. כעת אם מתייחסים ל- כאל פולינום עם מקדמים שלמים בוב יכול לחלץ את המסר על ידי:

.

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

.

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

חתימה דיגיטלית

[עריכת קוד מקור | עריכה]

הרעיון של האלגוריתם NTRUsign הוא שהחתימה היא הוכחה שהחותם יכול פתור את בעיית הווקטור הקצר ביותר (SVP) בסריג NTRU של הנקודה המיוצגת על ידי המסמך או תמצית שלו. המפתח הפרטי (מפתח החתימה) שלו הוא בסיס קצר של הסריג NTRU והמפתח הציבורי (מפתח האימות) הוא בסיס הרבה יותר ארוך. המוודא יכול בקלות לראות שאכן החתימה היא באמת וקטור קרוב ביותר למסמך. אך עם המפתח הציבורי המוודא אינו יכול בעצמו או שזה קשה מאוד עבורו למצוא וקטור קרוב.

מאז המצאתו והצגתו ביורוקריפט 2001, אלגוריתם החתימה NTRUSign סובל מהיסטוריה של בעיות וכשלים רבים ובוצעו מספר תיקונים ותוספות טלאים. תחילה גילו Craig Gentry ו-Mike Szydlo[9] בגרסה המקורית תקלה חמורה, עותקים של החתימה הדיגיטלית חושפים מידע לגבי המפתח הפרטי. המפתחים תקנו את הבעיה ופרסמו אלגוריתם משופר וכן הצעה לתקן R-NSS. ב-2006 פרסמו עודד רגב ו-Phong Nguyen קריפטואנליזה[10] של חתימת NTRU המאפשרת לחשוף את המפתח הפרטי בזמן מאוד קצר תוך שימוש ב-400 חתימות בלבד. הפתרון שהוצע היה "הסטה" (perturbation) כלומר החותם מסיט את הנקודה המייצגת את המסר על ידי וקטור סודי קצר. שוב נמצא שהתיקון לא שיפר בהרבה את המצב, בהתקפה שפורסמה[11] אפשר לחשוף את המפתח הפרטי עם 300,000 חתימות בלבד. נכון לשנת 2016 לא ברור אם האלגוריתם ראוי לשימוש במתכונתו הנוכחית למרות התיקונים והטלאים שנוספו.

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

[עריכת קוד מקור | עריכה]

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

כדי לחתום על מסמך (המסמך מחולק לשני פולינומים שווים), תחילה באמצעות אלגוריתם אוקלידס המורחב מחשב שני פולינומים נוספים שנקראים "חצי בסיס משלים" לסריג NTRU כך שמתקיים . ומחשב את שני הווקטורים:

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

המקבלת אליס המעוניינת לוודא את חתימתו של בוב משתמשת במפתח הציבורי שלו כדי לחשב את:

.

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

  • כדי לשבור את הצופן המתקיף יכול לנסות כמה דרכים. בשיטת כוח גס המתקיף יכול לנסות לנחש את המפתח הפרטי על ידי ניסוי כל האפשרויות של ובדיקה אם המכפלה מודולו מכילה כניסות קטנות. באותה שיטה אפשר לנסות לנחש את המסר. בעיקרון סודיות המפתח תלויה בגודל הקבוצה וביטחון מסר מוצפן ב-.
  • אם זיכרון זמין התקפת ניפגש באמצע מאפשרת לקצר את זמן הניחוש של המפתח הפרטי בפקטור ריבועי. מחלקים את לשני חצאים נניח ואז משווים זוגות שונים של ו- כן שמקדמיהם בעלי ערך דומה בקירוב. החיפוש מתבצע עם טבלה המכילה רשימה ממוינת של החצי האחד והחיפוש מתבצע על החצי השני עד שנמצא מועמד טוב. לאור זאת הטווח או מספר האלמנטים בקבוצה צריך להיות כפול כדי להגיע לרמת ביטחון נדרשת. לדוגמה עבור ביטחון מינימלי בסטנדרטים של ימינו הטווח של , ו- צריך להיות בסביבות .
  • אם אליס מצפינה מסרים רבים (נגיד ארבעה או חמישה) עם אותו מפתח ציבורי אך עם מספר אקראי שונה עבור כל מסר כנדרש, המתקיף יכול לנצל נתון זה כדי לשבור את המערכת ולנחש את המסר כדלהלן: נניח שאליס הצפינה את בסך הכול פעמים עם ערכי שונים. המתקיפה איב יכולה לחשב את ומתקבל עבור . היות שהמקדמים של קטנים למעשה היא מקבלת בהסתברות גבוהה את ממנו היא יכולה לגלות מקדמים רבים של ואת היתר היא יכולה לנחש בכוח גס. אם ידוע אפשר לגלות את . מסיבה זו הצפנה חוזרת של מסר נתון אינה מומלצת מבלי להסתיר את המסר על ידי פעולת ערבוב נוספת כלשהי עם אקראיות. כמובן שההתקפה המתוארת יעילה רק עבור מסר אחד ואין בה כדי לסייע בפענוח מסרים אחרים.
  • בעיית חישוב המפתח הפרטי מתוך המפתח הציבורי היא: בהינתן מצא שני פולינומים טרינאריים ו- המקיימים . הוכח שבעיה זו כמעט שקולה לבעיית הווקטור הקצר ביותר במחלקה מיוחדת של סריגים. תאורטית המתקיף יכול לנסות לשבור את המערכת על ידי ניסיון לפתור את בעיית הווקטור הקצר ביותר. אפשר למצוא וקטור כזה בחיפוש ממצא או עם אלגוריתם LLL אך סיבוכיות התקפה כזו לרוב אינה מעשית היות שבעיית הווקטור הקצר ביותר ידועה כבעיה קשה מאוד ולא ידוע על פתרון פולינומי.

בחירת פרמטרים

[עריכת קוד מקור | עריכה]

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

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

. הפולינום פירושו פולינום טרינארי שמכיל 15 מקדמים חיוביים () ו-14 מקדמים שליליים ().

המפתח הפרטי הוא באורך 340 סיביות והמפתח הציבורי באורך 642 סיביות. דרגת ביטחון של המפתח היא .

אופציה 2. ביטחון בינוני.

המפתח הפרטי באורך 530 סיביות והציבורי 1169 סיביות. רמת ביטחון של .

אופציה 3. ביטחון גבוה.

אורך מפתח פרטי 1595 סיביות וציבורי 4024 סיביות. רמת ביטחון של .

דוגמה במספרים קטנים

[עריכת קוד מקור | עריכה]

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

להכנה בוב בוחר את הפולינומים:

וכן

ומחשב את ההופכיים שלהם:

בוב שומר את ואת ההופכי שלו כמפתח פרטי.

כעת בוב מחשב ומפרסם ברבים את המפתח הציבורי שלו:

נניח שאליס מעוניינת לשלוח לבוב את המסר:

תחילה היא בוחרת מספר אקראי נניח: משתמשת במפתח הציבורי של בוב ומחשבת את:

אותו היא שולחת לבוב. כאשר בוב מקבל את הוא פועל כדלהלן. תחילה מחשב את:

ואז מבצע מרכוז (Centerlift) של מקדמי התוצאה מודולו ומקבל את:

לבסוף מצמצם את מקדמי מודולו ומכפיל בהופכי:

ממרכז (Centerlift) את התוצאה האחרונה מודולו ומקבל את:

שיטות מתקדמות

[עריכת קוד מקור | עריכה]

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

  • כאשר ראשוני ו- הוא חזקה של 2 כמו בגרסה המקורית של NTRU.
  • כאשר הוא חזקה של 2 ו- גם ראשוני. מבנה זה הוצע על ידי Damien Stehlé ו-Ron Steinfeld לשיפור NTRU כך שיהיה בעל ביטחון מוכח וכן נמצא בשימוש RingLWE.
  • כאשר ראשוני. הוצע על ידי דניאל ברנשטיין ואחרים כתחליף טוב יותר למבנה החוג ב-NTRU.

ב-2011 הציעו Damien Stehlé ו-Ron Steinfeld גרסה משופרת[12] בשינויים קלים של הצפנה/חתימה דיגיטלית NTRU המוכחת כבטוחה נגד התקפת מוצפן-נבחר במסגרת מודל אורקל אקראי או מודל סיבוכיות סטנדרטי, תחת הנחת הקושי שבפתרון בעיות סריגים (במחשב קלאסי או קוונטי) עם הגבלה לסוג מסוים של סריגים מעל שדה ציקלוטומי. הם הראו שאם בוחרים את הפולינומים הסודיים של המקבל כפונקציית גאוסיין בדידית אז המפתח הציבורי ייראה מבחינה סטטיסטית אחיד ובלתי ניתן להבחנה מעל הטווח שלה. תכונת אי-הבחנה בהקשר של מפתח ציבורי פירושה קושי בניחוש המפתח הפרטי מתוך המפתח הציבורי.

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

  1. החלפת חוג הפולינומים ב- כאשר הוא חזקה של 2. כך מתקבל חוג שלמים מעל שדה ציקלוטומי.
  2. הוא ראשוני כך שמתקיים מתחלק ל- גורמים (העתקות ליניאריות) שונים מודולו .
  3. ו- נלקחים מתוך דגימה גאוסיאנית דיסקרטית מעל החוג , בתנאי שהם הפיכים מודולו . אם הם אינם הפיכים מתעלמים מהדגימה ומנסים דגימה אחרת עד שהתנאי מתקיים. כמו כן הוא מהצורה כאשר הוא הדגימה הגאוסיאנית האמורה. התוספת האחרונה מקלה על הפענוח כי אם מתקיים לא צריך את ההכפלה האחרונה בהופכי של .
  4. מוסיפים וקטור שגיאה קטן להצפנה כך שההצפנה כעת היא: , כאשר נבחר טווח השגיאה של בעיית RingLWE.

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

NTRU נמצא בתהליך תקינה של שני גופים בינלאומיים:

בנוסף האלגוריתם הוצע בטיוטת IETF כמועמד לפרוטוקול TLS. ב-2009 הוזכר NTRU על ידי NIST כמועמד אפשרי לאלגוריתם הצפנה אסימטרי פוסט-קוונטי, שיחליף את האלגוריתמים הנוכחיים. במסגרת המאמץ להתכונן לקראת העידן הקוונטי[15] ב-NIST מתכוונים לפרסם בסוף 2016 תחרות פתוחה[16] שבה יבחנו הצעות לאלגוריתם פוסט-קוונטי.

NTRU זמינה כקוד פתוח תחת רישיון GPL ו-FOSS. בתנאי שכל שימוש בו יהיה זמין גם הוא כקוד פתוח. זאת במטרה להסיר מכשולים ולאפשר למפתחים להטמיע את האלגוריתם מהר ככל האפשר. כמו כן האלגוריתם ניתן לשימוש מסחרי תחת רישיון BSD. כיום ישנם ב-GitHub שני פרויקטי קוד פתוח ב-C וב-Java המיישמים את NTRU; פרויקט NTRU[17] תחת רישיון GPL וספריית NTRU[18] ברישיון BSD.

הערות שוליים

[עריכת קוד מקור | עריכה]