הצפנת מקאליס

הצפנת מקאליס (באנגלית: McEliece Cryptosystem) היא מערכת הצפנה אסימטרית המבוססת על קוד תיקון שגיאות, שפותחה ב-1978 על ידי רוברט מקאליס (R.J. McEliece). הרעיון הכללי הוא; בהינתן מחרוזת של k {\displaystyle k} סיביות המקודדת למילת קוד בגודל n > k {\displaystyle n>k} סיביות על ידי מקודד ידוע לכול של קוד ליניארי בינארי באורך n {\displaystyle n} וממד k {\displaystyle k} , אזי הטקסט המוצפן מיוצר על ידי החדרת t {\displaystyle t} שגיאות אקראיות, כלומר הפיכת t {\displaystyle t} סיביות (Bit flipping) במיקומים אקראיים במילת הקוד. אם t {\displaystyle t} קטן בחצי לפחות ממרחק המינג של הקוד הליניארי של טקסט מוצפן נתון קיים רק טקסט גלוי יחיד המתאים לו שניתן לשחזור באמצעות קוד תיקון השגיאות. אך אם הפרמטרים n , k , t {\displaystyle n,k,t} גדולים חילוץ הטקסט הגלוי מהטקסט המוצפן באמצעות תיקון שגיאות אינו מעשי אלא אם כן נתון מידע נוסף לגבי מבנה הקוד. ההבדל בפקטור העבודה בין קידוד מילת הקוד לבין תיקון השגיאות הוא הבסיס להצפנה האסימטרית שהציע מקאליס, המפתח הציבורי יהיה הקוד הליניארי והמפתח הפרטי יהיה המידע המאפשר את תיקון השגיאות בזמן פולינומי. מקאליס המליץ על שימוש בקוד תיקון שגיאות שנקרא "קוד גוֹפַּא בינארי" על שם ממציאו וולרי גופא (Valerii Goppa) מפני כמה סיבות, לקוד זה קיים אלגוריתם פענוח פולינומי יעיל וכן העובדה שקוד גופא מהווה מועמד טוב לפונקציה חד-כיוונית - קל לייצר קוד כזה אך קשה מאוד לזהות אותו. כדי להקים מערכת הצפנת מקאליס, אפשר לפעול כדלהלן: בוחרים קוד גוֹפַּא שהוא פולינום שרירותי אי-פריק g ( z ) {\displaystyle g(z)} ממעלה t {\displaystyle t} מעל השדה G F ( 2 m ) {\displaystyle GF(2^{m})} ותת-קבוצה L {\displaystyle L} של G F ( 2 m ) {\displaystyle GF(2^{m})} עם הפרמטרים [ n , ≥ n − m t , ≥ 2 t + 1 ] {\displaystyle [n,\geq n-mt,\geq 2t+1]} . כדי לקבל מרחק מינימלי גדול ככל האפשר רצוי שמספר השורשים של g ( z ) {\displaystyle g(z)} יהיה שווה למעלה שלו (נקרא separable). מכינים מטריצה יוצרת G {\displaystyle G} של קוד גופא מסדר k × n {\displaystyle k\times n} . לאחר מכן בוחרים מטריצה הפיכה (לא סינגולרית) S {\displaystyle S} אקראית מסדר k × k {\displaystyle k\times k} , ומטריצת תמורה P {\displaystyle P} (מטריצה בינארית ריבועית המכילה בדיוק כניסה אחת שהיא '1' בכל שורה ואו בכל עמודה וכל היתר אפסים) מסדר n × n {\displaystyle n\times n} ומחשבים את G ∗ = S G P {\displaystyle G^{*}=SGP} . מפיצים את G ∗ {\displaystyle G^{*}} ואת t {\displaystyle t} כפרמטרים ציבוריים ושומרים בסוד את כל היתר. אם מישהו רוצה להצפין מסר כלשהו m {\displaystyle m} באורך k {\displaystyle k} סיביות, הוא בוחר וקטור שגיאות e {\displaystyle e} באורך n {\displaystyle n} במשקל t {\displaystyle t} (שבו לכל היותר t {\displaystyle t} קואורדינטות שונות מאפס), וההצפנה של m {\displaystyle m} היא y = m G ∗ + e {\displaystyle y=mG^{*}+e} אותה הוא שולח למקבל. המקבל יכול לחשב עם הפרמוטציה הסודית P {\displaystyle P} את: y ′ = y P − 1 = m G ∗ P − 1 + e P − 1 = m S G P P − 1 + e ′ = ( m S ) G + e ′ {\displaystyle y'=yP^{-1}=mG^{*}P^{-1}+eP^{-1}=mSGPP^{-1}+e'=(mS)G+e'} כאשר e ′ {\displaystyle e'} במשקל נמוך מ- t {\displaystyle t} . עם אלגוריתם הפענוח של קוד גופא המקבל יכול לתקן את y ′ {\displaystyle y'} למילה m ′ = m S {\displaystyle m'=mS} על ידי חישוב e ′ {\displaystyle e'} . כיוון שהמטריצה S {\displaystyle S} הפיכה אפשר לחלץ את המסר על ידי m = m ′ S − 1 {\displaystyle m=m'S^{-1}} . כדי שהמערכת האמורה תהיה בטוחה ההמלצה של מקאליס הייתה לפני 25 שנה שהפרמטרים יהיו m = 10 {\displaystyle m=10} והפולינום g ( z ) {\displaystyle g(z)} הוא פולינום אי פריק מסדר t = 50 {\displaystyle t=50} ובמקרה זה n = 2 10 = 1024 {\displaystyle n=2^{10}=1024} ו- k ≥ 1024 − 10 ⋅ 50 = 525 {\displaystyle k\geq 1024-10\cdot 50=525} . אולם כדי לעמוד בהתקדמות הטכנולוגית שחלה ב-25 השנים האחרונות מומלץ כיום להשתמש בפרמטרים קצת יותר גדולים כמו n = 2048 , m = 11 {\displaystyle n=2048,m=11} ומספר השגיאות בין 30 ל-120 והממד במקרה זה נע בין 1,718 ל-728. לסיכום המערכת היא: לשם המחשה: אם נבחר השדה G F ( 2 4 ) {\displaystyle GF(2^{4})} , הפולינום k ( X ) = X 4 + X + 1 {\displaystyle k(X)=X^{4}+X+1} אי פריק ואז α {\displaystyle \alpha } הוא אלמנט פרימיטיבי רק אם הוא מסדר 15. האלמנטים של תת-הקבוצה G F ( 2 4 ) ∗ {\displaystyle GF(2^{4})^{*}} הם החזקות של α {\displaystyle \alpha } כאשר α 4 = α + 1 {\displaystyle \alpha ^{4}=\alpha +1} הקבוצה המתקבלת היא { α , α 2 , . . . , α 14 } {\displaystyle \{\alpha ,\alpha ^{2},...,\alpha ^{14}\}} . קוד גופה מעל שדה זה יכול להיות g ( z ) = ( z + α ) ( z + α 14 ) = z 2 + α 7 z + 1 {\displaystyle g(z)=(z+\alpha )(z+\alpha ^{14})=z^{2}+\alpha ^{7}z+1} L = { α i | 2 ≤ i ≤ 13 } {\displaystyle L=\{\alpha ^{i}|2\leq i\leq 13\}} עבור קוד זה n = 12 , t = 2 {\displaystyle n=12,t=2} ו- k {\displaystyle k} צריך להיות 12 − 4 ⋅ 2 = 4 {\displaystyle 12-4\cdot 2=4} . המרחק המינימלי הוא d ≥ 2 ⋅ 2 + 1 = 5 {\displaystyle d\geq 2\cdot 2+1=5} . בקיצור זהו קוד גופא בינארי Γ ( L , g ( z ) ) {\displaystyle \Gamma (L,g(z))} עם הפרמטרים [ 12 , ≥ 4 , ≥ 5 ] {\displaystyle [12,\geq 4,\geq 5]} ואפשר לתקן איתו עד שתי שגיאות. אם נבחר לדוגמה את המטריצות הבאות G = ( 1     1     1     1     0     1     0     1     0     1     0     0 0     1     0     0     1     1     1     1     0     0     1     0 0     0     1     0     1     0     1     1     1     0     0     0 0     1     0     1     0     0     1     1     0     0     0     1 ) {\displaystyle G={\begin{pmatrix}1\ \ 1\ \ 1\ \ 1\ \ 0\ \ 1\ \ 0\ \ 1\ \ 0\ \ 1\ \ 0\ \ 0\\0\ \ 1\ \ 0\ \ 0\ \ 1\ \ 1\ \ 1\ \ 1\ \ 0\ \ 0\ \ 1\ \ 0\\0\ \ 0\ \ 1\ \ 0\ \ 1\ \ 0\ \ 1\ \ 1\ \ 1\ \ 0\ \ 0\ \ 0\\0\ \ 1\ \ 0\ \ 1\ \ 0\ \ 0\ \ 1\ \ 1\ \ 0\ \ 0\ \ 0\ \ 1\end{pmatrix}}} S = ( 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 1 ) {\displaystyle S={\begin{pmatrix}1&0&1&1\\0&1&0&1\\1&1&0&1\\1&1&1&1\end{pmatrix}}} P = ( 0     0     0     1     0     0     0     0     0     0     0     0 0     0     0     0     0     0     0     0     0     0     1     0 0     0     0     0     1     0     0     0     0     0     0     0 0     1     0     0     0     0     0     0     0     0     0     0 1     0     0     0     0     0     0     0     0     0     0     0 0     0     0     0     0     1     0     0     0     0     0     0 ) {\displaystyle P={\begin{pmatrix}0\ \ 0\ \ 0\ \ 1\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\\0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 1\ \ 0\\0\ \ 0\ \ 0\ \ 0\ \ 1\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\\0\ \ 1\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\\1\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\\0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 1\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\ \ 0\end{pmatrix}}} G ∗ = S G P = ( 1     0     1     1     0     1     1     1     0     1     0     0 1     1     0     0     0     1     0     1     1     0     0     0 1     0     1     1     1     0     1     1     1     0     1     0 0     0     1     1     0     0     0     1     1     1     1     1 ) {\displaystyle G^{*}=SGP={\begin{pmatrix}1\ \ 0\ \ 1\ \ 1\ \ 0\ \ 1\ \ 1\ \ 1\ \ 0\ \ 1\ \ 0\ \ 0\\1\ \ 1\ \ 0\ \ 0\ \ 0\ \ 1\ \ 0\ \ 1\ \ 1\ \ 0\ \ 0\ \ 0\\1\ \ 0\ \ 1\ \ 1\ \ 1\ \ 0\ \ 1\ \ 1\ \ 1\ \ 0\ \ 1\ \ 0\\0\ \ 0\ \ 1\ \ 1\ \ 0\ \ 0\ \ 0\ \ 1\ \ 1\ \ 1\ \ 1\ \ 1\end{pmatrix}}} והמסר להצפנה הוא m = ( 0 , 1 , 0 , 1 ) {\displaystyle m=(0,1,0,1)} תחילה מחשבים את m G ∗ = ( 1 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 ) {\displaystyle mG^{*}=(1,1,1,1,0,1,0,0,0,1,1,1)} מוסיפים את וקטור השגיאה (שהוא וקטור המכיל אפסים למעט הפוזיציות השנייה והשלישית) ואז ההצפנה של m {\displaystyle m} היא y = m G ∗ + e = ( 1 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 ) {\displaystyle y=mG^{*}+e=(1,\color {Red}0\color {Black},\color {Red}0\color {Black},1,0,1,0,0,0,1,1,1)} המקבל שרוצה לפענח את m {\displaystyle m} מתוך y {\displaystyle y} מחשב תחילה את y P − 1 {\displaystyle yP^{-1}} מהמטריצה P {\displaystyle P} y P − 1 = m S G + e ′ = ( 1 , 1 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 0 ) {\displaystyle yP^{-1}=mSG+e'=(1,1,0,\color {Red}0\color {Black},1,1,1,0,1,\color {Red}0\color {Black},0,0)} כתוצאה מהפעולה האחרונה השגיאות עברו לפוזיציות הרביעית והעשירית אחרי תיקון מתקבל m S G = ( 1 , 1 , 0 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 0 , 0 ) {\displaystyle mSG=(1,1,0,1,1,1,1,0,1,1,0,0)} ואז אפשר לפענח את הקוד על ידי כפל המטריצות הבא: [ G T | ( m S ) T ] = ( 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 ) ∼ ( 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 ) {\displaystyle [G^{T}|(mS)^{T}]={\begin{pmatrix}1&0&0&0&1\\1&1&0&1&1\\1&0&1&0&0\\1&0&0&1&1\\0&1&1&0&1\\1&1&0&0&1\\0&1&1&1&1\\1&1&1&1&0\\0&0&1&0&1\\1&0&0&0&1\\0&1&0&0&0\\0&0&0&1&0\end{pmatrix}}\sim {\begin{pmatrix}1&0&0&0&\color {Green}1\\0&1&0&0&\color {Green}0\\0&0&1&0&\color {Green}1\\0&0&0&1&\color {Green}0\\1&1&0&1&1\\1&0&1&0&0\\1&0&0&1&1\\0&1&1&0&1\\1&1&0&0&1\\0&1&1&1&1\\1&1&1&1&0\\1&0&0&0&1\end{pmatrix}}} לכן m S = ( 1 , 0 , 1 , 0 ) {\displaystyle mS=(1,0,1,0)} והצעד האחרון הוא חישוב S − 1 {\displaystyle S^{-1}} m = ( 1 , 0 , 1 , 0 ) ⋅ ( 0 1 1 0 1 0 0 1 0 0 1 1 1 1 0 1 ) = ( 0 , 1 , 0 , 1 ) {\displaystyle m=(1,0,1,0)\cdot {\begin{pmatrix}0&1&1&0\\1&0&0&1\\0&0&1&1\\1&1&0&1\\\end{pmatrix}}=(0,1,0,1)} . יהי m {\displaystyle m} שלם חיובי ויהיו n {\displaystyle n} ו- t {\displaystyle t} שני פרמטרים כך שמתקיים n ≤ 2 m {\displaystyle n\leq 2^{m}} וכן t < n / m {\displaystyle t<n/m} . קוד גופה בינארי המסומן Γ ( L , g ) {\displaystyle \Gamma (L,g)} מוגדר על ידי תת-קבוצה סדורה L = ( α 1 , . . . , α n ) {\displaystyle L=(\alpha _{1},...,\alpha _{n})} של השדה F 2 m {\displaystyle F_{2^{m}}} מסדר n {\displaystyle n} שנקראת תמיכה (support) ועל ידי פולינום מתוקן אי פריק g ( z ) ∈ F 2 m [ z ] {\displaystyle g(z)\in F_{2^{m}}[z]} ממעלה t {\displaystyle t} ללא שורשים ב- L {\displaystyle L} הנקרא יוצר (generator). הווקטור a = ( a 0 , . . . , a n − 1 ) ∈ F 2 n {\displaystyle a=(a_{0},...,a_{n-1})\in F_{2}^{n}} ייקרא קוד גופא אם מתקיים R a ( z ) ≜ ∑ j = 0 n − 1 α j ( z − α j ) − 1 ≡ 0  mod  g ( z ) {\displaystyle R_{a}(z)\triangleq \sum _{j=0}^{n-1}\alpha _{j}(z-\alpha _{j})^{-1}\equiv 0{\text{ mod }}g(z)} הביטוי ( z − α j ) − 1 {\displaystyle (z-\alpha _{j})^{-1}} קיים מאחר ש- F 2 m / g ( z ) {\displaystyle F_{2^{m}}/g(z)} הוא שדה. והמעלה t {\displaystyle t} של הפולינום מהווה גבול תחתון ליכולת תיקון השגיאות של הקוד. הקוד המתואר ליניארי ולו ממד k ≥ n − t m {\displaystyle k\geq n-tm} וכן מרחק מינימלי של 2 t + 1 {\displaystyle 2t+1} לפחות לכן ניתן לשחזר עד t {\displaystyle t} שגיאות. אם a {\displaystyle a} הוא מילת קוד של Γ ( L , g ) {\displaystyle \Gamma (L,g)} ואם b = a + e {\displaystyle b=a+e} עם e ∈ F 2 n {\displaystyle e\in F_{2}^{n}} בעל מרחק המינג t {\displaystyle t} או פחות, המילים a {\displaystyle a} ו- e {\displaystyle e} ייחודיים בגלל b {\displaystyle b} . קיים פולינום מתוקן יחיד σ ( z ) {\displaystyle \sigma (z)} ב- F 2 m {\displaystyle F_{2^{m}}} ממעלה לכל היותר t {\displaystyle t} המקיים σ ( z ) R b ( z ) ≡ ω ( z )  mod  g ( z ) {\displaystyle \sigma (z)R_{b}(z)\equiv \omega (z){\text{ mod }}g(z)} כאשר ω ( z ) {\displaystyle \omega (z)} הוא פולינום ב- F 2 m {\displaystyle F_{2^{m}}} ממעלה לכל היותר t − 1 {\displaystyle t-1} . לפולינום σ ( z ) {\displaystyle \sigma (z)} יש בדיוק t {\displaystyle t} שורשים ב- L {\displaystyle L} המתאימים לפוזיציות המכילות אחד בווקטור השגיאה e {\displaystyle e} . תהליך הפענוח כולל את הפעולות הבאות: חישוב קוד גופה R b ( z )  mod  g ( z ) {\displaystyle R_{b}(z){\text{ mod }}g(z)} , פתרון נוסחת המפתח σ ( z ) R b ( z ) ≡ ω ( z )  mod  g ( z ) {\displaystyle \sigma (z)R_{b}(z)\equiv \omega (z){\text{ mod }}g(z)} , חישוב השורשים של σ ( z ) {\displaystyle \sigma (z)} . ישנן כמה וריאציות לפתרון נוסחת המפתח האמורה ביניהן אלגוריתם אוקלידס. ב-1986 הציע נידריטר (Niederreiter) מערכת דומה בביטחונה שנקראת גרסה דואלית. גרסה נוספת שהוצעה מבוססת על קוד ריד-מולר. מקאליס ציין שהמערכת שלו אינה מתאימה לחתימה דיגיטלית ב-2001 הומצאה חתימה דיגיטלית מבוססת מקאליס. גודל המפתח הציבורי הוא כנראה חסרונה הגדול של המערכת והוא k n {\displaystyle kn} כאשר k {\displaystyle k} הוא אורך המידע המיועד להצפנה ו- n {\displaystyle n} הוא אורך הבלוק המוצפן. למשל לפי הפרמטרים המקוריים שהוצעו על ידי מקאליס גודל המפתח הציבורי הוא 536,576 סיביות. סנדריר הציע להפחית מגודל המפתח הציבורי בשיטה סיסטמטית. כלומר G = ( I | U ) {\displaystyle G=(I|U)} כאשר I {\displaystyle I} הוא מטריצת היחידה k × k {\displaystyle k\times k} ו- U {\displaystyle U} הוא מסדר k × ( n − k ) {\displaystyle k\times (n-k)} . כך גודל המפתח מצטמצם ל- k ( n − k ) {\displaystyle k(n-k)} סיביות כי יש צורך לאחסן רק את הצד הימני ( U {\displaystyle U} ), אך עדיין המפתח יהיה די גדול (בערך 262,000 סיביות). הצפנת מקאליס מבוססת על שתי בעיות קשות בתורת הקודים האחת היא מקרה פרטי של בעיית "פענוח סינדרומי" שהוכח שהיא NP-שלמה; בהינתן מטריצה בינארית מסדר r × n {\displaystyle r\times n} ו- a {\displaystyle a} מילות קוד כלשהן ב- F 2 r {\displaystyle F_{2}^{r}} הבעיה היא למצוא מילה e {\displaystyle e} ב- F 2 n {\displaystyle F_{2}^{n}} במשקל נמוך או שווה ל- r / log 2 n {\displaystyle r/{\text{log}}_{2}n} כך שמתקיים H e T = s {\displaystyle He^{T}=s} כאשר s {\displaystyle s} הוא הסינדרום. הוכח על ידי ברלקמפ, מקאליס וטילבורג שהבעיה NP-קשה. והבעיה שנייה היא בעיית זיהוי 'קוד גופא', כלומר בהינתן מטריצה בינארית מסדר r × n {\displaystyle r\times n} לענות על השאלה האם היא מטריצת גופה. אפשר לתקוף את סכימת מקאליס בשתי דרכים. אחת היא 'התקפה מבנית' בה מנסים לשחזר את המפענח של הקוד הנוצר על ידי המפתח הציבורי G ∗ {\displaystyle G^{*}} ומשם לשחזר את המפתח הפרטי G {\displaystyle G} , אם היא מצליחה המערכת נפרצת לחלוטין. אפשר לסווג קודי שגיאות למחלקות שקילות, שני קודים באורך זהה ייקראו שקולים (שההפרש ביניהם הוא מילת קוד) אם קיימת בדיוק תמורה אחת באורך n {\displaystyle n} המשנה קוד אחד לשני לכן הקוד C ′ {\displaystyle C'} שנוצר על ידי G ∗ {\displaystyle G^{*}} והקוד הנוצר על ידי G {\displaystyle G} נקראים שקולים. בהתקפה זו התוקף מנסה להשוות בין קודים כדי למצוא שקילות. אם נמצאה שקילות אפשר לשחזר את התמורה ביניהם על ידי אלגוריתם פולינומי שנקרא Support Splitting Algorithm (של ניקולס סנדריר 1999). תהליך זה הוא מעבר ליכולת הטכנולוגית הנוכחית עם הפרמטרים המקוריים של מקאליס כי התקפה מבנית מסוג זה דורשת בערך 2 466 {\displaystyle 2^{466}} קודים כדי שתצליח. בהתקפה השנייה שנקראת התקפת פענוח התוקף מנסה לנחש את פענוח הקוד מבלי לפרוץ את המערכת עצמה. ההתקפה תלויה בפרמטרים של קוד תיקון השגיאות C ′ {\displaystyle C'} , אורכו, הממד שלו ויכולת תיקון השגיאות ( t {\displaystyle t} ). לפי הפרמטרים המקוריים של מקאליס התקפה כזו תתבצע עם 2 64 {\displaystyle 2^{64}} פעולות בינאריות. מספר זה נמוך בהשוואה ליכולת הטכנולוגית הנוכחית אך הבעיה היא שכדי להעלות מספר זה יש צורך להגדיל את הפרמטרים וכיוון שהמפתח הציבורי מאוד גדול גם ככה זו בעיה. המערכת מצד אחד בטוחה מאוד ויעילה. יעילותה עולה על RSA כיוון שפעולות ההצפנה והפענוח דורשות פעולות ליניאריות בסיביות, דהיינו הכפלה של ווקטור במטריצה בלבד, לעומת RSA שדורשת העלאה בחזקה מודולרית. החסרונות העיקריים של הצפנת מקאליס הן בעובדה שהמפתח הציבורי גדול מאוד וכן בעובדה שתפוקת המערכת היא בשיעור 50 אחוז בערך. מסיבות אילו האלגוריתם לא זכה לפופולריות רבה. ההתעניינות המחודשת באלגוריתם באה בעקבות ההתעניינות הגוברת במערכות הצפנה עמידות נגד התקפות קוונטיות כאשר מחשב קוונטי יהיה מעשי. מערכת מקאליס אטרקטיבית בשל העובדה שהיא נחשבת פוסט קוונטית, היא אינה מבוססת על הבעיות הידועות מתורת המספרים - פירוק לגורמים ולוגריתם דיסקרטי לכן אלגוריתם שור ואלגוריתמים קוונטיים אחרים לא יהיו אפקטיביים נגדה. מסיבה זו המחקר בנושא כנראה יימשך ויהיו ממצאים נוספים. אתר האינטרנט הרשמי של הצפנת מקאליס אנציקלופדיה לקריפטוגרפיה ואבטחה, הוצאת שפרינגר, 2005 A Public-Key Cryptosystem Based On Algebraic Coding Theory Niederreiter, H. (1986). “Knapsack-type cryptosystems and algebraic coding theory.” Prob. Contr. Inform. Theory, 15 (2), 157–166. Sidel’nikov, V.M. (1994). “A public-key cryptosystem based on Reed-Muller codes.” Discrete Mathematics and Applications, 4 (3), 191–207. Courtois. N., M. Finiasz, and N. Sendrier (2001). “How to achieve a McEliece-based digital signature scheme.” Advances in Cryptology—ASIACRYPT 2001, Lecture Notes in Computer Science, vol. 2248, ed. C. Boyd. Springer-Verlag, Berlin, 157–174. Sendrier, N. (2002). “On the security of the McEliece public-key cryptosystem.” Information, Coding and Mathematics, eds. M. Blaum, P.G. Farrell, and H. van Tilborg. Kluwer, 141–163. Proceedings of Workshop honoring Prof. Bob McEliece on his 60th birthday. Berlekamp, E.R., R.J. McEliece, and H.C. van Tilborg (1978). “On the inherent intractability of certain coding problems.” IEEETransactions on Information Theory, 24 (3), 384–386. The McEliece Cryptosystem Resists Quantum Fourier Sampling Attacks