ΕΡΓΑΣΙΑ Διδάσκων: Γιώργος Χρυσάνθου Υπεύθυνος Άσκησης: Πύρρος Μπράτσκας Ημερομηνία Ανάθεσης: 3/10/015 Ημερομηνία Παράδοσης: 09/11/015 09:00 π.μ. I.Στόχος Στόχος αυτής της εργασίας είναι η χρησιμοποίηση βρόγχων, πινάκων, δομών ελέγχου, συμβολοσειρών και μεθόδων. Διαβάστε προσεχτικά το πρόβλημα και κατανοήστε τι πρέπει να γίνει. Μετά εκτελέστε παραδείγματα στο χέρι. Γράψετε κάτω ποιες μεταβλητές και τύποι δεδομένων πιστεύετε θα είναι χρήσιμες στη λύση του προβλήματος. Στη συνέχεια γράψτε μια λίστα με λειτουργίες που θα ήταν χρήσιμες για την λύση του προβλήματος. II. Εισαγωγή Κρυπτογράφηση (encryption) ονομάζεται η διαδικασία μετασχηματισμού ενός μηνύματος σε μία ακατανόητη μορφή με τη χρήση κάποιου κρυπτογραφικού αλγορίθμου ούτως ώστε να μην μπορεί να διαβαστεί από κανέναν εκτός του νόμιμου παραλήπτη. Η αντίστροφη διαδικασία όπου από το κρυπτογραφημένο κείμενο παράγεται το αρχικό μήνυμα ονομάζεται αποκρυπτογράφηση (decryption). Η ορολογία που χρησιμοποιείται σε αυτό το τομέα της πληροφορικής περιλαμβάνει τους παρακάτω όρους: Κρυπτογραφικός αλγόριθμος (cipher) είναι η μέθοδος μετασχηματισμού δεδομένων σε μία μορφή που να μην επιτρέπει την αποκάλυψη των περιεχομένων τους από μη εξουσιοδοτημένα μέρη. Κατά κανόνα ο κρυπτογραφικός αλγόριθμος είναι μία πολύπλοκη μαθηματική συνάρτηση. Αρχικό κείμενο (plaintext) είναι το μήνυμα το οποίο αποτελεί την είσοδο σε μία διεργασία κρυπτογράφησης. Κλειδί (key) είναι ένας αριθμός αρκετών bit που χρησιμοποιείται ως είσοδος στη συνάρτηση κρυπτογράφησης. Κρυπτογραφημένο κείμενο (ciphertext) είναι το αποτέλεσμα της εφαρμογής ενός κρυπτογραφικού αλγόριθμου πάνω στο αρχικό κείμενο. Η διαδικασία της κρυπτογράφησης και της αποκρυπτογράφησης φαίνεται στο παρακάτω σχήμα. Εικόνα 1 Ένα τυπικό σύστημα κρυπτογράφησης - αποκρυπτογράφησης. ΕΠΛ131 Υπεύθυνος εργασίας: Πύρρος Μπράτσκας 1
Η κρυπτογράφηση και αποκρυπτογράφηση ενός μηνύματος γίνεται με τη βοήθεια ενός αλγόριθμου κρυπτογράφησης (cipher) και ενός κλειδιού κρυπτογράφησης (key). Συνήθως ο αλγόριθμος κρυπτογράφησης είναι γνωστός, οπότε η εμπιστευτικότητα του κρυπτογραφημένου μηνύματος που μεταδίδεται βασίζεται ως επί το πλείστον στη μυστικότητα του κλειδιού κρυπτογράφησης. Το μέγεθος του κλειδιού κρυπτογράφησης μετριέται σε αριθμό bits. Γενικά ισχύει ο εξής κανόνας: όσο μεγαλύτερο είναι το κλειδί κρυπτογράφησης, τόσο δυσκολότερα μπορεί να αποκρυπτογραφηθεί το κρυπτογραφημένο μήνυμα από επίδοξους εισβολείς. Διαφορετικοί αλγόριθμοι κρυπτογράφησης απαιτούν διαφορετικά μήκη κλειδιών για να πετύχουν το ίδιο επίπεδο ανθεκτικότητας κρυπτογράφησης. III. Αλγόριθμος κρυπτογράφησης/αποκρυπτογράφησης Στην εργασία αυτή πρέπει να δημιουργήσετε ένα σύστημα κρυπτογράφησης/αποκρυπτογράφησης. Για να γίνει αυτό, δημιουργήστε τον πιο κάτω πίνακα κρυπτογράφησης/αποκρυπτογράφησης χρησιμοποιώντας τα γράμματα του αλφάβητου. 0 1 3 4 0 A B C D E 1 F G H I J K L M N O 3 P Q/Z R S T 4 U V W X Y Πίνακας 1. Η κωδικοποίηση των γραμμάτων γίνετε ως εξής: Θα πρέπει να δημιουργήσετε μια συμβολοσειρά από αριθμούς παίρνοντας για κάθε γράμμα του μηνύματος τον αριθμό της γραμμής και της στήλης. Π.χ. εάν θέλουμε να κωδικοποιήσουμε το γράμμα G, θα πρέπει να πάρουμε την γραμμή 1 και την στήλη 1 που μας δίνει την συμβολοσειρά 11. Για το γράμμα T η αντίστοιχη συμβολοσειρά είναι 34. Για να κωδικοποιήσουμε ένα μήνυμα θα πρέπει να μετατρέψουμε το κάθε γράμμα του μηνύματος μας σε συμβολοσειρά δυο ψηφίων. IV. Αλγόριθμος Κρυπτογράφησης Ο αλγόριθμος κρυπτογράφησης αποτελείται από 4 βήματα. Ας εξηγήσουμε τον αλγόριθμο αυτό μέσο ενός παραδείγματος. Έστω ότι το μήνυμα που θέλουμε να κωδικοποιήσουμε είναι: GATES HILLMAN CENTER Βήμα 1: Αντικατάσταση γραμμάτων Αντικαθιστώντας κάθε γράμμα του μηνύματος με την αντίστοιχη συμβολοσειρά του από το Πίνακα 1, παίρνουμε την συμβολοσειρά: 1100340433 11311003 004334043 Όμως, αυτή η συμβολοσειρά δεν είναι το τελικό κωδικοποιημένο μήνυμα που θέλουμε. Βήμα : Λέξη κλειδί ΕΠΛ131 Υπεύθυνος εργασίας: Πύρρος Μπράτσκας
Το επόμενο βήμα είναι να δώσουμε την λέξη κλειδί αποτελούμενη από γράμματα που εμφανίζονται μόνο μια φορά στην λέξη. Από την λέξη κλειδί θα δημιουργήσουμε ένα πινάκα που θα έχει το ίδιο αριθμό στηλών όσο είναι και το πλήθος γραμμάτων της λέξης κλειδί. Μέσα σε αυτό τον πίνακα θα καταχωρίσουμε τους χαρακτήρες της συμβολοσειράς που δημιουργήσαμε στο προηγούμενο βήμα, παίρνοντας τα ψηφία ένα προς ένα και καταχωρώντας τα στον πίνακα, γεμίζοντας έτσι την πρώτη γραμμή, μετά την δεύτερη κλπ. Για παράδειγμα, εάν χρησιμοποιήσουμε την λέξη CORTINA για λέξηκλειδί, τότε θα είχαμε τον πιο κάτω πινάκα: Βήμα 3: Ταξινόμηση C O R T I N A 1 1 0 0 3 4 0 4 3 3 1 1 3 1 1 0 0 3 0 0 4 3 3 4 0 4 3 Εφόσον έχουμε δημιουργήσει τον πιο πάνω πίνακα μετά θα πρέπει να βάλουμε τις στήλες του πίνακα σε αλφαβητική σειρά βάση των χαρακτήρων της λέξης κλειδί, μετακινώντας έτσι και τις στήλες του πίνακα. Το αποτέλεσμα που θα έχουμε με βάση τον πιο πάνω πινάκα θα είναι το ακόλουθο: A C I N O R T 0 1 3 4 1 0 0 3 4 1 3 3 1 0 1 1 4 0 0 3 0 3 0 4 3 3 4 Βήμα 4: Το τελικό κωδικοποιημένο μήνυμα Για να ολοκληρώσουμε την διαδικασία κωδικοποίησης θα πρέπει να γράψουμε το μήνυμα μας ανά στήλη αφαιρώντας το γράμμα που βρίσκεται στο πάνω μέρος της στήλης. Έτσι, το τελικό κωδικοποιημένο μήνυμα που θα αποστείλουμε είναι: 03043 140 30 4104 1313 0333 01104 V. Αλγόριθμος Αποκρυπτογράφησης Η αποκωδικοποίηση αυτού του μηνύματος γίνεται εφικτή εάν γνωρίζουμε την λέξη-κλειδί. Φυσικά θα πρέπει να αντιστρέψετε την διαδικασία που κάναμε στην κωδικοποίηση για να μπορέσετε να το αποκωδικοποιήσετε. VI. Το πρόγραμμα Σε αυτήν την εργασία καλείστε να γράψετε ένα πρόγραμμα σε Java που θα κρυπτογραφεί και θα αποκρυπτογραφεί διάφορα μηνύματα. Ξεκινώντας το πρόγραμμα σας θα πρέπει να εμφανίσει στο χρήστη ένα menu όπως πιο κάτω: ΕΠΛ131 Υπεύθυνος εργασίας: Πύρρος Μπράτσκας 3
. Decode the message Make your choice: _ Στην περίπτωση που ο χρήστης εισάγει 1, τότε το πρόγραμμα πρέπει να εκτελέσει τον αλγόριθμο της κρυπτογράφησης. Το πρόγραμμα θα δέχεται από το πληκτρολόγιο το μήνυμα που θέλουμε να κρυπτογραφήσουμε και την λέξη κλειδί. Μια λέξη κλειδί θεωρείται σωστή εάν ο κάθε χαρακτήρας της είναι αλφαβητικός χαρακτήρας και εμφανίζεται μόνο μια φορά στην λέξη. Σε αντίθετη περίπτωση το πρόγραμμα θα πρέπει να ζητεί από τον χρήστη να δώσει ξανά την λέξη κλειδί μέχρι να δώσει μια σωστή λέξη κλειδί. Ο χρηστής μπορεί να δώσει το μήνυμα που θέλει να κωδικοποιήσει και την λέξη κλειδί σε κεφαλαία γράμματα ή μικρά γράμματα. Το πρόγραμμα σας θα πρέπει να μετατρέπει το μήνυμα σας και την λέξη κλειδί σε κεφαλαία γράμματα και να αφαιρεί, εάν υπάρχουν, τους αριθμούς από το μήνυμα. Το πρόγραμμα σας θα κωδικοποιεί το μήνυμα με βάση τον αλγόριθμο που περιγράφεται στο κεφάλαιο ΙV της εκφώνησης. Μπορείτε να θεωρήσετε ότι το μέγεθος του μηνύματος που μετατρέψατε σε ψηφία θα έχει τουλάχιστον το ίδιο μέγεθος με την λέξη κλειδί. Συνεχίζοντας, το πρόγραμμα σας θα πρέπει: να εμφανίσει το αρχικό σας μήνυμα σε κεφαλαία γράμματα και με τα σωστά διαστήματα μεταξύ λέξεων αλλά χωρίς ψηφία να εμφανίσει το μήνυμά σας ψηφιοποιημένο να εμφανίσει τον πίνακα που έχετε δημιουργήσει με την λέξη-κλειδί μετά θα εμφανίσει τον πίνακα που έχετε δημιουργήσει με την λέξη-κλειδί με τις στήλες σε αλφαβητική σειρά και τέλος, το κωδικοποιημένο μήνυμα με βάση τις στήλες. Στην περίπτωση που ο χρήστης εισάγει, τότε το πρόγραμμα πρέπει να εκτελέσει τον αλγόριθμο αποκρυπτογράφησης. Για να γίνει αυτό, το πρόγραμμα πρέπει να ζητά από το χρήστη το κωδικοποιημένο μήνυμα και την λέξη κλειδί. Το πρόγραμμα πρέπει να ελέγχει εάν το κωδικοποιημένο μήνυμα αποτελείται μόνο από ψηφία (αριθμούς), εάν όχι να του ξαναζήτα ένα άλλο κωδικοποιημένο μήνυμα μέχρι ο χρήστης να εισάγει ένα σωστό μήνυμα αποτελούμενο μόνο από ψηφία. Στη συνέχεια, το πρόγραμμα να ζητά από το χρήστη τη λέξη κλειδί, για την οποία πρέπει να ακολουθείται η ίδια διαδικασία με την περίπτωση κρυπτογράφησης ως προς την καταλληλότητά της. Συνεχίζοντας, το πρόγραμμα σας θα πρέπει: να εμφανίσει τον πίνακα που έχετε δημιουργήσει με την λέξη-κλειδί με τις στήλες σε αλφαβητική σειρά να εμφανίσει τον πίνακα που έχετε δημιουργήσει με την λέξη-κλειδί μετά θα εμφανίσει το μήνυμά σας ψηφιοποιημένο βάση του πίνακα του κεφαλαίου III της εκφώνησης. Και στο τέλος να εμφανίσει το αποκωδικοποιημένο μήνυμα. ΕΠΛ131 Υπεύθυνος εργασίας: Πύρρος Μπράτσκας 4
VII. Παράδειγμα εκτέλεσης. Decode the message Make your choice: _1 Please enter your message: GATES HILLMAN center-6017 Please enter your keyword: simpson Please enter your keyword: 7UP Please enter your keyword: ABBA Please enter your keyword: cortina GATESHILLMANCENTER 110034043311311003004334043 C O R T I N A 1 1 0 0 3 4 0 4 3 3 1 1 3 1 1 0 0 3 0 0 4 3 3 4 0 4 3 A C I N O R T 0 1 3 4 1 0 0 3 4 1 3 3 1 0 1 1 4 0 0 3 0 3 0 4 3 3 4 Encoded message is: 03043 140 30 4104 1313 0333 01104. Decode the message Make your choice: _ Please enter your encrypted message: 03043 140 30 4104 131g3 0333 01104e Please enter your encrypted message: 03043 140 30 4104 1313 0333 01104 Please enter your keyword: Cortana Please enter your keyword: cortina ΕΠΛ131 Υπεύθυνος εργασίας: Πύρρος Μπράτσκας 5
A C I N O R T 0 1 3 4 1 0 0 3 4 1 3 3 1 0 1 1 4 0 0 3 0 3 0 4 3 3 4 C O R T I N A 1 1 0 0 3 4 0 4 3 3 1 1 3 1 1 0 0 3 0 0 4 3 3 4 0 4 3 110034043311311003004334043 Decoded message is: GATESHILLMANCENTER. Decode the message Make your choice: _3 ΕΠΛ131 Υπεύθυνος εργασίας: Πύρρος Μπράτσκας 6
VIII. Παράδοση 1. Όταν έχετε τελειώσει με τον πηγαίο κώδικα, μεταγλωττίστε το και βεβαιωθείτε ότι τρέχει σωστά.. Παραδώστε τον πηγαίο κώδικα (userid_erg.java) ηλεκτρονικά μέσω του submit assignment (κάτω από το Ασκήσεις Εργασία στην ιστοσελίδα του μαθήματος μέχρι τις 09/11/015 και ώρα 09:00 π.μ. Όπου userid βάλτε το username που σας δόθηκε από το τμήμα. 3. Προσοχή: Το σύστημα ελέγχει το χρόνο παράδοσης εργασιών γι αυτό μην περιμένετε την τελευταία στιγμή να κάνετε submit την εργασία σας. 4. Στα εργαστήρια (09/11/015) θα πρέπει να παραδώσετε σε χαρτί τον πηγαίο κώδικα. Ο κώδικας που θα αποστείλετε ηλεκτρονικά και ο κώδικας που θα παραδώσετε σε χαρτί πρέπει να είναι ακριβώς ο ίδιος. Σε αντίθετη περίπτωση παίρνετε αυτόματα βαθμολογία 0. IX. Βαθμολογία Σημαντικό μέρος της αξιολόγησης θα αποτελέσει η ταχύτητα εκτέλεσης του προγράμματος. Επίσης, ένα πρόγραμμα για να πάρει όλες τις μονάδες είναι απαραίτητο να: 1. χρησιμοποιεί σχόλια. ευθυγραμμισμένος κώδικας 3. αυτό-επεξηγηματικά ονόματα για τις μεταβλητές Για όλα τα παραπάνω ακολουθήστε τις οδηγίες που περιγράφονται εδώ: http://introcs.cs.princeton.edu/java/11style/ Το αρχείο με το πηγαίο κώδικα πρέπει οπωσδήποτε να περιέχει μια συμπληρωμένη κατάλληλα επικεφαλίδα από σχόλια στην αρχή του αρχείου όπως: /** * Author: Γράψτε εδώ το όνομα σας * Written:../../014 * Last updated:../../014 * * Compilation: javac userid_erg.java * Execution: java userid_erg * * Γράψτε εδώ πληροφορίες σχετικά με το τι κάνει * το πρόγραμμα * */ Κώδικας που δε μεταγλωττίζει ή δεν τρέχει (crashes) παίρνει αυτόματα βαθμολογία 0. ΕΠΛ131 Υπεύθυνος εργασίας: Πύρρος Μπράτσκας 7