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

פונקציה חד-כיוונית עם דלת מלכודת
--------------------------------

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

סריג ובעיית הווקטור הקרוב ביותר
-------------------------------

 ערך מורחב – **הצפנה מבוססת סריג**  

בהינתן קבוצה של n וקטורים בלתי תלויים מעל {\mathbb {R}}^{n}, ה**סריג** (Lattice) L הנפרש על ידי {\displaystyle B=\{\mathbf {b} \_{1},\mathbf {b} \_{2},...\mathbf {b} \_{n}\}} הוא קבוצת כל הצירופים הליניאריים האפשריים של הווקטורים {\displaystyle \mathbf {b} \_{i}} עם מקדמים שלמים, כלומר:

{\displaystyle L(B)\ {\overset {\underset {\mathrm {def} }{}}{=}}\ \left\{\sum \_{i}k\_{i}\mathbf {b} \_{i}:k\_{i}\in \mathbb {Z} {\text{ for all }}i\right\}}
כל וקטור נקרא "נקודה" בסריג. נוח לייצג את הסריג באמצעות מטריצה לא סינגולרית (הפיכה) מסדר {\displaystyle n\times n} שרכיביה הם מספרים ממשיים ועמודותיה הם וקטורי הבסיס B. פרט חשוב בנוגע לסריגים הוא שלכל סריג בסיסים רבים שלהם אותה דטרמיננטה. למעשה, על ידי צירוף ליניארי (שלם) כלשהו של וקטורי הבסיס אפשר להגיע לבסיס אחר של אותו סריג. מזה נובע שבהינתן מטריצה T (שרכיביה שלמים) כך שמתקיים {\displaystyle BT=C} קיימת מטריצה אחרת {\displaystyle T^{-1}} כך שמתקיים {\displaystyle CT^{-1}=B}. תכונה נוספת וחשובה המשמשת בהצפנת GGH היא orthogonality defect (פונקציית אורתוגונליות פגומה) שהיא פונקציה המוגדרת כך:

{\displaystyle \textstyle {\text{orth-defect}}(B)\ {\overset {\underset {\mathrm {def} }{}}{=}}\ {\frac {\prod \_{i}||\mathbf {b} \_{i}||}{|{\text{det}}(B)|}}}
כאשר {\displaystyle ||\mathbf {b} \_{i}||} הוא הנורמה האוקלידית של העמודה i של B. והיא מספקת כלי מדידה להערכה כמה קרובות עמודות B להיות אורתוגונליות (ניצבות) זו לזו. כאשר עמודות B אורתוגונליות {\displaystyle {\text{orth-defect}}(B)=1}. בסיס של סריג נחשב לבסיס "טוב" אם פונקציית פגם האורתוגונליות נמוכה, כלומר B אורתוגונלית או "כמעט" אורתוגונלית, כך שהפונקציה האמורה לא גדולה בהרבה מ-1.

בעיית הווקטור הקרוב ביותר היא בעיה קשה בתורת הסריגים שלה השלכות על תורת הקריפטוגרפיה. בהינתן בסיס B של סריג כמתואר לעיל ווקטור כלשהו {\mathbf {v}}, הבעיה היא למצוא וקטור אחר ב-{\displaystyle L(B)} שהוא הקרוב ביותר ל-{\mathbf {v}} בנורמה מסוימת. בעיה זו הוכחה כבעיית NP-קשה. לא ידוע על אלגוריתם שיכול אף למצוא קירוב טוב בפקטור פולינומי ב-n שהוא הממד. בעיה קשורה נוספת היא מציאת בסיס מינימלי (SBP), שגם היא קשה, אם ניתן למצוא בסיס כזה בזמן פולינומי אז אפשר גם לפתור את בעיית הווקטור הקצר ביותר. האלגוריתם הטוב ביותר הידוע כיום הוא LLL אלגוריתם לצמצום בסיס הסריג (lattice basis reduction) והוא אינו יעיל כאשר הסריג בעל ממד גדול. חישוב המפתח הפרטי מתוך המפתח הציבורי שקול לפתרון בעיה זו.

תיאור הצופן
-----------

