עבור לתוכן

Rijndael ב#c

Featured Replies

פורסם

הבנתי שיש ב#C סיפרייה בשביל זה, איך משתמשים בה? אם לדוגמא אני רוצה להצפין/לפענח משהו איך עושים את זה, ראיתי כמה דוגמאות (גם את הדף של זה בMSDN) ולא הבנתי מה אני אמור לעשות.:huh:, אשמח לעזרה.

פורסם

בבקשה:

http://stackoverflow.com/questions/6482883/how-to-generate-rijndael-key-and-iv-using-a-passphrase

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

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

פורסם
  • מחבר

אני חייב להשתמש בrfc2898... אני רוצה להשתמש בסיסמא קבוע שאני ייצרתי (או שיותר נכון, במקרה הזה, הביאו לי)' זה אפשרי?

מה זה כל הmemorystream והcryptostream?

תודה על התשובות.

פורסם
אני חייב להשתמש בrfc2898...

אתה אומר או שואל?

וכשאתה אומר "סיסמה", אתה מתכוון מחרוזת סיסמה (כמו "abcabc1234") או שאתה מתכוון למפתח (32 בתים)?

פורסם
  • מחבר

אני שואל, ובסיסמה התכוונתי למפתח הצפנה/פיענוח, אגב מה זה הiv?

אני מצטער על כל השאלות פשוט אף פעם לא השתמשתי בספרייה של האבטחה, קיבלתי אתגר לפענח קובץ שמוצפן בעזרת rijndeal.

באותו דף אינטרנט היה כתוב את זה: Passphase: John Algorithm: Rijndael והתנגן קובץ MP3 שאני חושב שהוא הקובץ המוצפן שאני אמור לפענח, באינטרנט יש כמה אתרים שמפענחים און ליין אבל חשבתי שזה רעיון טוב לעבוד פעם עם הספרייה הזאת, לכן אני אשמח לכל עזרה כדי להבין מה עושים עם הספרייה הזאת, כי הmsdn פשוט מסבכים את זה לגמרי.

נערך על-ידי eido300

פורסם

מנגנון Rijndael מקבל שלושה דברים בשביל להצפין/לפענח באמצעותם:

א. סתר או גלוי

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

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

אם רוצים אפשר שה-IV יהיה קבוע, אבל יותר בטוח שיהיה אקראי.

מנגנון Rijndael בפני עצמו לא מכיר את הדבר שנקרא passphrase (שזה סיסמה, במקרה שלך "John"). השיטה הנהוגה היא להשתמש במנגנון אחר כלשהו שמקבל סיסמה כזו ומייצר ממנה את 32 בתי המפתח ו-16 בתי ה-IV - לדוגמה המחלקה Rfc2898DeriveBytes שהזכרתי. אבל כפי שאמרתי, האובייקט הזה לא מספיקה לו רק סיסמה, הוא גם צריך לקבל מערך של בתים בשם salt על מנת לייצר את הסיסמה (ה-salt הזה הוא פשוט מערך בתים אקראי שגם הצד המצפין וגם הצד המפענח צריכים להכיר. הוא יכול להיות קבוע, והוא יכול להיות משודר בגלוי לצד הסתר).

אם תשלח את הלינק לאתגר אולי אני אוכל להבין יותר טוב איך לעזור.

פורסם
  • מחבר

תודה רבה על התשובה.

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

לא ממש הבנתי מה התפקיד שלו בכל הסיפור הזה...

http://www.trythis0ne.com/levels/cryptography/Walrus/

וזה הקישור לאתגר.

תודה רבה על כל העזרה

פורסם
  • מחבר

נכון, יש גם און ליין, לדוגמא:

http://rijndael.online-domain-tools.com/

אבל אני מעדיף לנצל את זה כדי ללמוד משהו חדש, בכל זאת בגלל זה אני שם - כדי ללמוד.

נערך על-ידי eido300

פורסם

ה-IV קשור ל-Cipher Mode (שים לב שבאתר שקישרת אליו, כשאתה בוחר ECB אז אין IV, ובכל שאר האופציות יש - זה כי ב-ECB אין צורך ב-IV).

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

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

שאר השיטות יוצרות תלות בין הבלוקים. השיטה הכי נפוצה (והיא ברירת המחדל ב-Rijndael של #C) נקראת CBC. הרעיון בה הוא שעל מנת להצפין בלוק של גלוי, קודם כל מקסרים אותו (עושים XOR) עם בלוק הסתר הקודם לו, ואז מצפינים את התוצאה. על מנת לפענח, קודם כל מפענחים ואז מקסרים את התוצאה עם בלוק הסתר הקודם כדי לקבל בחזרה את הגלוי. דהיינו, בלוק הסתר מס' 2 = הצפנה של (בלוק גלוי מס' 2 XOR בלוק סתר מס' 1). השאלה שנותרת היא - איך מצפינים את הבלוק הראשון, שהרי אין שום בלוק סתר לפניו? מה שעושים הוא לבחור 16 בתים אקראיים שנקראים ה-IV ולהתייחס אליהם בתור "בלוק סתר מס' 0". על מנת לפענח, הצד השני צריך לדעת את מפתח ההצפנה וגם את ה-IV (שבדרך כלל משודר בגלוי). בלי ה-IV, אגב, עדיין אפשר לפענח את כל הסתר חוץ מאת הבלוק הראשון.

אם תשים לב, ל-Rijndael ב-#C יש שדה בשם Mode שקובע באיזו שיטה מהנ"ל משתמשים. ב-ECB אין צורך לתת למנגנון IV.

פורסם
  • מחבר

אחלה, סוף סוף הבנתי את זה, ממש תודה רבה.

רק עוד שאלה אחת מה זה ה-cryptostream וה-memorystream בקישור הראשון שהבאת לי?

פורסם

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

לדוגמה:

FileStream זו מחלקה שכותבת את הבתים לתוך קובץ, או קוראת ממנו.

NetworkStream זו מחלקה ששולחת את הבתים לשרת דרך האינטרנט.

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

יש סטרימים שיכולים לעטוף סטרימים אחרים ועושים עיבוד ביניים. לדוגמה, GZipStream היא מחלקה כזו. היא מקבלת כפרמטר אובייקט אחר מטיפוס Stream, ואז כשאתה קורא לפונקציה Write אז המחלקה מבצעת עיבוד כלשהו (במקרה של GZipStream העיבוד הזה הוא כיווץ המידע) ואז מזינה אותו לסטרים הפנימי (גם ע"י הפונקציה Write). אם לדוגמה הסטרים הפנימי הוא FileStream אז התוצאה תיכתב לתוך קובץ. אם הסטרים הפנימי הוא MemoryStream אז התוצאה תישמר בזכרון. CryptoStream הוא עוד סטרים כזה, שעיבוד הביניים שלו הוא להצפין או לפענח את המידע שעובר דרכו.

לדוגמה, אפשר לקחת NetworkStream, לעטוף אותו ב-CryptoStream ולעטוף את זה ב-GZipStream, ואז כל מה שתכתוב לתוך ה-GZipStream הזה אוטומטית יכווץ, יוצפן וישלח ברשת.

נערך על-ידי שניצל

פורסם
  • מחבר

תודה רבה על כל העזרה והתשובות.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים