Υλοποίησε ένα απλό κρυπτογράφημα μετατόπισης, σαν αυτό του Καίσαρα, και ένα ασφαλέστερο κρυπτογράφημα αντικατάστασης.
«Αν είχε κάτι εμπιστευτικό να πει, το έγραφε με κρυπτογράφημα, αλλάζοντας δηλαδή τη σειρά των γραμμάτων του αλφαβήτου, ώστε να μη βγαίνει καμία λέξη. Αν κάποιος θέλει να τα αποκρυπτογραφήσει και να καταλάβει το νόημά τους, πρέπει να βάλει το τέταρτο γράμμα του αλφαβήτου, δηλαδή το D, στη θέση του A, και το ίδιο και με τα υπόλοιπα.» Σουητώνιος, Life of Julius Caesar
Τα κρυπτογραφήματα είναι πολύ απλοί αλγόριθμοι που μας επιτρέπουν να κάνουμε το κείμενο λιγότερο ευανάγνωστο, ενώ ταυτόχρονα επιτρέπουν την εύκολη αποκρυπτογράφησή του. Είναι ευάλωτα σε πολλές μορφές κρυπτανάλυσης, αλλά ο Καίσαρας στάθηκε τυχερός που οι εχθροί του δεν ήταν κρυπταναλυτές.
Το κρυπτογράφημα του Καίσαρα χρησιμοποιήθηκε για κάποια μηνύματα του Ιούλιου Καίσαρα που στάλθηκαν στο πεδίο της μάχης. Ο Καίσαρας ήξερε πως το κρυπτογράφημα δεν ήταν και πολύ καλό, αλλά είχε έναν σύμμαχο σε αυτό το θέμα: σχεδόν κανείς δεν ήξερε να διαβάζει καλά. Έτσι, ακόμη και δύο γράμματα απόκλιση αρκούσαν ώστε οι άνθρωποι να μη αναγνωρίζουν τις λίγες λέξεις που ήξεραν.
Ο στόχος σου είναι να φτιάξεις ένα απλό κρυπτογράφημα μετατόπισης, σαν το κρυπτογράφημα του Καίσαρα. Αυτή η εικόνα είναι ένα εξαιρετικό παράδειγμα του κρυπτογραφήματος του Καίσαρα:
![]()
Για παράδειγμα:
Αν δώσεις το "iamapandabear" ως είσοδο στη συνάρτηση encode, παίρνεις το κρυπτογράφημα "ldpdsdqgdehdu". Αρκετά δυσνόητο ώστε να κρατήσει το μήνυμά μας μυστικό όσο ταξιδεύει.
Όταν το "ldpdsdqgdehdu" μπει στη συνάρτηση decode, θα επιστρέψει το αρχικό "iamapandabear", επιτρέποντας στον φίλο σου να διαβάσει το αρχικό σου μήνυμα.
Τα κρυπτογραφήματα μετατόπισης παύουν γρήγορα να είναι χρήσιμα όταν ο διοικητής του αντιπάλου τα ανακαλύψει. Ας δοκιμάσουμε λοιπόν ένα κρυπτογράφημα αντικατάστασης. Δοκίμασε να τροποποιήσεις τον κώδικα ώστε να μπορούμε να ορίζουμε ένα κλειδί και να το χρησιμοποιούμε ως απόσταση μετατόπισης.
Να ένα παράδειγμα:
Με κλειδί "aaaaaaaaaaaaaaaaaa", η κωδικοποίηση της συμβολοσειράς "iamapandabear" θα επιστρέψει την αρχική "iamapandabear".
Με κλειδί "ddddddddddddddddd", η κωδικοποίηση της συμβολοσειράς μας "iamapandabear" θα επιστρέψει τη δυσνόητη "ldpdsdqgdehdu"
Στο παραπάνω παράδειγμα, έχουμε θέσει a = 0 για την τιμή του κλειδιού. Έτσι, όταν το αρχικό κείμενο προστίθεται στο κλειδί, καταλήγουμε να βγαίνει το ίδιο μήνυμα. Άρα το "aaaa" δεν είναι ιδανικό κλειδί. Αν όμως θέσουμε το κλειδί σε "dddd", θα πάρουμε το ίδιο αποτέλεσμα με το κρυπτογράφημα του Καίσαρα.
Ο πιο αδύναμος κρίκος σε κάθε κρυπτογράφημα είναι ο άνθρωπος. Ας κάνουμε το κρυπτογράφημα αντικατάστασης λίγο πιο ανεκτικό στα λάθη, δίνοντας μια πηγή τυχαιότητας και φροντίζοντας το κλειδί να περιέχει μόνο πεζά γράμματα.
Αν κάποιος δε δώσει καθόλου κλειδί, δημιούργησε ένα πραγματικά τυχαίο κλειδί με μήκος τουλάχιστον 100 πεζών χαρακτήρων.
Τα κρυπτογραφήματα μετατόπισης λειτουργούν κάνοντας το κείμενο ελαφρώς παράξενο, αλλά είναι ευάλωτα στην ανάλυση συχνοτήτων. Τα κρυπτογραφήματα αντικατάστασης βοηθούν σε αυτό, αλλά παραμένουν πολύ ευάλωτα όταν το κλειδί είναι κοντό ή αν διατηρούνται τα κενά. Πιο μετά θα δεις μια λύση σε αυτό το πρόβλημα στην άσκηση "crypto-square".
Αν θέλεις να προχωρήσεις πιο βαθιά σε αυτόν τον τομέα, τα ερωτήματα αρχίζουν να αφορούν το πώς μπορούμε να ανταλλάσσουμε κλειδιά με ασφαλή τρόπο. Ρίξε μια ματιά στο Diffie-Hellman στη Wikipedia για μία από τις πρώτες υλοποιήσεις αυτού του σχήματος.
Δοκίμασε να χρησιμοποιήσεις αριθμητικές πράξεις, όπως το modulo, για να γυρίζεις τις θέσεις στην αρχή όταν ξεπερνούν το όριο. Οι κλάσεις Character και String είναι επίσης φίλες σου.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Pharo με 50 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.