מה ההבדל בין הצפנה ל-hash

ארוך מידי לא קראתי:

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


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


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

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

דוגמאות לאלגוריתמי הצפנה נפוצים הם: AES, blowfish, twofish, RSA, Triple DES.

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

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

רוב אלגוריתמי ה-hash המשומשים הם אלגוריתמים שבהם מחרוזת ה-hash המתקבלת היא בעלת אורך קבוע, דוגמה לאלגוריתמי hash נפוצים: md5, sha-1, sha-2.

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

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