האלגוריתם מורכב משלושה חלקים; הכנה, הצפנה ופענוח כדלהלן:
להכנה המקבל בוחר שני בסיסים B ו-R המיוצגים כמטריצות מסדר {\displaystyle n\times n} כאמור, כאשר n הוא פרמטר ביטחון (למשל {\displaystyle n\geq 200}). הבסיס R נבחר באופן אקראי באופן שיהיה בסיס "טוב" כלומר שהפונקציה {\displaystyle {\text{dual-orth-defect}}} שלו נמוכה והוא משמש כמפתח פרטי ונשמר בסוד. המקבל מפרסם את המפתח הציבורי B שהוא גרסה "מסווית" של המפתח הפרטי. השיטה הישירה להסוות את R היא ערבוב של כל וקטורי R עם צירוף ליניארי של וקטורים אחרים, עם מקדמים בטווח {\displaystyle \{-1,0,1\}}. נוח לממש זאת באמצעות המכפלה {\displaystyle B=TR} כאשר T הוא מטריצה אונימודולרית (unimodular) אקראית, כלומר מטריצה ריבועית במספרים שלמים שהדטרמיננטה שלה היא \pm 1. והמקבל שומר גם את T בסוד.

להצפנת המסר {\displaystyle m\in \mathbb {Z} ^{n}} תחילה השולח ממיר את m בשיטה מוסכמת ובטוחה לנקודה בסריג, נניח הווקטור {\mathbf {v}}. לאחר מכן השולח מחשב את:

{\displaystyle c=\mathbf {v} B+\mathbf {e} } ושולח למקבל את c.
כאשר {\displaystyle \mathbf {e} } הוא "וקטור שגיאה" אקראי קצר, כלומר שמקדמיו הם {\displaystyle \{\sigma ,-\sigma \}} בהסתברות שווה, עבור \sigma  ממשי (כגון {\displaystyle \sigma =3}). בחירת וקטור השגיאה בצורה זו גרמה לנקודת תורפה מהותית שאיפשרה התקפה יעילה נגד המערכת. נראה היה שלא ניתן למצוא פתרון יעיל שעוקף את הבעיה ורבים סברו לאור זאת ש-GGH אינה ראויה לשימוש כיום בשל כך. אולם במרוצת השנים נמצאו פתרונות (להלן) והסתבר ש-GGH הוספדה מוקדם מדי.

לצורך הפענוח המקבל משתמש בטכניקת קירוב של Babai (היעילה רק כאשר הבסיס נוח) כדי להפוך את פעולת ההצפנה. דהיינו מייצג את c כצירוף ליניארי של עמודות R, מעגל את המקדמים של צירוף זה לשלמים הקרובים ביותר ומקבל נקודה בסריג. ייצוג הנקודה כצירוף ליניארי של עמודות B הוא הווקטור {\mathbf {v}}. ליתר דיוק אם {\displaystyle T=B^{-1}R} היא מטריצה יונימודולרית, המקבל מחשב את {\mathbf {v}} ואת {\displaystyle \mathbf {e} }. כך:

{\displaystyle \mathbf {v} =TR^{-1}c,\mathbf {e} =c-B\mathbf {v} }. מהנקודה {\mathbf {v}} המקבל יכול לשחזר את המסר m.
מדוע זה עובד. היות שהמטריצה {\displaystyle T=B^{-1}R} היא יונימודולרית, הפונקציה ההפוכה להצפנה היא {\displaystyle \mathbf {v} =TR^{-1}c} וכן {\displaystyle \mathbf {e} =c-B\mathbf {v} }. כזכור {\displaystyle c=B\mathbf {v} +\mathbf {e} } לכן מתקיים:

{\displaystyle cR^{-1}=(\mathbf {v} B+\mathbf {e} )R^{-1}=\mathbf {v} TRR^{-1}+\mathbf {e} R^{-1}=\mathbf {v} T+\mathbf {e} R^{-1}}
מכפילים את הביטוי האחרון ב-{\displaystyle T^{-1}} כדי לבודד את {\mathbf {v}}, ממנו אפשר לחלץ את m.
אלגוריתם בּבּאי מאפשר לצמצם את הביטוי {\displaystyle eR^{-1}} מהמשוואה האמורה בתנאי שהוא מספיק קטן, כלומר הכניסות שלו הם ערכים ממשיים הנמוכים מ-{\displaystyle 1/2}.

