Διαδρομές
/
Go
Go
/
Ασκήσεις
/
Απλό κρυπτοσύστημα
Απλό κρυπτοσύστημα

Απλό κρυπτοσύστημα

Εύκολο

Οδηγίες

Δημιούργησε μια υλοποίηση του κρυπτογραφήματος Vigenère. Το κρυπτογράφημα Vigenère είναι ένα απλό κρυπτογράφημα αντικατάστασης.

Ορολογία κρυπτογράφησης

Ένα κρυπτογράφημα είναι ένας αλγόριθμος που χρησιμοποιείται για την κρυπτογράφηση, ή κωδικοποίηση, μιας συμβολοσειράς. Η μη κρυπτογραφημένη συμβολοσειρά ονομάζεται απλό κείμενο και η κρυπτογραφημένη συμβολοσειρά ονομάζεται κρυπτοκείμενο. Η μετατροπή του απλού κειμένου σε κρυπτοκείμενο ονομάζεται κωδικοποίηση, ενώ η αντίστροφη διαδικασία ονομάζεται αποκωδικοποίηση.

Σε έναν κρυπτογράφημα αντικατάστασης, κάθε γράμμα του απλού κειμένου αντικαθίσταται από ένα γράμμα του κρυπτοκειμένου, το οποίο υπολογίζεται με τη βοήθεια ενός κλειδιού. (Σημείωση: το γράμμα αντικατάστασης μπορεί να είναι ίδιο με το αρχικό γράμμα.)

Λεπτομέρειες κωδικοποίησης

Σε αυτό το κρυπτογράφημα, το κλειδί είναι μια σειρά από πεζά γράμματα, όπως "abcd". Κάθε γράμμα του απλού κειμένου μετατοπίζεται ή περιστρέφεται κατά μια απόσταση που βασίζεται σε ένα αντίστοιχο γράμμα του κλειδιού. Ένα "a" στο κλειδί σημαίνει μετατόπιση 0 (δηλαδή καμία μετατόπιση). Ένα "b" στο κλειδί σημαίνει μετατόπιση 1. Ένα "c" στο κλειδί σημαίνει μετατόπιση 2, και ούτω καθεξής.

Το πρώτο γράμμα του απλού κειμένου χρησιμοποιεί το πρώτο γράμμα του κλειδιού, το δεύτερο γράμμα του απλού κειμένου χρησιμοποιεί το δεύτερο γράμμα του κλειδιού, και ούτω καθεξής. Αν τα γράμματα του κλειδιού τελειώσουν πριν τελειώσουν τα γράμματα του απλού κειμένου, ξεκίνα πάλι από την αρχή του κλειδιού.

Αν το κλειδί περιέχει μόνο ένα γράμμα, όπως "dddddd", τότε όλα τα γράμματα του απλού κειμένου μετατοπίζονται κατά την ίδια ποσότητα (τρία σε αυτό το παράδειγμα), κάτι που θα το έκανε ίδιο με ένα κυκλικό κρυπτογράφημα ή κρυπτογράφημα μετατόπισης (που μερικές φορές ονομάζεται κρυπτογράφημα του Καίσαρα). Για παράδειγμα, το απλό κείμενο "iamapandabear" θα γινόταν "ldpdsdqgdehdu".

Αν το κλειδί περιέχει μόνο το γράμμα "a" (μία ή περισσότερες φορές), η απόσταση μετατόπισης είναι μηδέν και το κρυπτοκείμενο είναι ίδιο με το απλό κείμενο.

Συνήθως όμως το κλειδί είναι πιο περίπλοκο από αυτό! Αν το κλειδί είναι "abcd", τότε τα γράμματα του απλού κειμένου θα μετατοπίζονταν κατά απόσταση 0, 1, 2 και 3. Αν το απλό κείμενο είναι "hello", χρειαζόμαστε 5 μετατοπίσεις, οπότε το κλειδί θα επαναληφθεί κυκλικά, δίνοντας αποστάσεις μετατόπισης 0, 1, 2, 3 και 0. Εφαρμόζοντας αυτές τις μετατοπίσεις στα γράμματα του "hello" παίρνουμε "hfnoo".

Τυχαία κλειδιά

Αν δεν δοθεί κλειδί, δημιούργησε ένα κλειδί που αποτελείται από τουλάχιστον 100 τυχαία πεζά γράμματα του λατινικού αλφαβήτου.

Σημειώσεις υλοποίησης

Ο ορισμός της διεπαφής Cipher βρίσκεται στο cipher.go.

Οι υλοποιήσεις σου θα πρέπει να συμμορφώνονται με τη διεπαφή Cipher.

type Cipher interface {
    Encode(string) string
    Decode(string) string
}

Αναμένεται ότι η Encode θα αγνοεί όλες τις τιμές στη συμβολοσειρά που δεν είναι A-Za-z, και δεν θα εμφανίζονται στην έξοδο. Η έξοδος θα είναι επίσης κανονικοποιημένη σε πεζά.

Οι συναρτήσεις που χρησιμοποιούνται για τη λήψη των κρυπταλγορίθμων είναι:

func NewCaesar() Cipher { }

func NewShift(distance int) Cipher { }

func NewVigenere(key string) Cipher { }

Το όρισμα για τη NewShift πρέπει να είναι στο εύρος 1 έως 25 ή -1 έως -25. Το μηδέν δεν επιτρέπεται. Για μη έγκυρα ορίσματα, η NewShift επιστρέφει nil.

Το όρισμα για τη NewVigenere πρέπει να αποτελείται μόνο από πεζά γράμματα a-z. Οι τιμές που αποτελούνται εξ ολοκλήρου από το γράμμα 'a' δεν επιτρέπονται. Για μη έγκυρα ορίσματα, η NewVigenere επιστρέφει nil.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Go Exercism

Έτοιμος να ξεκινήσεις την άσκηση Απλό κρυπτοσύστημα;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Go με 34 έννοιες165 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.