Στο μάθημα της Γ' Λυκείου Ειδικά Θέματα στο Υλικό και στα Δίκτυα Υπολογιστών οι μαθητές των ΕΠΑΛ έρχονται σε επαφή με την κρυπτογραφία και με τον κώδικα του Καίσαρα. Το θέμα αυτού του μαθησιακού πόρου είναι η υλοποίηση του κώδικα του Καίσαρα με Python. Ο λόγος που επιλέχθηκε η Python είναι πως οι μαθητές των ΕΠΑΛ διδάσκονται αυτή την γλώσσα προγραμματισμού και την εξετάζονται σε πανελλαδικό επίπεδο.
Ο κώδικας του Καίσαρα είναι κώδικας αντικατάστασης στον οποίο κάθε γράμμα του κειμένου αντικαθίσταται από κάποιο άλλο γράμμα με σταθερή απόσταση κάθε φορά στο αλφάβητο.
Για να υλοποίησουμε κρυπτογράφηση με τον αλγόριθμο του Καίσαρα θα πρέπει να υλοποιήσουμε την κωδικοποίηση και την αποκωδικοποίηση. Ας ξεκινήσουμε με την κωδικοποίηση.
Η λίστα των γραμμάτων
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
Λ η θέση του στη λίστα ab μπορεί να υπολογιστεί με την εντολή index ως εξή ab.index('Λ').
Το παρακάτω πρόγραμμα εμφανίζει τις θέσεις των γραμμάτων της λέξης ΚΑΛΗΜΕΡΑ:
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
keimeno = 'ΚΑΛΗΜΕΡΑ'
for l in keimeno:
print(ab.index(l))
Το παρακάτω πρόγραμμα εμφανίζει το επόμενο γράμμα από κάθε γράμμα της λέξης ΚΑΛΗΜΕΡΑ:
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
keimeno = 'ΚΑΛΗΜΕΡΑ'
for l in keimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) + 1) % len(ab)
print(ab[neathesi])
ab.index(l) + 1 αλλά θα πρέπει να προσέξουμε το Ω που θα πρέπει να αντικατασταθεί με το Α. Για αυτό το λόγο βάζουμε το υπόλοιπο της διαίρεσης με το μήκος της λίστας. Στη συγκεκριμένη περίπτωση το ab.index('Ω') είναι 23 προσθέτοντας 1 προκύπτει 24. Η πράξη (ab.index(l) + 1) % len(ab) θα δώσει σαν αποτέλεσμα το 0 και το ab[0] είναι το Α.
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
keimeno = 'ΚΑΛΗΜΕΡΑ'
kwdikopoiimeno = ''
for l in keimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) + 1) % len(ab)
kwdikopoiimeno += ab[neathesi]
print(kwdikopoiimeno)
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
keimeno = 'ΚΑΛΗΜΕΡΑ'
def kaisaras_kwd(keimeno):
kwdikopoiimeno = ''
for l in keimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) + 1) % len(ab)
kwdikopoiimeno += ab[neathesi]
return(kwdikopoiimeno)
print(kaisaras_kwd(keimeno))
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
keimeno = 'ΚΑΛΗΜΕΡΑ'
def kaisaras_kwd(keimeno,d):
kwdikopoiimeno = ''
for l in keimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) + d) % len(ab)
kwdikopoiimeno += ab[neathesi]
return(kwdikopoiimeno)
print(kaisaras_kwd(keimeno,1))
print(kaisaras_kwd(keimeno,2))
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
keimeno = input('Δώστε κείμενο για κρυπτογράφηση: ')
d = int(input('Δώστε απόσταση κώδικα: '))
def kaisaras_kwd(keimeno,d):
kwdikopoiimeno = ''
for l in keimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) + d) % len(ab)
kwdikopoiimeno += ab[neathesi]
return(kwdikopoiimeno)
print(kaisaras_kwd(keimeno,d))
''.join([ab[(ab.index(l) + d) % len(ab)] for l in keimeno])
def kaisaras_apokwd(kwdikopoiimeno,d):
keimeno = ''
for l in kwdikopoiimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) - d) % len(ab)
keimeno += ab[neathesi]
return(keimeno)
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
def kaisaras_kwd(keimeno,d):
kwdikopoiimeno = ''
for l in keimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) + d) % len(ab)
kwdikopoiimeno += ab[neathesi]
return(kwdikopoiimeno)
def kaisaras_apokwd(kwdikopoiimeno,d):
keimeno = ''
for l in kwdikopoiimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) - d) % len(ab)
keimeno += ab[neathesi]
return(keimeno)
d = int(input('Δώστε απόσταση κώδικα: '))
keimeno = input('Δώστε κείμενο για κρυπτογράφηση: ')
print(kaisaras_kwd(keimeno,d))
kwdikop = input('Δώστε κώδικα για αποκρυπτογράφηση: ')
print(kaisaras_apokwd(kwdikop,d))
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
def kaisaras_apokwd(kwdikopoiimeno,d):
keimeno = ''
for l in kwdikopoiimeno:
thesi = ab.index(l)
neathesi = (ab.index(l) - d) % len(ab)
keimeno += ab[neathesi]
return(keimeno)
kwdikop = 'ΥΛΦΡΧΟΓΛ'
for d in range(24):
print(kaisaras_apokwd(kwdikop,d))
ΥΛΦΡΧΟΓΛ
ΤΚΥΠΦΞΒΚ
ΣΙΤΟΥΝΑΙ
ΡΘΣΞΤΜΩΘ
ΠΗΡΝΣΛΨΗ
ΟΖΠΜΡΚΧΖ
ΞΕΟΛΠΙΦΕ
ΝΔΞΚΟΘΥΔ
ΜΓΝΙΞΗΤΓ
ΛΒΜΘΝΖΣΒ
ΚΑΛΗΜΕΡΑ
ΙΩΚΖΛΔΠΩ
ΘΨΙΕΚΓΟΨ
ΗΧΘΔΙΒΞΧ
ΖΦΗΓΘΑΝΦ
ΕΥΖΒΗΩΜΥ
ΔΤΕΑΖΨΛΤ
ΓΣΔΩΕΧΚΣ
ΒΡΓΨΔΦΙΡ
ΑΠΒΧΓΥΘΠ
ΩΟΑΦΒΤΗΟ
ΨΞΩΥΑΣΖΞ
ΧΝΨΤΩΡΕΝ
ΦΜΧΣΨΠΔΜ
Είναι προφανές πως το αρχικό κείμενο ήταν ΚΑΛΗΜΕΡΑ.
Στην επόμενη ενότητα θα αλλάζουμε την απόσταση σε κάθε γράμμα.
Πώς μπορούμε να κάνουμε την αποκωδικοποίηση σε μία γραμμή;
''.join([ab[(ab.index(l) - d) % len(ab)] for l in keimeno])
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
def kaisaras_kwd(keimeno,key):
kwdikopoiimeno = ''
for (i,l) in enumerate(keimeno):
thesi = ab.index(l)
d = key[i%len(key)]
neathesi = (ab.index(l) + d) % len(ab)
kwdikopoiimeno += ab[neathesi]
return(kwdikopoiimeno)
key = [1,5,7,9]
keimeno = input('Δώστε κείμενο για κρυπτογράφηση: ')
print(kaisaras_kwd(keimeno,key))
key[i]. Αλλά όταν τελειώνει το κλειδί θα πρέπει να ξαναρχίζει από την αρχή και για αυτό παίρνουμε το υπόλοιπο της διαίρεσης του i με το μήκος του κλειδιού len(key). Η απόσταση γίνεται key[i%len(key)].
1,5,7,9, μπορείτε να δείτε στην εκτέλεση του προγράμματος αν όντως το πρώτο γράμμα κωδικοποιείται με απόσταση 1.
π.χ.
Δώστε κείμενο για κρυπτογράφηση: ΚΑΛΗΜΕΡΑ
ΛΖΣΠΝΚΩΚ
Το πρώτο γράμμα (Κ) κωδικοποιήθηκε με απόσταση 1 σε Λ, ενώ το δεύτερο (Α) κωδικοποιήθηκε με απόσταση 5 σε Ζ.
Το συνολικό πρόγραμμα κωδικοποίησης αποκωδικοποίησης διαμορφώνεται ως εξής:
ab = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ'
def kaisaras_kwd(keimeno,key):
kwdikopoiimeno = ''
for (i,l) in enumerate(keimeno):
thesi = ab.index(l)
d = key[i%len(key)]
neathesi = (ab.index(l) + d) % len(ab)
kwdikopoiimeno += ab[neathesi]
return(kwdikopoiimeno)
def kaisaras_apokwd(kwdikopoiimeno,key):
keimeno = ''
for (i,l) in enumerate(kwdikopoiimeno):
thesi = ab.index(l)
d = key[i%len(key)]
neathesi = (ab.index(l) - d]) % len(ab)
keimeno += ab[neathesi]
return(keimeno)
key = [1,5,7,9]
keimeno = input('Δώστε κείμενο για κρυπτογράφηση: ')
print(kaisaras_kwd(keimeno,key))
kwdikop = input('Δώστε κώδικα για αποκρυπτογράφηση: ')
print(kaisaras_apokwd(kwdikop,key))