קידוד, הצפנה והאשינג
אוקיי, זה טקסט שלי, Cypher, על קידוד, הצפנה, האשינג וכל מה שקשור,
בטקסט הזה אני הולך להסביר לכם על ההבדלים בינהם, סוגים שונים של כל אחד, פיענוח ופיצוח ועוד.
=======
קידוד
=======
הרבה אנשים נוטים לחשוב שקידוד והצפנה זה אותו דבר. זה לא נכון, אבל ההבדל דק למדי.
בשני השיטות יש מחרוזת/מסר שצריך להצפין שנקרא plaintext
כלומר, הטקסט לפני ההצפנה, הטקסט ה"רגיל".
שאחרי הפעולה נהפך לciphertext, ולא זו לא טעות כתיב
מה שאומר טקסט מקודד, שניתן לקרוא אותו רק לאחר פיענוח.
מה ההבדל? בהצפנה כל פעם שמצפינים, יש לפענח בצורה יחודית, בקידוד לא.
למשל, סוג של קידוד הוא העברה לבסיס הקסדצימלי.
במקרה כזה, כדי לפענח כל טקסט שקודד כך, יש להעביר אותו בחזרה לטקסט קריא ע"י היפוך הפעולה.
למה זה נחשב קידוד? בגלל שאין צורך במפתח מיוחד כדי לפענח את זה. יש רק דרך אחת לקדד כל מחרוזת
ודרך אחת לפענח אותה. בעצם, קידוד לא נועד לשם אבטחה, מכיוון שכל אחד יכול לפענח ולהעביר את הciphertext
שלנו בחזרה לplaintext.
אם לא הבנתם עדיין למה זה קידוד ובמה זה שונה מההצפנה, תקראו את החלק שעוסק ב:
======
הצפנה
======
הגענו להצפנה. אתם בטח נורא מאושרים.
הצפנה דומה לקידוד בכך שגם פה, יש לנו מחרוזת plaintext
שאחרי פעולה כלשהיא הופכת לciphertext.
השוני פה הוא היחודיות של כל הצפנה, שנובע מהמפתח.
איך זה עובד? לפני שמתחילים נבחר אלגוריתם מסויים, שיקבע איזה באיזה פעולות נשתמש כדי להצפין את המחרוזת.
אחרי זה, בודקים לאיזה קטגוריה שייך האלגוריתם: סימטרי או אסימטרי.
במקרה שהמפתח סימטרי: נבחר מפתח אחד, שיש גם לאדם השולח את המסר וגם לאדם שמקבל את המסר, שזה כמובן אותו מפתח.
לפי המפתח, הטקסט מעובד בעזרת האלגוריתם. ויוצא לנו מכל הסיפור ciphertext. אחרי זה, מקבל המסר משתמש בפעולה הפוכה, עם שימוש באותו מפתח, כדי לקבל plaintext מהמחרוזת המוצפנת. המפתח הוא משהו שמייחד את ההצפנה, בכל הצפנה המתפתח שונה ולכן אדם שאין לו את המפתח לא יוכל לפענח את המסר(אלא אם כן הא ינסה מפתחות באקרי, מה שגם אפשרות). כאן גם יש שני סוגים עיקריים: מונואלפבתיים ופוליאלפבתיים.
צופן מונואלפבתי: צופן הידוע גם בעברית כ"חד-חד ערכי", הוא צופן שבו לכל אות יש ערך אחד בלבד.
לדוגמא, אם קבענו שבצופן שלנו האות C תסומן ע"י המספר 9, כל פעם שיופיע המספר 9 בciphertext זו תהיה האות C.
הבעיה בצפנים כאלה היא: ניתן לפצח אותם ללא ניסוי של הרבה סיסמאות ו/או ידיעת המפתח. ניתן לדעת לדוגמא, שהאות e היא האות הכי שכיחה באף-בית האנגלי וגם האות הכי שכיחה בסוף מילה, או שאחרי האות q תמיד באה האות u. בעזרת רמזים כאלה ניתן לפענח את הטקסט ללא הסיסמא. מילים כמו Tommorrow, people, banana, beginning קלות לזיהוי בגלל חזרת האותיות בהם, וברגע שמגלים שהאות T במילה tommorrow מסומנת באות I, בכל מקום בטקסט המוצפן שמופיע האות I נוכל להציב במקומה T, וכך הלאה.
בקיצור, החולשה של הצופן המונואלפבתי: ברגע שהמפענח איך אות מסויימת מוצפנת, הוא יכול בוודאות לרשום את האות בכל מקום שהסימון מופיע.
צופן פוליאלפבתי: כאן נכנסים הצפנים ה"חזקים" יותר. בצופן פוליאלפבתי האות I בטקסט המוצפן יכולה להתפרש כM בחלק אחד, J בחלק אחר וX בחלק שלישי. למשל, אם נשתמש ברצף מספרים כדי להצפין את הטקסט, ונזיז כל אות במחרוזה לפי הרצף הזה(שחוזר על עצמו עד שלא נגמר הטקסט, אז זו בעצם תהיה הצפנה פוליאלפבתית. לדוגמא, אם מעל האות E פעם מופיע המספר 4 ופעם המסר 6, שני הסימונים של E יהיו שונים.
לדוגמא: נשתמש במחרוזת john כדי להצפין את המילה impending
ניקח את המילה ונציב במקום האות שמופיע ראשונה בABC, שהיא h, את המספר 1
במקום האות השניה, שהיא J, נציב 2
וכך הלאה, עד שנקבל
j - 2
o - 4
h - 1
n - 3
נקבל את המספר 2413
בעזרתו נצפין את המילה:
241324132
impending
כמו שאתם רואים, זה חוזר על עצמו עד אורך המילה. זה גם יכול להקטע באמצע.
241324132
kqqhphjqi
כמו שאתם רואים, האות N, לדוגמא, מיוצגת פעם ע"י האות P ופעם ע"י האות Q.
אם תזיזו כל אות בחזרה לפי המספר מעליו, תקבלו את המסר המקורי - המילה impending.
כמובן שהאלגוריתם הזה הינו פרימיטיבי למדי ואינו שימושי. אם אתם רוצים לדעת על צפנים פוליאלפבתיים חזרים
תחפשו מידע על:
הצופן של PORTA
הצופן של PLAYFAIR
או פשוט
polialphabetic encryption
---------------------------------------------------
עכשיו נעבור ל:
צפנים אסימטריים: צופן אסימטרי דומה לצופן סימטרי, אבל יש בו הבדל משמעותי: יש בו שני מפתחות במקום אחד.
אחד מהמפתחות הוא המפתח ה"סודי", או ה"סגור", שנמצא ע"י מקבל המסר בלבד. המפתח השני הוא המפתח ה"פתוח"
שאינו נשמר בסודיות. יש קשר בין שני המפתחות, אבל הסיכוי לדעת את המפתח הסגור בעזרת המפתח הפתוח הוא אפסי.
בכל מקרה, המפתח הפתוח משמש רק לשם הצפנת מסרים, והמפתח הסגור - רק לשם פיענוחם. זאת אומרת, שכל אחד יכול להשיג
את המפתח הפתוח ולשלוח מידע, אבל אף אחד לא יכול לפענח את המידע הזה חוץ מהאדם שיש לו את המפתח הסגור.
בשיטה הזאת משתמשים הרבה כדי להעביר מידע באינטרנט. כדי לאמת שרק הנמען יקבל את המידע, לדוגמא כרטיס האשראי,
ברגע שהמידע נשלח הוא מוצפן עם המפתח הפתוח, שהוא כמובן שונה מאתר לאתר, ורק הנמען יכול לקבל אותו, כל אחד
אחר שיקבל את המידע לא יוכל לקרוא אותו, כי אין ברשותו את המפתח שמשמש לפיענוח המידע.
מכאן יוצא - לכל נמען אשר צריך שישלחו אליו מידע בצורה מוצפנת, יש מפתח פתוח יחודי ומפתח סגור יחודי.
בראשון יש שימוש לכל מי שרוצה לשלוח מידע, והשני נמצא אצל הנמען עצמו בלבד - כדי שרק הוא יוכל לקרוא את המידע המוצפן.
דוגמא טובה לשימוש בהצפנה כזאת הוא הSSL הנודע שמשמש בהרבה אתרים להעברת מידע בטוחה. בSSL יש מפתח סודי ולא סודי, כמו שפירטתי עליהם מעל.
פו, סיימנו עם הצפנות, זה הזמן לעבור לחלק האחרון:
======
האשינג
======
הרבה אנשים חושבים שהאשינג זהה להצפנה. זה ממש לא נכון, ואת זה אפשר לראות ברגע שרואים למה משמש האש ולמה משמשת הצפנה.
ע"י הצפנה, ניתן להעביר מסרים בבטיחות ממוען לנמען. באשינג משמש רק על מנת להגיד "כן" או "לא" במקרה שהמחרוזת מתאימה.
האשינג הוא בלתי הפיך. כלומרף לא ניתן למצוא את המחרוזת המקורית ע"י היפוך פעולת ההאש, בגלל העובדה שיש להאש מסויים אינסוף מחרוזות שיכולות להביא אותו ערך.
לדוגמא, אם לכל אות נשים את הערך שלה בABC ונכפול את הערכים, זוהי פעולת האש:
המילה: hello
8*5*12*12*15=86400
אז ההאש שלנו הוא 86400
אין דרך לדעת מה המחרוזת המקורית, בגלל שיש עוד צירופים הנותנים אותו ערך.
עכשיו, אם זה לא משמש להעברת מידע, למה זה טוב?
כדי להחזיר ערכים שלtrue וfalse, נכון או לא נכון.
לדוגמא, אם כדי להכנס לאתר שלי אני צריך לאמת סיסמא
ובוצע על הסיסמא האש
ברגע שהמשתמש לוחץ על שלח, הסיסמא עוברת תהליך של האש ומשווית להאש של הסיסמא המקורית
במקרה ויש התאמה, הערך המוחזר הוא true ולמשתמש ניתנת גישה.
עכשיו הבעיה: כמו שאמרתי, יש אינסוף ערכים אשר מביאים אותו האש. גם המחרוזת lleoh
וגם
lhloe
וכל דבר אחר דומה יחזיר אותו ערך, וגם
jdllo
כי גם 10*4 זה 40.
שוב השאלה: למה זה טוב? זה לא, ובגלל זה האלגוריתמים אשר משתמשים בהם בשביל האשינג הם הרבה יותר חזקים ומסובכים.
באלגוריתמים כאלו, הסיכוי ששני מחרוזות יתנו אותו האש הוא אפסי.
אחד האלגוריתמים הכי נפוצים להאשינג הוא הmd5, שזה ראשי תיבות של message digest 5
רוב השימוש בו הוא במערכות php עם דטבייס ואימות סיסמא. במקרה הזה הסיסמא נשלחת לשרת, אשר מבצע עליה האשינג
ומשווה אותה לסיסמא שיש לו בדטבייס. בגלל שהאלגוריתם הוא חזק ויציב, הסיכוי שתכניסו סיסמא לא נכונה ותקבלו אותו האש היא אפסית
אבל הסיכוי עדיין קיים. מה שקורה רוב הזמן, זה שאם הסיסמא לא מתאימה בדיוק
(אבל ממש בדיוק, יש הבחנה בין אותיות גדולות וקטנות) השרת יחזיר 0, או false או בקיצור: אין גישה.
בmd5 משתמשים גם במערכות linux כדי לאמת תקינות של קבצים. בתוך הקובץ כלול ההאש md5 שלו, שמורכב מגודלו,סוגו ועוד.
המערכת בודקת עם ההאש בתוך הקובץ שווה להאש של הנתונים של הקובץ, וא כן היא מסיקה שהובץ תקין ולא התרחשו שגיאות.
במערכת חלונות לעומת זאת, יש שימוש באלגוריתם crc32 שהוא הרבה יותר חלש מבחינת אבטחה,
אבל משמש נהדר לבדיקת תקינותם של קבצי ארכיון(זיפ וראר). הבדיקה היא אותה בדיקה, רק האלגוריתם שונה.
-------------------
פיצוח האש?
אוקיי, זו שאלה שנשאלת הרבה. השגתי האש של סיסמא(בד"כ ממסד נתונים של מערכת php), איך אני מגלה
את הסיסמא?
הדרך הכי נפוצה היא הברוט פורס, שזה כולל הצפנה של מיליוני סיסמאות ובדיקה של תאימות, עד
שמוצאים סיסמא שההאש שלה שווה להאש שאתם רוצים "לפענח". עוד שיטה זה שימוש בטבלאות ריינבוו
(קשת, או rainbow), שזה בעקרון אותו דבר, רק זה מכין טבלאות מסודרות מראש עם כל האפשרויות שיש,
וכשצריכים לפצח האש, היא מחפשת בין המידע בטבלאות להתאמות. השיטה הזאת איטית יותר בהתחלה, כשצריך ליצור את הטבלאות,
שלא לדבר על כך שהטבלאות עצמן תופסות הרבה מאוד מקום בדיסק הקשיח שלכם.
אם יש לכם כמה(הרבה) ג'יגה פנויים, ויש לכם הרבה סיסמאות לפצח, לכו על ריינבוו, אחרת, תשארו עם הברוט פורס.
-------------------------------
-------------------------------
======
תוספות
======
תוכנות שימושיות:
cain - תוכנה לפריצת הצפנות והאשים למינהם:
http://www.oxid.it/cain.html
john the ripper - עוד כלי לפריצת סיסמאות מוצפנות/האשים
http://www.openwall.com/john/
Rainbow crack - שימוש בטבלאות ריינבוו ע"מ לפצח האשים
http://www.antsight.com/zsl/rainbowcrack/
====
קודי מקור להצפנות שונות:
בקרוב =]
עד כאן, מקווה שנהנתם, ואם לא, לא נורא.
Cypher.
*הטקסט שייך לסייפר אין להעתיק לשכפל בלה בלה בלה בלה בלה בלה...*