בהצעה המקורית, הובאו שתי שיטות להכנת בסיס הסריג R כך שייקרא "טוב". אחת היא לבחור מטריצה אקראית שהכניסות בה הם שלמים קטנים כלומר שהעמודות הן וקטורים בעלי מקדמים בטווח {\displaystyle \{-4,-3,-2,-1,0,1,2,3,4\}} והאחרת היא לבחור את R כך שמתקיים {\displaystyle R=kI\_{n}+E} כאשר I\_{n} היא מטריצת היחידה מסדר {\displaystyle n\times n} וכן k>1 הוא שלם בגודל בינוני ו-E מטריצה אקראית המכילה וקטורים קטנים כמו בקודמת. כמו כן כדי להכין את המטריצה T הוצעו כמה דרכים כדי למנוע מצב שהמקדמים של B יתנפחו לממדים גדולים מדי מה שיגרום להתנפחות הצופן. טווח המסר הוא כל הקטורים ממעלה n עם מקדמים מהצורה {\displaystyle \{-M,-(M-1),...-1,0,1,M-1,M\}} עבור {\displaystyle M\in \mathbb {N} } כלשהו. יש צורך בשיטה בטוחה סמנטית להמרת המסר m לוקטור האמור ולהפך.

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

אם נתונה מערכת מפתח ציבורי של GGH המתאימה לשריג {\displaystyle L\in \mathbb {Z} ^{n}}, באופן טבעי סכימת חתימה דיגיטלית תהיה כדלהלן:
נתון המסר m והתמצית שלו {\displaystyle H(m)\in \mathbb {Z} ^{n}} שחושבה על ידי פונקציית גיבוב בטוחה כלשהי, החתימה היא חישוב הנקודה {\displaystyle \mathbf {s} } בסריג האמור, הקרובה ביותר ל-{\displaystyle H(m)}. אימות החתימה מתבצע על ידי בדיקה שאכן {\displaystyle \mathbf {s} } נמצא בסריג כלומר {\displaystyle \mathbf {s} (R)^{-1}\in \mathbb {Z} ^{n}} וכן שהיא אכן נקודה קרובה כלומר {\displaystyle ||\mathbf {s} -H(m)||} קטן מערך מפרמטר קרבה שנקבע כחלק מתהליך החתימה.

ב-2006 פרסמו עודד רגב ו-Phong Nguyen קריפטואנליזה של חתימת GGH ו-NTRU שמראה שאפשר לחשוף את המפתח הפרטי בזמן מאוד קצר תוך שימוש ב-400 חתימות בלבד. מסיבה זו חתימת GGH אינה בטוחה לשימוש מהיבט פרקטי.

ביטחון ויעילות
--------------

תוצאת צופן GGH מתנפחת באופן משמעותי לעומת המסר המקורי בערך {\displaystyle O(n^{2}{\text{ log }}n)}. הערכה מדויקת של מידת ההתנפחות תלויה בגודל הכניסות של B שבתורו תלוי בגודל הכניסות של R ו-T. קיימות גרסאות של הצופן שמשפרות את המצב. Micciancio הציע להחליף את המפתח הציבורי {\displaystyle B=TR} במפתח הציבורי המבוסס על הצורה הנורמלית של הרמיט (HNF) של R שהוא יותר קטן. שיפור נוסף הוא במקום להטמיע את המסר בנקודה בסריג אפשר להטמיעו בווקטור השגיאה {\displaystyle e} וכן אם עובדים עם מקבילון במקום עם המטריצה מקורית הטקסט המוצפן יהיה קטן משמעותית.

ההתקפות האפשריות נגד מערכת GGH הם:

1. ניחוש המפתח הפרטי R מתוך המפתח הציבורי B. לצורך כך אפשר להשתמש באלגוריתם LLL על המפתח הציבורי. אם האלגוריתם מצליח מתקבלת המטריצה {\displaystyle B'} שיכול להיות שתהיה טובה מספיק כדי לפתור את בעיית הווקטור הקצר ואז לשבור את המערכת. כדי למנוע התקפה כזו חובה לבחור בסיס מספיק גדול כך ששימוש באלגוריתם LLL לא יהיה יעיל.
2. ניסיון לנחש מידע על הטקסט המקורי לאור העובדה שווקטור השגיאה קטן. אם {\displaystyle c=vB+e} כאשר e הוא וקטור השגיאה אם מקדמים קטנים, אפשר בהתקפת כוח גס לנסות את כל האפשרויות של e. לצורך ההתקפה אפשר תחילה לחשב את {\displaystyle cB^{-1}} ואז לבדוק עבור כל עמודה אם הנורמה קטנה תמיד. אם כן יש סבירות שהעמודה מייצגת את המקדם המתאים ב-v. כדי למנוע התקפה זו סכימת ההמרה של המסר לנקודה בסריג חייבת להיות בטוחה או שאפשר לרפד את המסר בסכימת ריפוד תחילה.
3. ניסיון לפתור את בעיית הווקטור הקרוב ביותר בעזרת B באמצעות אלגוריתם ידוע כמו הטכניקה של בבאי. הבעיה כאמור קשה כל עוד הפרמטרים מבטיחים שהסריג אינו מכיל תבנית כלשהי המקלה על פתרון וכן שהוא מספיק גדול.

ב-1999 חוקרים מצאו בעיות מהותיות בסכמה המקורית שהוצעה על ידי גולדרייך גולדווסר והלוי, שנראה היה שלא ניתן לפתור אותן. ב-2012 הציעו Yoshino ו-Kunihiro פתרון. בגרסה המשופרת נראה שהבעיות תוקנו. אולם פותחו חלופות מתקדמות יותר כמו גרסאות של NTRU שגם יותר בטוחות וגם מציעות ביצועים אופטימליים ומהוות מתחרים ראויים לאלגוריתמים התקניים כמו RSA ודיפי הלמן.

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

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

יהי {\displaystyle L\in \mathbb {R} ^{2}} סריג אשר הבסיס שלו הוא המטריצה {\displaystyle B={\begin{pmatrix}17&0\\0&19\end{pmatrix}}}

וכן {\displaystyle T={\begin{pmatrix}2&3\\3&5\end{pmatrix}}} כך שמתקבל {\displaystyle B=TR={\begin{pmatrix}34&57\\51&95\end{pmatrix}}}
אם המסר הוא הווקטור {\displaystyle v=(2,-5)} וכן וקטור השגיאה {\displaystyle e=(1,-1)} כלומר \sigma=1. אז הצפנה היא:

{\displaystyle c=mBv+e=(-186,-362)}

לפענוח המקבל מחשב את:

{\displaystyle cR^{-1}\approx (-10.94,-19.05)}

יוצא ש-{\displaystyle vT=(-11,-19)} וכן {\displaystyle eB^{-1}\approx (0.06,-0.05)}. אם מעגלים את התוצאה ל-{\displaystyle (-11,-19)} אפשר לחלץ את המסר {\displaystyle v=(-11,-19)T^{-1}=(2,-5)}.

ראו גם
------

* הצפנת מפתח ציבורי
* חתימה דיגיטלית
* NTRU

הערות שוליים
------------

1. ↑  Oded Goldreich, Shafi Goldwasser, and Shai Halevi. Public-key cryptosystems from lattice reduction problems. In CRYPTO ’97: Proceedings of the 17th Annual International Cryptology Conference on Advances in Cryptology, pages 112–131, London, UK, 1997. Springer-Verlag.
2. ↑  Learning a Parallelepiped: Cryptanalysis of GGH and NTRU Signatures
3. ↑  Phong Q. Nguyen. Cryptanalysis of the Goldreich–Goldwasser–Halevi Cryptosystem from Crypto ’97. In CRYPTO ’99: Proceedings of the 19th Annual International Cryptology Conference on Advances in Cryptology, pages 288–304, London, UK, 1999. Springer-Verlag.
4. ↑  M. Yoshino, N. Kunihiro, Improving GGH Cryptosystem for Large Error Vector. International Symposium on Information Theory and its Applications (2012) 416-420.

| * צ
* ש
* ע
קריפטוגרפיה |
| --- |
| 

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

 |

 |
| 

| הצפנה קלאסית |
| --- |
| 
* מכונת הצפנה
* צופן החלפה
* צופן אתב"ש
* צופן קיסר
* צופן ויז'נר
* צופן ורנם
* צופן פלייפייר
* צופן היל
* אולטרה
* אניגמה
* ציקלומטר
* קולוסוס
* PURPLE
* ג'ייד
* מג'יק
* צופן שחלוף

 |

 |
| 

| צופן בלוקים |
| --- |
| 
* לוציפר
* AES
* 3DES
* DES
* Threefish
* Twofish
* Blowfish
* FEAL
* SEED
* CAST
* IDEA
* RC2
* RC6
* MARS
* RC5
* GOST
* Serpent
* MISTY
* KASUMI
* קמליה
* ARIA
* SAFER
* TEA
* LEA
* CLEFIA
* SEA
* Hummingbird
* PRESENT
* KATAN
* KeeLoq
* Simon & Speck
* אנוביס

 |

 |
| 

| אופני הפעלה |
| --- |
| 
* אופן הפעלה של צופן בלוקים
* EAX
* OCB
* IAPM
* CWC mode
* GCM
* CCM

 |

 |
| 

| צופן זרם |
| --- |
| 
* RC4
* Salsa20
* SOSEMANUK
* Grain
* E0
* A5/1
* A5/2
* A5/3
* A5/4
* MICKEY
* HC-128
* SNOW
* Trivium
* Rabbit
* ZUC
* ChaCha

 |

 |
| 

| הצפנה אסימטרית |
| --- |
| 
* פרוטוקול דיפי-הלמן
* חידות מרקל
* חתימת למפורט
* הצפנת תרמיל
* RSA
* הצפנת רבין
* חתימה דיגיטלית רבין
* צופן אל-גמאל
* חתימה דיגיטלית אל-גמאל
* DSA
* הצפנת בלום-גולדווסר
* ECC
* הצפנת קריימר-שופ
* הצפנת פאיי
* הצפנת מקאליס
* GGH
* NTRU
* עקום 25519
* חתימה דיגיטלית של שנור
* הצפנת אוקמוטו-אושיאמה

 |

 |
| 

| פרוטוקולים |
| --- |
| 
* עץ מרקל
* פרוטוקול אתגר-מענה
* פרוטוקול נידהאם-שרודר
* פרוטוקול קרברוס
* הוכחה באפס ידע
* פרוטוקול פייגה-פיאט-שמיר
* העברה עלומה
* חלוקת סוד
* TLS (SSL)
* Secure Shell
* MQV
* X.509
* פרוטוקול שיתוף מפתח
* מיסור שלא לפרסום
* פרוטוקול סיגנל

 |

 |
| 

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

 |

 |
| 

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

 |

 |
| 

| בעיות מתמטיות ואלגוריתמים |
| --- |
| 
* בעיית לוגריתם דיסקרטי
* תחשיב אינדקסים
* נפה ריבועית
* אלגוריתם rho של פולרד
* נפת שדה מספרים
* אלגוריתם רו של פולרד ללוגריתמים
* אלגוריתם פוליג-הלמן

 |

 |
| 

| פונקציות גיבוב קריפטוגרפיות |
| --- |
| 
* SHA
* MD5
* MD4
* SHA-1
* SHA-2
* SHA-3
* RIPEMD
* Skein
* BLAKE
* Grøstl
* SipHash

 |

 |
| 

| אימות וזיהוי |
| --- |
| 
* אימות זהות
* סיסמה
* קוד אימות מסרים
* Poly1305
* סיסמה חד-פעמית

 |

 |
| 

| נושאים נלווים |
| --- |
| 
* מספר אקראי
* מספר ראשוני
* יתירות
* מפתח שיחה
* סטגנוגרפיה
* הצפנה קוונטית
* הצפנה פוסט-קוונטית
* עקרון קרקהופס
* אבטחת מידע
* קריפטוגרפיה ויזואלית
* אליס ובוב
* מסיבת חתימה על מפתחות ציבוריים
* שידור מוצפן
* הצפנת דיסקים
* הצפנת סף
* חתימה דיגיטלית מבוססת פונקציית גיבוב
* פונקציה זניחה
* רשת פייסטל
* רשת החלפה-תמורה
* הלבנה
* אימות מסרים
* חתימה עיוורת
* חישוב רב משתתפים בטוח

 |

 |