מה הם המספרים הרנדומלים, והאם אפשר לייצר מספרים רנדומלים אמיתיים?

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

המחלקה random מייצרת לנו רצף מספרים שנקראים psuedorandom, כלומר: רצף מספרים הנוצרים דרך אלגוריתם ידוע שאפשר לשחזר בדיעבד שוב. האם עצם העובדה שאפשר לשחזר אותם הופכת אותם ללא רנדומלים? התשובה היא חלקית, ותלויה בצורך.

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

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

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

בגלל ש-psuedorandom אפשרי לשחזור (והוא חוזר על עצמו), הוא מהווה בעיית אבטחה כשנרצה לייצר מפתחות רנדומליים לתקשורת מאובטחת. הדרך הבטוחה ביותר להיענות לקושי הזה, הוא ע"י יצירת true random, רצף שהוא רנדומלי שבלתי אפשרי להתחקות אחריו. אז איך מייצרים true random? סוג של אי אפשר, לפחות המחשב הביתי שלכם לא יכול. המעבד שלנו פשוט לא מסוגל לייצר רצף שאינו תלוי באלגוריתמים וערכים שניתן לחזות- ולכן הוא לא באמת יכול לייצר רצף רנדומלי לחלוטין בכל פעם. על אף זאת הדרך לייצור true random היא לא בלתי אפשרית, ומבוצעת ע"י שימוש בצ’יפים מיוחדים שיודעים לקרוא ולחשב “תופעות” שקיימות בחוץ, שבעזרת הערכים שלהם ניתן לחשב true random. לדוגמה: טמפרטורה, מזג אוויר או אפילו מדידה של פליטת חלקיקים מגרעין האטום(רדיואקטיביות) שנחשבת לרנדומלית ו"לא ניתנת לחיזוי".

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

לטעון תגובות?