Java הבנת קטע קוד ממטלה בקורס - encryption / decryption - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

Java הבנת קטע קוד ממטלה בקורס - encryption / decryption


daniel4x

Recommended Posts

שלום לכולם ,

התחלתי במסגרת התואר במדעי המחשב קורס מבוא לסייבר - כרגע אני ממש בתחילת התואר והידע שלנו בjava מאוד מועט - יש לי בסיס מעט יותר טוב בc#.

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

אני ידוע איך מצפינים באמצעות הקוד (לפחות בערך) ומה המשמעות של בחירת המפתח (גם בערך.... :/ ).

אשמח להסבר על אופן הפעולה של התוכנית ואפילו למעקב אחר אופן הפעולה של התוכנית .

כמו כן איך בדיוק עובד הפיצוח של ההצפנה.

import java.util.Random;/**
* this class represents a naive symmetric encryption algorithm.
* DO NOT use it for real encryption it
is much too weak for
educational use only!!
* @author boaz
*/
public class Simple_Enc {
public static int KEY = 12345678;
public static void main(String[] a) { simple_test0(); }
/** DO NOT change! use this code for all encryption / decryption tasks in Ex1. **/
public static String enc(String msg, int key) {
String ans = "";
Random rand = new Random(key);
for(int i=0;i<msg.length();i=i+1) {
char c = msg.charAt(i);
int s = c;
int rd = rand.nextInt()%(256*256);
int s2 = s^rd;
char c2 = (char)(s2);
ans +=c2;
}
return ans;
}
public static void simple_test0() {
String msg = "1234567890 עברית abc";
String msg_enc = enc(msg,KEY);
String msg_dec = enc(msg_enc, KEY);
System.out.println("Orig: "+msg);
System.out.println("Enc: "+msg_enc);
System.out.println("Dec: "+msg_dec);
}
}
/** run example:
Orig: 1234567890 עברית abc
Enc:

קישור לתוכן
שתף באתרים אחרים

בבסיסן Java ו-#C הן שפות די דומות - הקוד הזה די זהה לקוד המקביל אליו ב-#C, והמעט הבדלים הם די מובנים מאליהם לדעתי.

מה בדיוק אתה לא מבין?

נכון לגבי הjava ו c# ושמתי לזה לב שגם בתחביר הם מאוד מזכירות אחת את השניה (אני עדיין בשיעור השני רק בJAVA וזה מבוא מאוד קל), הידע שלי בc# הוא ברמה של 5יח"ל בתיכון זה הכל ככה שזה לא הרבה בכלל בלשון המעטה.

בגדול מה שלא מובן לי כ"כ זה למה הוא את הקלט לדוגמה של הKEY ב public static (אם זה משנה משהו), אלה דברים שלא מובנים לי מאלה .

בכל אופן אבל זה לא ה"עיקר" של מה שאני שובר עליו את הראש...

את הלולאה עצמה של הfor בעיקר איבדתי את עצמי בשורה של הכנסת ערך ל int rd מה קורה בפעולה שם בעצם, הבנתי שהוא הגדיר לפני כן סוג של ראנדום שקשור איכשהו ל(key) (לפני הלולאה יש הגדרה כלשהי שם לrandom).

דבר שני הוא הכניס לs2 את הערך של s^rd והמיר אותו ל char, ממה שידוע לי הערך שם (שוב תלויי מה מקבל rd) אמור להיות שארית החלוקה של הראנדום שמוגרל ב256*256 (זה בעצם 65536 מספר הפורטים שיש קשור איכשהו?).

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

אני מכיר לצורך העניין קליטה של משתנה ב

Myconsole.read .... בגאווה או console.readline בc#.

למעשה הקליטה פה מתבצעת ישר בתוכה הקטע קוד אם הבנתי נכון?

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

public static void simple_test0() {

String msg = "1234567890 עברית abc";

String msg_enc = enc(msg,KEY);

String msg_dec = enc(msg_enc, KEY);

System.out.println("Orig: "+msg);

System.out.println("Enc: "+msg_enc);

System.out.println("Dec: "+msg_dec);

מצטער על החפירה תודה על התשובה הזריזה.

קישור לתוכן
שתף באתרים אחרים

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

ג'אווה זה לא השפה שלי, אבל בגדול הרעיון הוא:

KEY הוא משתנה סטטי שמאחסן את ה"מפתח" להצפנה. בדיעבד זה לא בדיוק מפתח, זה seed. המחלקה Random היא לא באמת רנדומלית. אם נספק seed זהה לתוך Random נקבל מופע מחלקה (rand) שיחזיר את אותם המספרים בדיוק באותו הסדר כשנקרא לשיטה שלו (nextInt). כלומר גם בהצפנה וגם בפענוח, התוצאה שתאוחסן ב rd תהיה זהה.

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

הסבר בוויקי.

קישור לתוכן
שתף באתרים אחרים

אחרי שקראתי מעט במהלך היום הבנתי איך הקוד עובד (רובו לא הכל) , את הXOR אם הבנתי נכון בעצם הוא מקבל 2 משתנים ומחזיר ערך חדש, לא הבנתי בעצם מה נקודה בזה שהוא מבטל את עצמו, הוא קיבל 2 משתנים דומים? אז מה הנקודה פה?

בנוסף קיבלנו מטלה לכתוב תוכנה שמפענחת את מה שהאחרים הצפינו עם Key משלהם .

יש כיוון מאיפה אני מתחיל ? איך?

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...