חזרה

רנדומליות - בקוד. איך זה יכול לעבוד??? 🤔

תוכנה מייצרת מספרים אקראיים: כשחושבים על זה פתאום זה נשמע סותר? מתברר שזה קצת מסובך >>>


זה בטח מסקרן כל מי שנפגש עם תוכנה-קוד-וכל עולם הפיתוח - מה עומד מתחת למנוע של הפונקציות האקראיות (= הכוונה לפונקציות שמייצרות מידע וערכים אקראיים. בכל שפה יש לפחות פונקציה אחת שפשוט מייצרת סטרינג - בדרך כלל מספר - אקראי, לפי פרמטרים. לדוגמא ()Math.random ב-JS, או עם הספריה random בפייתון - כזה print(random()), ב-PHP יש את ()rand וכו')??

לדוגמא קוד HTML פשוט לכפתור שבלחיצה עליו - מופק מספר אקראי:

<p id="random"></p>
<button style="color:brown" onclick="document.getElementById('random').innerHTML = Math.random()">צור מספר אקראי</button>

הנה מה שנוצר מזה:

איך זה עובד?

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

איך לא יושב האקר ופשוט מפענח איזה מספרים אמורים לצאת על פי האלגוריתם?

אנטרופיה (הסתברותית)

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

בלעדינו לא הייתה רנדומליות..

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

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

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

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

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

חשוב לשים לב, בפונקציות פשוטות כמו random ב-JS או PHP - המספר האקראי שחוזר איננו מספר אקראי אמיתי! זה מספר 'פסאודו-רנדומלי' (יתואר בקטע הבא).
השימושים ברנדומליות מבוססת אנטרופיה מצויים בשפות גבוהות יותר, ובמקומות שקשורים יותר להצפנה.

פייק-רנדומליות

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

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

רעש אטמוספרי..

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

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

  • תהליכי פליטת רדיואקטיביות של אטומים (כלומר נתוני הפליטה. קצב וכדו')
  • רעש חשמלי ("רעש ג'ונסון" - רמות 'רעש' שנוצרות ממעבר של אלקטרונים במוליך חשמלי)
  • רעש צילום ("רעש שוט" - עיוותים ויזואליים - תוצאה של שינויים של חלקיקים. צַלָמים מכירים את זה)
  • פיגור של שעונים (אנלוגיים. אין שעון שלא מפגר. אין 😁)

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

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

מחולל מספרים אקראיים - קוד סגור 😥

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

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

אמ;לק

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


קצת מ"מ:

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


אם יש לכם איזו שאלה ❔✨ או כל תגובה 💬, הארה 💡 והערה ❕ שהיא על הפוסט - אשמח מאוד! אם תכתבו אותה בהערות כאן למטה
פשוט להתחבר עם חשבון גיטהב ולהגיב 🎉