אתגר | האם אפשר להחזיר את התהליך אחורה?
-
כתבתי קוד משלי לשמירת סיסמאות בdb אקסס
זה הקוד:Public Function EncryptString(str As String) As String Dim i As Integer Dim encryptedStr As String Dim Doubl As Long Dim todivide As Long Dim encoded As Long encryptedStr = "" For i = 1 To Len(str) If i - 1 < 1 Then todivide = Len(str) Else: todivide = i - 1 If i + 1 > Len(str) Then Doubl = 1 Else: Doubl = i + 1 encoded = Asc(Mid(str, i, 1)) * Asc(Mid(str, Doubl, 1)) / Asc(Mid(str, todivide, 1)) If encoded = 32 Then encoded = encoded * Asc(Mid(str, Doubl, 1)) / Asc(Mid(str, todivide, 1)) If encoded = 13 Then encoded = encoded * Asc(Mid(str, Doubl, 1)) / Asc(Mid(str, todivide, 1)) Do While encoded >= 191 encoded = encoded - 191 If encoded = 32 Then encoded = encoded * Asc(Mid(str, Doubl, 1)) / Asc(Mid(str, todivide, 1)) If encoded = 13 Then encoded = encoded * Asc(Mid(str, Doubl, 1)) / Asc(Mid(str, todivide, 1)) Loop encryptedStr = encryptedStr & Chr(encoded) Next i EncryptString = encryptedStr End Function
התוצאות של הקוד שהזנתי הם
M›rG cfoq
האם אפשר לדבג אותם אחורה או שכתבתי מעולה?
-
@אוריי כתב באתגר | האם אפשר להחזיר את התהליך אחורה?:
האם אפשר לדבג אותם אחורה או שכתבתי מעולה
אני רוצה להציע אפשרות שלישית: ייתכן שקשה או בלתי אפשרי לדבג אחורה, אבל לא כתבת מעולה
קיבלתי מרבותי: "לא ממציאים שיטות הצפנה מקוריות"
ההסבר: (מדובר כאשר ההצפנה הוא לצרכי אבטחה) אבטחה הוא נושא רגיש, והצפנה הוא נושא מתמטי קשה כאשר פרט קטן יכול לשבש את כל הבטיחות של האלגוריתם. היו מקרים של אלגוריתמים שמומחים גדולים חשבו שהם טובים עד שהגיע אחד והצביע על חולשה. לכן סומכים על אלגוריתמים שעברו ביקורת של הרבה אנשים חכמים מאוד ולא מנסים להמציא משהו מקורי משלנו.לגבי עצם האתגר: גם בלי הרבה חישובים לכאורה אפשר להחליט שאי אפשר להחזיר את התהליך אחורה לגמרי מסיבה פשוטה: יש יותר מקלט אחד שיתאים לפלט של האלגוריתם. זה יכול להיות קצת בעיה באלגוריתם לשמירת סיסמאות...
אני לא טוב במתמטיקה ולא מומחה בקריפטולוגיה (וגם עצלן, אם אפשר להעביר ביקורת בלי להתאמץ עם חישובים מתמטיים, למה לא...), אבל חולשות שאני רואה מיד (לעומת אלגוריתם גיבוב בטיחותי כמו SHA1 לדוגמה)
- מה שהזכרתי למעלה: לכאורה יש אפשרות קלה מדי להתנגשויות (לא עיינתי כל הצורך בזה)
- האורך של הפלט תמיד זהה לאורך של הקלט, דבר שמגלה מידע חשוב לפורץ
- שינוי של חלק אחד של הקלט משנה רק מקומית את הפלט, תוקף יכול לזהות איזה מחרוזות יש להם חלקים זהים
בכל מקרה, יהיה מעניין גם לקבל תשובה לאתגר המקורי שלך: נסיון להחזיר אחורה את התהליך בלי brute force
אגב, הדבר הראשון שעשיתי כאשר קראתי את השאלה זה לבקש מ-chatGPT לתרגם את הקוד לשפה יותר קריאה...
-
@yossiz אני יודע שיכול להיות שלא כתבתי מעולה..
אני הגעתי למצב שבו אני צריך לכתוב את זה כי כל קוד שקיבלתי מ gpt החזיר שגיאה ולא היה לי כח להתאמץ ולמעשה התייאשתי מלכתוב את הקוד כלל.
דא עקא יום אחד עלה לי רעיון בענין הזה וכך מצאתי את עצמי יושב וכותב את הקוד הזה ובדקתי מול gpt והתשובה שלו הייתה שלא ניתן להחזיר את הגלגל אחורה היות וקיימים מספר פעמים של הכפלה וחילוק ואין לו שום אפשרות לדעת כמה פעמים זה נעשה ואם אני רוצה לקבל קוד שידבג אחורה אני צריך להביא לו את הסיסמה המקורית
אמנם ידעתי שכנראה לא כתבתי מעולה ואני רוצה לדעת מה הטעויות ואיך ניתן לשפר אותו לרמה מקצועית. -
-
@yossiz עברתי על הקישור ששלחת, וניסיתי והחזיר שגיאה ולאחר קריאה מעמיקה של הפוסט נכתב שם כך:
הערות על הקוד
חשוב. נמצא כי שגרות hash שגיאה בהגדרת Windows 10, 64 סיביות Office. עם זאת, בדיקה שלאחר מכן גילתה את הפתרון. פלטפורמת Windows חייבת לכלול את Net Framework 3.5 (כולל .Net 2 ו- .Net 3), גירסה ישנה זו, ולא רק את השירותים המתקדמים של Net Framework 4.8 שהופעלו בהפעלה וביטול של תכונות Windows. כאשר הוא נבחר שם, השגרה עבדה בצורה מושלמת.קוד ה- VBA להלן יוצר את התקצירים עבור קודי hash MD5, SHA1, SHA2-256, SHA2-384 ו- SHA2-512, עבור מחרוזות, באחת מתבניות הפלט hex או base-64. קידודים אלה עושים שימוש בפונקציות המובנות של MS Office, ומספקים תוצאות עקביות. צוין כי יישומים מקוריים במקומות אחרים עבור אותם תקצירים יכולים להיות שונים מאוד בתפוקות שלהם. רק דוגמה אחת ניתנה עם פרמטר זרע או מלח (StrToSHA512Salt), ויש לציין כי פלט המחלקה HMACSHA512 שונה מגיבובי המחלקה SHAManaged שניתנו בשאר. הכיתות המנוהלות נותנות את התוצאות הטובות ביותר המדווחות באופן נרחב. שים לב להפניות VBA הדרושות לפעולה נכונה. תזכורת לכך ניתנת בכמה כותרות נהלים.*
בכל מקרה, מתכנתים יכולים למצוא את ערכי הגיבוב שלא השתנו במערך הבתים() ובנקודה זו הם נמצאים בבתים של 8 סיביות, כלומר, המספרים המייצגים את קוד ASCI כפי שהוא חל על ערכת שמונה סיביות מלאה, 256 תווים. הקוד שלאחר מילוי מערך הבתים() בכל אחד מהמקרים קובע איזו גירסה של ערכת תווי ASCI לספק. עבור ערכת תווים משושה, 0-9 ו- A עד F, ערכת הסיביות הכוללת מחולקת למספר כפול של ארבעה בתים, ולאחר מכן מוחזרת לשימוש. עבור קבוצת Base-64, אותיות קטנות, אותיות גדולות ומספרים שלמים בעיקר, תווים של שישה סיביות מיוצרים לפלט. שתי קבוצות אלה הן השימושיות ביותר כאן, שכן הן מורכבות מתווים נפוצים. ערכות ASCI 128 ו- 256 מלאות מדי בתווים אקזוטיים ולא מודפסים מכדי להיות שימושיים. עבור כל גרסת גיבוב ספירת הסיביות שלה היא קבועה, ולכן אורך הפלט שלה ישתנה בהתאם לסוג שנבחר.
וכפי שאני מבין אני צריך להיות מוגבל עם הקוד הזה שזה יעבוד רק למי שמותקן אצלו Net Framework 3.5 (כולל .Net 2 ו- .Net 3) שהיא גירסה ישנה ואני רוצה שיעבוד לכל מי שאני מביא לו את התוכנה (קודים מעין אלו הgpt הביא לי בכמויות...)
-
@אוריי
מן הסתם הסיכון באפליקציה כמו שלך קטן יחסית, אני מניח שזה לא להפצה המונית
אני עדיין טוען שהדבר האידיאלי הוא להשתמש באלגוריתם גיבוב מוכר וידוע כבטוח, ציינתי כמה חולשות באלגוריתם שלך, ואולי יש נוספות, אבל אפשר להסתכל על זה בהקשר הכללי של אפליקציה עם סיכון יחסית קטן
אני מבין שקשה לך למצוא פתרון חוצה מחשבים/מערכות הפעלה שיעבוד במאה אחוז, זו כבר שאלה ספציפית לגבי אקסס שאין לי את הידע לענות