Professional Documents
Culture Documents
Συμμετρικοί Αλγόριθμοι
Κρυπτογράφησης Δεδομένων –
Η περίπτωση του Αλγόριθμου
AES
Λυκούδης Κων/νος
Πτυχιούχος Τμήματος Φυσικής Πανεπιστημίου Πατρών
Συμμετρικοί Αλγόριθμοι
Κρυπτογράφησης Δεδομένων –
Η περίπτωση του Αλγόριθμού
AES
ΠΑΤΡΑ 2012
Περίληψη
Στη σύγχρονη ζωή του ανθρώπου η ανταλλαγή και η διακίνηση της πληροφορίας
αποτελεί πλέον αναπόσπαστο κομμάτι. Η τεράστια ανάπτυξη των δικτύων
υπολογιστών και η επικοινωνία πληροφοριών κάθε μορφής έφερε ένα τεράστιο
πρόβλημα στην επιφάνεια, την ανάγκη για προστασία αυτής της πληροφορίας. Το
πρόβλημα αυτό καλείται να το αντιμετωπίσει η επιστήμη της Κρυπτογραφίας όπου
μέσα από διάφορους μετασχηματισμούς προσπαθεί θα μετατρέψει τα δεδομένα σε μια
ακατανόητη μορφή η οποία θα είναι δυνατόν να αντιστραφεί μόνο από τον νόμιμο
παραλήπτη. Για το λόγο αυτό έχουν αναπτυχθεί πληθώρα αλγορίθμων
κρυπτογράφησης όπου παρόλο που η δουλειά τους είναι η ίδια, χειρίζονται και
μετασχηματίζουν τα δεδομένα με διαφορετικό τρόπο.
Στην παρούσα εργασία γίνεται παρουσίαση του αλγορίθμου AES (Advanced Encryption
Standard) που αποτελεί το τρέχον πρότυπο από το NIST (National Institute of
Standards and Technology). Ο AES ο οποίος είναι και γνωστός ως Rijndael, είναι ένας
συμμετρικός αλγόριθμος τμήματος και βασίζεται στα δίκτυα μετάθεσης –
αντικατάστασης, ενώ είναι υλοποιήσιμος και γρήγορος τόσο σε λογισμικό όσο και σε
υλικό. Αντίθετα με τον προκάτοχο του DES, δεν χρησιμοποιεί το δίκτυο Feistel. matr
4x4 (128 bits), που ορίζεται ως κατάσταση (state), με τους περισσότερους
μετασχηματισμούς να πραγματοποιούνται σε ένα πεπερασμένο πεδίο. Ο αλγόριθμος
AES, δίνει τη δυνατότητα κρυπτογράφησης με τρία κλειδιά διαφορετικού μήκους, 128
bits κλειδί με 10 κύκλους επανάληψης, 192 bits κλειδί με 12 κύκλους επανάληψης και
256 bits κλειδί με 14 κύκλους επανάληψης παρουσιάζοντας κάθε φορά μεγάλη
ανθεκτικότητα σε κρυπταναλυτικές επιθέσεις.
Στα πλαίσια της εργασίας έγινε λεπτομερής ανάλυση των μετασχηματισμών που
χρησιμοποιεί ο AES στην κρυπτογράφηση και αποκρυπτογράφηση σύμφωνα με το
πρότυπο Fips-197 αρχικά σε θεωρητικό επίπεδο και έπειτα πραγματοποιήθηκαν
υλοποιήσεις σε λογισμικό και σε υλικό. Συγκεκριμένα, στο 1ο κεφάλαιο της εργασίας
γίνεται μια εισαγωγή στην Κρυπτογραφία, παρουσιάζοντας τις βασικές της έννοιες και
την ιστορική της εξέλιξη από τα πρώτα χρόνια εμφάνισης της ως σήμερα. Στο κεφάλαιο
2, αρχικά παρουσιάζονται τα υπάρχοντα κρυπτοσυστήματα, αναδεικνύοντας κάθε
φορά τον τρόπο με τον οποίο λειτουργούν, τους αλγόριθμους που υπάγονται σε αυτά
και τις εφαρμογές που έχουν. Στη συνέχεια γίνεται σύγκριση μεταξύ των αλγορίθμων
ενός συστήματος αλλά και μεταξύ των κρυπτοσυστημάτων. Το κεφάλαιο 3 αποτελεί το
κυρίως σώμα της εργασίας καθώς σε αυτό παρουσιάζεται και επεξηγείται ο αλγόριθμος
AES. Δίνεται το απαραίτητο μαθηματικό υπόβαθρο και αναλύονται οι μετασχηματισμοί
του αλγορίθμου. Παρουσιάζεται ο τρόπος που επεκτείνονται τα κλειδιά του αλγορίθμου
καθώς και οι διαδικασίες κρυπτογράφησης και αποκρυπτογράφησης. Τέλος γίνεται
αναφορά σε ζητήματα ασφάλειας και στην αντοχή του AES σε κρυπταναλυτικές
επιθέσεις, καθώς και στις εφαρμογές που χρησιμοποιείται. Στο 4ο κεφάλαιο
παρουσιάζονται και συγκρίνονται οι μέθοδοι υλοποίησης του αλγορίθμου.
Περιγράφεται μια υλοποίηση σε λογισμικό με τη χρήση της γλώσσας προγραμματισμού
C++, η οποία επεκτείνεται και σε μια διαδικτυακή υλοποίηση και μια υλοποίηση σε
υλικό με τη χρήση της περιγραφικής γλώσσας VHDL και το σχεδιαστικό εργαλείο
Quartus II. Τέλος στο 5ο κεφάλαιο εξάγονται συμπεράσματα και γίνονται προτάσεις για
μελλοντική εργασία.
i
ii
Abstract
In modern life the exchange and transfer of information has become an integral part.
The enormous development of computer networks and the information communication
of every form,has brought a new massive problem on the surface, the need to protect
this information.The science of Cryptography is challenged to face this problem, so
through various transformations is trying to convert tha data in a incomprehensive
form, which will be possible to be inverted only from the legal receiver. For this reason a
variety of algorithms have been developed and although their work is the same, they
handle and convert data in different ways.
In the present thesis the AES (Advanced Encryption Standard) algorithm is presented,
which is the current standard of NIST (National Institute of Standards and Technology).
AES, which is also known as Rijndael, is a symmetric block cipher and is based on
substitution - permutation networks, while it can be efficiently implemented both in
software and hardware. Unlike it's predecessor DES, it does not use Feistel network. It
is applied in 4x4 Bytes matrix (128 bits),which is defined as state, with the most
transformations to be performed in a finite field. AES algorithm provides encryption
capability with three keys of different size: key of 128 bits with 10 rounds, key of 192
bits with 12 rounds and key of 256 bits with 14 rounds.
This thesis includes detailed analysis of transformtions that AES uses in ecryption and
decryption according to the Fips-197 standard, along with software and hardware
implementations. Specifically, in the first chapter an introduction to Cryptography is
made, presenting basic concepts and a historical overview. In chapter 2, contemporary
cryptosystems are introduced. In chapter 3 the AES algorithm is presented and
explained. The necessary mathematical background is provided and the transformations
of the algorithm are analysed. The way the algorithm keys are expanded is presented, as
well as the encryption and decryption processes. In chapter 4 the implementations of
AES are presented and compared. An implementation in software is described using the
programming language C++, and an implementation in hardware is given using the
VHDL language and the design tool Altera Quartus II. Finally in chapter 5 the conclusions
are given and proposals are made for future work.
iii
iv
Ευχαριστίες
Τέλος, πρέπει ιδιαίτερα να ευχαριστήσω την οικογένεια μου για την αμέριστη
κατανόηση τους και την υλική και ηθική συμπαράσταση τους όλα αυτά τα χρόνια.
v
Περιεχόμενα
1.Εισαγωγή στην Κρυπτογραφία ...................................................................................................... 1
1.1 Εισαγωγικές έννοιες και Ορολογία ................................................................................... 1
1.2 Ιστορική Αναδρομή.................................................................................................................. 3
1.2.1 Πρώτη Περίοδος Κρυπτογραφίας (1900 π.Χ. – 1900 μ.Χ.) ................................. 3
1.2.2 Δεύτερη Περίοδος Κρυπτογραφίας (1900 μ.Χ. – 1950 μ.Χ.) .............................. 5
1.2.3 Τρίτη Περίοδος Κρυπτογραφίας (1950 μ.Χ. – Σήμερα.) ...................................... 6
1.3 Βασικές έννοιες κρυπτογραφίας ....................................................................................... 7
1.4 Αναγκαιότητα κρυπτογραφίας .......................................................................................... 9
1.5 Βασικοί στόχοι Κρυπτογραφίας ...................................................................................... 10
1.6 Ασφάλεια Κρυπτοσυστημάτων........................................................................................ 11
1.7 Εφαρμογές Κρυπτογραφίας .............................................................................................. 11
1.8 Κρυπτανάλυση ........................................................................................................................ 12
2.Κρυπτοσυστήματα και Αλγόριθμοι............................................................................................. 15
2.1 Κατηγορίες Κρυπτοσυστημάτων ........................................................................................ 15
2.2 Κλασσικά Κρυπτοσυστήματα ............................................................................................... 16
2.2.1 Αλγόριθμος του Καίσαρα................................................................................................ 17
2.2.2 Αλγόριθμος Vigenere ........................................................................................................ 18
2.2.3 Αλγόριθμος σημειωματάριου μιας χρήσης.............................................................. 19
2.3 Σύγχρονα Κρυπτοσυστήματα ............................................................................................... 20
2.3.1 Συμμετρικά Κρυπτοσυστήματα και Αλγόριθμοι .................................................. 20
2.3.2 Αλγόριθμοι Ροής (Stream Ciphers).............................................................................22
2.3.3 Αλγόριθμοι Τμήματος (Block Ciphers) ..................................................................... 24
2.3.3.1 Βασικές έννοιες και ορισμοί ................................................................................... 24
2.3.3.2 Μέθοδοι Γεμίσματος .................................................................................................. 28
2.3.3.2.1 Μηδενικό Γέμισμα (Zero Padding) ............................................................... 28
2.3.3.2.2 Σαφές Γέμισμα (Unambiguous Padding) ................................................... 28
2.3.3.3 Μέθοδοι Λειτουργίας.................................................................................................28
2.3.3.3.1 Electronic Codebook (ECB) Mode ................................................................. 29
2.3.3.3.2 Cipher Block Chaining (CBC) Mode .............................................................. 30
2.3.3.3.3 Cipher Feedback (CFB) Mode.......................................................................... 31
2.3.3.3.4 Output Feedback (OFB) Mode ........................................................................ 32
2.3.3.3.5 Counter Mode ........................................................................................................ 32
2.3.4 Συμμετρικοί Αλγόριθμοι Κρυπτογράφησης ........................................................... 33
2.3.4.1 Αλγόριθμος DES (Data Encryption Standard) .................................................33
2.3.4.2 Αλγόριθμος Triple DES ............................................................................................. 35
2.3.4.3 Αλγόριθμος AES (Advanced Encryption Standard) ...................................... 36
2.3.4.4 Αλγόριθμος IDEA (International Data Encryption Algorithm) ................37
2.3.4.5 Αλγόριθμος RC2 ........................................................................................................... 37
vi
2.3.4.5 Αλγόριθμος RC4 ........................................................................................................... 37
2.3.4.6 Αλγόριθμος RC5 ........................................................................................................... 38
2.3.4.7 Αλγόριθμος RC6 ........................................................................................................... 38
2.3.4.8 Αλγόριθμος MARS .......................................................................................................38
2.3.4.9 Αλγόριθμος Serpent ................................................................................................... 39
2.3.4.10 Αλγόριθμος Twofish ................................................................................................ 39
2.3.4.11 Αλγόριθμος Blowfish............................................................................................... 39
2.3.4.12 Αλγόριθμος CAST-128 ............................................................................................ 40
2.3.4.13 Σύγκριση συμμετρικών αλγορίθμων ............................................................... 40
2.3.5 Ασύμμετρα Κρυπτοσυστήματα.................................................................................... 42
2.3.5.1 Αλγόριθμος RSA ........................................................................................................... 44
2.3.5.2 Ανταλλαγή κλειδιών κατά Diffie-Hellman........................................................ 45
2.3.5.3 Κρυπτογραφία Ελλειπτικής καμπύλης (ECC) ................................................. 46
2.3.5.4 Εφαρμογές Κρυπτογραφίας δημοσίου κλειδιού ...........................................47
2.3.5.4.1 Ψηφιακές Υπογραφές ........................................................................................ 48
2.3.5.4.2 Ψηφιακά Πιστοποιητικά................................................................................... 50
2.3.5.4.3 Διανομή μυστικών κλειδιών με Ασύμμετρο Κρυπτοσύστημα ..........51
2.3.6 Σύγκριση Συμμετρικών - Ασύμμετρων Κρυπτοσυστημάτων ......................... 52
3.Το πρότυπο AES .................................................................................................................................. 55
3.1 Ιστορική αναδρομή .................................................................................................................... 55
3.2 Κριτήρια αξιολόγησης υποψήφιων αλγορίθμων .......................................................... 56
3.3 AES - Γενικά .................................................................................................................................. 57
3.4 Μαθηματικό υπόβαθρο του AES .......................................................................................... 58
3.4.1 Το πεδίο (ή Σώμα) GF(28) ............................................................................................... 58
3.4.2 Πρόσθεση στο GF(28) ....................................................................................................... 58
3.4.3 Πολλαπλασιασμός στο GF(28) ...................................................................................... 58
3.4.4 Πολλαπλασιασμός πολυωνύμου με το x ..................................................................59
3.4.5 Πολλαπλασιασμός με συντελεστές στο GF(28) ..................................................... 60
3.4.6 Πολλαπλασιασμός πολυωνύμων με συντελεστές στο GF(28) με το x .........60
3.5 Κρυπτογράφηση ......................................................................................................................... 61
3.5.1 Μετασχηματισμός SubBytes()...................................................................................... 63
3.5.2 Μετασχηματισμός ShiftRows() .................................................................................... 66
3.5.3 Μετασχηματισμός MixColumns() ...............................................................................67
3.5.4 Μετασχηματισμός AddRoundKey() ...........................................................................68
3.6 Επέκταση κλειδιού..................................................................................................................... 69
3.7 Αποκρυπτογράφηση ................................................................................................................. 71
3.7.1 Μετασχηματισμός InvSubBytes() ............................................................................... 72
3.7.2 Μετασχηματισμός InvShiftRows() ............................................................................. 73
3.7.3 Μετασχηματισμός InvMixColumns() ........................................................................ 74
vii
3.7.4 Αντίστροφος μετασχηματισμός AddRoundKey() ................................................74
3.7.5 Αλγόριθμος ισοδύναμης Αποκρυπτογράφησης.................................................... 74
3.8 Παρουσίαση διαδικασίας κρυπτογραφήσεως μέσω παραδείγματος ..................76
3.9 Ασφάλεια AES .............................................................................................................................. 81
3.10 Εφαρμογές ..................................................................................................................................81
4.Υλοποιήσεις AES..................................................................................................................................83
4.1 Κρυπτογραφία και λογισμικό ή υλικό ............................................................................... 83
4.2 Υλοποίηση σε Λογισμικό ......................................................................................................... 85
4.2.1 Ανάλυση προγράμματος ................................................................................................. 85
4.2.2 Παρουσίαση αποτελεσμάτων ....................................................................................... 89
4.3 Διαδικτυακή υλοποίηση .......................................................................................................... 91
4.4 VHDL υλοποίηση AES........................................................................................................... 95
4.4.1 AES-128 .............................................................................................................................. 96
4.4.1.1 Μονάδα παραγωγής κλειδιού............................................................................. 96
4.4.1.2 Μονάδα κρυπτογράφησης/αποκρυπτογράφησης ................................ 101
4.4.1.3 Μονάδα ελέγχου .................................................................................................... 108
4.4.1.4 AES-128 υλοποίηση και εξομοίωση .............................................................. 108
4.4.2 AES-128/192/256 .......................................................................................................... 114
4.4.2.1 Μονάδα παραγωγής κλειδιού ............................................................................. 114
4.4.2.2 Μονάδα ελέγχου ....................................................................................................... 119
4.4.2.3 AES-128/192/256 υλοποίηση και εξομοίωση............................................. 120
5.Συμπεράσματα .................................................................................................................................. 129
Αναφορές ................................................................................................................................................ 131
Παράρτημα Α ......................................................................................................................................... 135
Παράρτημα Β ......................................................................................................................................... 147
viii
ix
1.Εισαγωγή στην Κρυπτογραφία
Ορολογία
1
Εικόνα 1. 1 Διαδικασία Κρυπτογράφησης/Αποκρυπτογράφησης.
Κρυπτογράφηση c = ek (p)
Αποκρυπτογράφηση p = dk (c)
p: Αρχικό κείμενο
c: Κρυπτογραφημένο κείμενο
k: Κλειδί
e: Συνάρτηση κρυπτογραφήσεως
d: Συνάρτηση αποκρυπτογραφήσεως
2
Το κρυπτογραφημένο κείμενο αποτελεί το σημείο επέμβασης των πιθανών εισβολέων
του συστήματος με σκοπό την αποκάλυψη κάποιου από τα συστατικά του συστήματος
κρυπτογράφησης, συνήθως του κλειδιού, με σκοπό είτε την υποκλοπή του μηνύματος
(αποκάλυψη του αρχικού κειμένου) είτε την αλλοίωσή του.
• Η πρώτη ξεκινά περίπου το 1900 π.Χ. και τερματίζεται στις αρχές του εικοστού
αιώνα.
• Η δεύτερη περίοδος, ουσιαστικά καλύπτει το πρώτο μισό του εικοστού αιώνα.
• Η τρίτη και τελευταία περίοδος ξεκινά το 1950, με την έξαρση της ανάπτυξης στους
επιστημονικούς κλάδους των μαθηματικών, της μικροηλεκτρονικής και των
υπολογιστικών συστημάτων και συνεχίζεται μέχρι και τις ημέρες μας.
Κατά τη διάρκεια αυτής της περιόδου αναπτύχθηκε μεγάλο πλήθος μεθόδων και
αλγορίθμων κρυπτογράφησης, που βασίζονταν κυρίως σε απλές αντικαταστάσεις
γραμμάτων. Όλες αυτές δεν απαιτούσαν εξειδικευμένες γνώσεις και πολύπλοκες
συσκευές, αλλά στηρίζονταν στην ευφυΐα και την ευρηματικότητα των δημιουργών
τους. Όλα αυτά τα συστήματα έχουν στις μέρες μας κρυπταναλυθεί και έχει αποδειχθεί
ότι, εάν είναι γνωστό ένα μεγάλο κομμάτι του κρυπτογραφημένου μηνύματος, τότε το
αρχικό κείμενο μπορεί σχετικά εύκολα να επανακτηθεί.
Όπως προκύπτει από μία μικρή σφηνοειδή επιγραφή, που ανακαλύφθηκε στις όχθες
του ποταμού Τίγρη, οι πολιτισμοί που αναπτύχθηκαν στη Μεσοποταμία ασχολήθηκαν
με την κρυπτογραφία ήδη από το 1500 π.Χ. Η επιγραφή αυτή περιγράφει μία μέθοδο
κατασκευής σμάλτων για αγγειοπλαστική και θεωρείται ως το αρχαιότερο
κρυπτογραφημένο κείμενο. Επίσης, ως το αρχαιότερο βιβλίο κρυπτοκωδικών στον
κόσμο, θεωρείται μία σφηνοειδής επιγραφή στα Σούσα της Περσίας. η οποία
περιλαμβάνει τους αριθμούς 1 έως 8 και από το 32 έως το 35, τοποθετημένους τον ένα
κάτω από τον άλλο, ενώ απέναντι τους βρίσκονται τα αντίστοιχα για τον καθένα
σφηνοειδή σύμβολα.
Η πρώτη στρατιωτική χρήση της κρυπτογραφίας αποδίδεται στους Σπαρτιάτες. Γύρω
στον 5ο π.Χ. αιώνα εφηύραν την “σκυτάλη”, την πρώτη κρυπτογραφική συσκευή, στην
οποία χρησιμοποίησαν για την κρυπτογράφηση τη μέθοδο της αντικατάστασης. Όπως
αναφέρει ο Πλούταρχος, η “Σπαρτιατική Σκυτάλη” (Εικόνα 1. 2), ήταν μια ξύλινη
ράβδος, ορισμένης διαμέτρου, γύρω από την οποία ήταν τυλιγμένη ελικοειδώς μια
λωρίδα περγαμηνής. Το κείμενο ήταν γραμμένο σε στήλες, ένα γράμμα σε κάθε έλικα,
όταν δε ξετύλιγαν τη λωρίδα, το κείμενο ήταν ακατάληπτο εξαιτίας της ανάμειξης των
γραμμάτων. Το κλειδί ήταν η διάμετρος της σκυτάλης.
3
Εικόνα 1. 2 Η Σπαρτιατική Σκυτάλη, μια πρώιμη συσκευή για την κρυπτογράφηση.
Καίσαρα. Ο Ιούλιος Καίσαρας έγραφε στον Κικέρωνα και σε άλλους φίλους του,
αντικαθιστώντας τα γράμματα του κειμένου, με γράμματα, που βρίσκονται 3 θέσεις
μετά, στο Λατινικό Αλφάβητο. Έτσι, σήμερα, το σύστημα κρυπτογράφησης που
στηρίζεται στην αντικατάσταση των γραμμάτων του αλφαβήτου με άλλα που
βρίσκονται σε καθορισμένο αριθμό θέσης πριν ή μετά, λέγεται κρυπτοσύστημα
αντικατάστασης του Καίσαρα. Ο Καίσαρας χρησιμοποίησε και άλλα, πιο πολύπλοκα
συστήματα κρυπτογράφησης, για τα οποία έγραψε ένα βιβλίο ο Valerius Probus, το
οποίο δυστυχώς δεν διασώθηκε, αλλά αν και χαμένο, θεωρείται το πρώτο βιβλίο
κρυπτολογίας. Το σύστημα αντικατάστασης του Καίσαρα, χρησιμοποιήθηκε ευρύτατα
και στους επόμενους αιώνες.
Ο C.Wheatstone, γνωστός από τις μελέτες του στον ηλεκτρισμό, παρουσίασε την πρώτη
μηχανική κρυπτοσυσκευή, η οποία απετέλεσε τη βάση για την ανάπτυξη των
κρυπτομηχανών της δεύτερης ιστορικής περιόδου της κρυπτογραφίας. Η μεγαλύτερη
αποκρυπτογράφηση ήταν αυτή των αιγυπτιακών ιερογλυφικών τα οποία, επί αιώνες,
παρέμεναν μυστήριο και οι αρχαιολόγοι μόνο εικασίες μπορούσαν να διατυπώσουν για
τη σημασία τους. Ωστόσο, χάρη σε μία κρυπταναλυτική εργασία, τα ιερογλυφικά εν
τέλει αναλύθηκαν και έκτοτε οι αρχαιολόγοι είναι σε θέση να διαβάζουν ιστορικές
επιγραφές [6].
4
1.2.2 Δεύτερη Περίοδος Κρυπτογραφίας (1900 μ.Χ. – 1950 μ.Χ.)
Η δεύτερη περίοδος της κρυπτογραφίας τοποθετείται στις αρχές του 20ου αιώνα και
φτάνει μέχρι το 1950. Καλύπτει, επομένως, τους δύο παγκόσμιους πολέμους, εξαιτίας
των οποίων (λόγω της εξαιρετικά μεγάλης ανάγκης που υπήρξε για ασφάλεια κατά τη
μετάδοση ζωτικών πληροφοριών μεταξύ των στρατευμάτων των χωρών) αναπτύχθηκε
η κρυπτογραφία τόσο όσο δεν είχε αναπτυχθεί τα προηγούμενα 3000 χρόνια. Τα
κρυπτοσυστήματα αυτής της περιόδου αρχίζουν να γίνονται πολύπλοκα, και να
αποτελούνται από μηχανικές και ηλεκτρομηχανικές κατασκευές, οι οποίες ονομάζονται
“κρυπτομηχανές”. Η κρυπτανάλυση τους, απαιτεί μεγάλο αριθμό προσωπικού, το οποίο
εργαζόταν επί μεγάλο χρονικό διάστημα ενώ ταυτόχρονα γίνεται εξαιρετικά αισθητή η
ανάγκη για μεγάλη υπολογιστική ισχύ. Παρά την πολυπλοκότητα που αποκτούν τα
συστήματα κρυπτογράφησης κατά τη διάρκεια αυτής της περιόδου η κρυπτανάλυση
τους είναι συνήθως επιτυχημένη. Οι Γερμανοί έκαναν εκτενή χρήση (σε διάφορες
παραλλαγές) ενός συστήματος γνωστού ως Enigma (Εικόνα 1. 3).
5
Εικόνα 1. 3 Μηχανή Enigma και Κρυπτομηχανή SIGABA.
Αυτή η περίοδος χαρακτηρίζεται από την έξαρση της ανάπτυξης στους επιστημονικούς
κλάδους των μαθηματικών, της μικροηλεκτρονικής και των υπολογιστικών
συστημάτων. Η εποχή της σύγχρονης κρυπτογραφίας αρχίζει ουσιαστικά με τον Claude
Shannon, αναμφισβήτητα ο πατέρας των μαθηματικών συστημάτων κρυπτογραφίας.
Το 1949 δημοσίευσε το έγγραφο “Θεωρία επικοινωνίας των συστημάτων
μυστικότητας” (Communication Theory of Secrecy Systems) στο τεχνικό περιοδικό Bell
System και λίγο αργότερα στο βιβλίο του, “Μαθηματική Θεωρία της Επικοινωνίας”
(Mathematical Theory of Communication), μαζί με τον Warren Weaver. Αυτά, εκτός από
τις άλλες εργασίες του επάνω στη θεωρία δεδομένων και επικοινωνίας καθιέρωσε μια
στερεά θεωρητική βάση για την κρυπτογραφία και την κρυπτανάλυση. Εκείνη την
εποχή η κρυπτογραφία εξαφανίζεται και φυλάσσεται από τις μυστικές υπηρεσίες
κυβερνητικών επικοινωνιών όπως η NSA. Πολύ λίγες εξελίξεις δημοσιοποιήθηκαν ξανά
μέχρι τα μέσα της δεκαετίας του '70, όταν όλα άλλαξαν.
6
Στα μέσα της δεκαετίας του '70 έγιναν δύο σημαντικές δημόσιες (δηλ. μη-μυστικές)
πρόοδοι. Πρώτα ήταν η δημοσίευση του σχεδίου προτύπου κρυπτογράφησης DES (Data
Encryption Standard) στον ομοσπονδιακό κατάλογο της Αμερικής στις 17 Μαρτίου
1975. Το προτεινόμενο DES υποβλήθηκε από την ΙΒΜ, στην πρόσκληση του Εθνικού
Γραφείου των Προτύπων (τώρα γνωστό ως NIST), σε μια προσπάθεια να αναπτυχθούν
ασφαλείς ηλεκτρονικές εγκαταστάσεις επικοινωνίας για επιχειρήσεις όπως τράπεζες
και άλλες μεγάλες οικονομικές οργανώσεις. Μετά από τις συμβουλές και την
τροποποίηση από την NSA, αυτό το πρότυπο υιοθετήθηκε και δημοσιεύθηκε ως ένα
ομοσπονδιακό τυποποιημένο πρότυπο επεξεργασίας πληροφοριών το 1977 (αυτήν την
περίοδο αναφέρεται σαν FIPS 46-3). Ο DES ήταν ο πρώτος δημόσια προσιτός
αλγόριθμος κρυπτογράφησης που εγκρίνεται από μια εθνική αντιπροσωπεία όπως η
NSA. Η απελευθέρωση της προδιαγραφής της από την NBS υποκίνησε μια έκρηξη
δημόσιου και ακαδημαϊκού ενδιαφέροντος για τα συστήματα κρυπτογραφίας.
Ο DES αντικαταστάθηκε επίσημα από τον AES το 2001 όταν ανήγγειλε ο NIST το FIPS
197. Μετά από έναν ανοικτό διαγωνισμό, ο NIST επέλεξε τον αλγόριθμο Rijndael, που
υποβλήθηκε από δύο Φλαμανδούς κρυπτογράφους, για να είναι το AES. Ο DES και οι
ασφαλέστερες παραλλαγές του όπως ο 3DES ή TDES χρησιμοποιούνται ακόμα και
σήμερα, ενσωματωμένοι σε πολλά εθνικά και οργανωτικά πρότυπα. Εντούτοις, το
βασικό μέγεθος των 56-bit έχει αποδειχθεί ότι είναι ανεπαρκές να αντισταθεί στις
επιθέσεις ωμής βίας (μια τέτοια επίθεση πέτυχε να σπάσει τον DES σε 56 ώρες ενώ το
άρθρο που αναφέρεται ως το σπάσιμο του DES δημοσιεύτηκε από τον O'Reilly and
Associates). Κατά συνέπεια, η χρήση απλής κρυπτογράφησης με τον DES είναι τώρα
χωρίς αμφιβολία επισφαλής για χρήση στα νέα σχέδια των κρυπτογραφικών
συστημάτων και μηνύματα που προστατεύονται από τα παλαιότερα κρυπτογραφικά
συστήματα που χρησιμοποιούν DES, και όλα τα μηνύματα που έχουν αποσταλεί από το
1976 με τη χρήση DES, διατρέχουν επίσης σοβαρό κίνδυνο αποκρυπτογράφησης.
Ανεξάρτητα από την έμφυτη ποιότητά του, το βασικό μέγεθος του DES (56-bit) ήταν
πιθανά πάρα πολύ μικρό ακόμη και το 1976, πράγμα που είχε επισημάνει ο Whitfield
Diffie. Υπήρξε επίσης η υποψία ότι κυβερνητικές οργανώσεις είχαν ακόμα και τότε
ικανοποιητική υπολογιστική δύναμη ώστε να σπάσουν μηνύματα που είχαν
κρυπτογραφηθεί με τον DES [6].
7
Η συνάρτηση κρυπτογράφησης Ε δέχεται δύο παραμέτρους, μέσα από τον χώρο P και
τον χώρο k και παράγει μία ακολουθία που ανήκει στον χώρο C. Η συνάρτηση
αποκρυπτογράφησης D δέχεται δύο παραμέτρους, τον χώρο C και τον χώρο k και
παράγει μια ακολουθία που ανήκει στον χώρο P.
1. Ο αποστολέας επιλέγει ένα κλειδί μήκους n από τον χώρο κλειδιών με τυχαίο
τρόπο, όπου τα n στοιχεία του Κ είναι στοιχεία από ένα πεπερασμένο
αλφάβητο.
2. Αποστέλλει το κλειδί στον παραλήπτη μέσα από ένα ασφαλές κανάλι.
3. Ο αποστολέας δημιουργεί ένα μήνυμα από τον χώρο μηνυμάτων.
4. Η συνάρτηση κρυπτογράφησης παίρνει τις δυο εισόδους (κλειδί και μήνυμα)
και παράγει μια κρυπτοακολουθία συμβόλων (έναν γρίφο) και η ακολουθία
αυτή αποστέλλεται διαμέσου ενός μη ασφαλούς καναλιού.
5. Η συνάρτηση αποκρυπτογράφησης παίρνει ως όρισμα τις δύο τιμές (κλειδί και
γρίφο) και παράγει την ισοδύναμη ακολουθία μηνύματος.
8
1.4 Αναγκαιότητα κρυπτογραφίας
Μερικές φορές η ασφάλεια της πληροφορίας δεν εξασφαλίζεται από τον τρόπο με τον
οποίο είναι μετασχηματισμένη αλλά από το φυσικό έγγραφο στο οποίο καταγράφεται.
Αυτό αφορά την περίπτωση της στεγανογραφίας όπου ουσιαστικά το ίδιο το μήνυμα
αποκρύπτεται. Παλαιότερα για να επιτευχθεί αυτό χρησιμοποιείτο ειδικό μελάνι το
οποίο υπό ορισμένες προϋποθέσεις γινόταν αόρατο.
Ο τρόπος με τον οποίο η πληροφορία καταγράφεται δεν έχει αλλάξει δραματικά κατά
το πέρασμα του χρόνου, παρόλο που παλαιότερα η πληροφορία αποθηκευόταν και
μεταδιδόταν με τη βοήθεια του χαρτιού, ενώ πλέον διανέμεται με οπτικά μέσα και
μεταδίδεται μέσω τηλεπικοινωνιακών συστημάτων. Αυτό που έχει αλλάξει σημαντικά
είναι η δυνατότητα για αντιγραφή και μεταβολή της πληροφορίας. Ο οποιοσδήποτε έχει
τη δυνατότητα να δημιουργήσει χιλιάδες πανομοιότυπα αντίτυπα ενός τμήματος
πληροφορίας που είναι αποθηκευμένο ηλεκτρονικά, το καθένα από τα οποία να μην
ξεχωρίζει από το πρωτότυπο. Με την πληροφορία αποθηκευμένη σε χαρτί αυτό
απαιτούσε πολύ περισσότερη προσπάθεια.
Στη σύγχρονη κοινωνία όπου η πληροφορία κατά κύριο λόγο αποθηκεύεται και
μεταδίδεται σε ηλεκτρονική μορφή, η ασφάλεια της θα πρέπει να εξασφαλίζεται
ανεξάρτητα από το φυσικό μέσο στο οποίο είναι αποθηκευμένη και μεταφέρεται,
έτσι οι στόχοι της ασφάλειας θα πρέπει να στηρίζονται μόνο στην ψηφιακή
πληροφορία.
Ένα από τα βασικότερα εργαλεία που χρησιμοποιείται για την ασφάλεια της
πληροφορίας είναι η υπογραφή. Αποτελεί θεμέλιο στοιχείο για πολλές υπηρεσίες
όπως η μη αποκήρυξη μίας ενέργειας, η επαλήθευση της προέλευσης της
πληροφορίας και η εξακρίβωση της ακεραιότητας της. Κάθε άτομο μαθαίνει να
δημιουργεί την δική του ξεχωριστή υπογραφή η οποία αποτελεί μέρος της ταυτότητάς
του. Με την ηλεκτρονικά αποθηκευμένη πληροφορία όμως αυτός ο τρόπος δεν μπορεί
να εφαρμοστεί, καθώς η ηλεκτρονική αντιγραφή μίας υπογραφής είναι πάρα πολύ
απλή διαδικασία.
Για την επίτευξη της ασφάλειας της πληροφορίας την σημερινή εποχή απαιτούνται
πολύ διαφορετικά τεχνικά μέσα και νομικά πλαίσια. Τα τεχνικά αυτά μέσα παρέχονται
από την κρυπτογραφία [9].
9
1.5 Βασικοί στόχοι Κρυπτογραφίας
1. Εμπιστευτικότητα (Confidentiality).
2. Ακεραιότητα (Integrity).
3. Επαλήθευση (authentication).
Οι υπηρεσίες αυτές παρέχουν επιβεβαίωση της ταυτότητας και απευθύνονται τόσο στις
οντότητες, όσο και στην ίδια την πληροφορία. Όταν δύο μέρη επικοινωνούν θα πρέπει
το καθένα από αυτά να επιβεβαιώσει την ταυτότητά του. Οι πληροφορίες οι οποίες
διακινούνται από ένα τηλεπικοινωνιακό κανάλι θα πρέπει να πιστοποιούν την
προέλευσή τους, την ημερομηνία δημιουργίας τους, το περιεχόμενο τους, την
ημερομηνία αποστολής τους κτλ. Για τους παραπάνω λόγους αυτή η υπηρεσία της
κρυπτογραφίας χωρίζεται σε δύο τμήματα:
Η υπηρεσία αυτή αποτρέπει μία οντότητα από το να αρνηθεί ότι μία επικοινωνία ή μία
συγκεκριμένη πράξη έχει ήδη πραγματοποιηθεί. Όταν μία πράξη αμφισβητείται από μία
οντότητα τότε χρειάζεται ένα μέσο προκειμένου να επιλύεται μία διαφωνία, όπου αυτή
προκύπτει. Έτσι υπάρχει προστασία έναντι μιας ανακριβούς άρνησης (μη παραδοχής)
ενός μέρους ότι μια συναλλαγή πράγματι έχει επισημοποιηθεί [9].
10
Ένας από τους βασικούς στόχους της κρυπτογραφίας είναι να εξασφαλίσει την
καλύτερη δυνατή ικανοποίηση των τεσσάρων προηγούμενων υπηρεσιών ασφαλείας
τόσο στη θεωρία όσο και στην πράξη. Αντικειμενικός της σκοπός είναι να ανακαλύψει
και να αποτρέψει οποιαδήποτε προσπάθεια εξαπάτησης ή κακόβουλη ενέργεια.
11
ίδιο γρήγορη με την εκτέλεση της σε υλικό, αλλά η ολοένα αυξανόμενη ανάγκη για
διασφάλιση των επικοινωνιών εδραίωσε τη χρήση της [6].
1.8 Κρυπτανάλυση
12
Τύπος Επίθεσης Στοιχεία γνωστά στον κρυπταναλυτή
Επίθεση
• Αλγόριθμος κρυπτογράφησης
κρυπτογραφήματος
• Κρυπτογράφημα
(ciphertext – only attack)
• Αλγόριθμος κρυπτογράφησης
Επίθεση γνωστού αρχικού • Κρυπτογράφημα
κειμένου (known – plaintext • Ένα ή περισσότερα ζεύγη (αρχικού κειμένου,
attack) κρυπτογραφήματος), παραγόμενα από το μυστικό
κλειδί
• Αλγόριθμος κρυπτογράφησης
Επίθεση επιλεγμένου • Κρυπτογράφημα
αρχικού κειμένου • Αρχικό κείμενο επιλεγμένο από τον κρυπταναλυτή,
(chosen – plaintext attack) σε συνδυασμό με το αντίστοιχο κρυπτογράφημα
που παράγεται με το μυστικό κλειδί
• Αλγόριθμος κρυπτογράφησης
Επίθεση επιλεγμένου • Κρυπτογράφημα
κρυπτογραφήματος • Επιλεγμένο απ’ τον κρυπταναλυτή κρυπτογράφημα,
(chosen – ciphertext attack) μαζί με το αντίστοιχο αποκρυπτογραφημένο αρχικό
κείμενο, που παράχθηκε με το μυστικό κλειδί
• Αλγόριθμος κρυπτογράφησης
• Κρυπτογράφημα
• Επιλεγμένο από τον κρυπταναλυτή μήνυμα αρχικού
Επίθεση επιλεγμένου κειμένου, μαζί με το αντίστοιχο κρυπτογράφημα,
κειμένου (chosen – text που παράχθηκε με το μυστικό κλειδί
attack) • Επιλεγμένο από τον κρυπταναλυτή
κρυπτογράφημα, μαζί με το αντίστοιχο
αποκρυπτογραφημένο αρχικό κείμενο, που
παράχθηκε με το μυστικό κλειδί
Μια κλασική επίθεση υπό αυτές τις περιστάσεις αποτελεί η προσέγγιση της
εξαντλητικής αναζήτησης κλειδιών (brute-force attack), όπου ο επιτιθέμενος δοκιμάζει
διαδοχικά όλα τα στοιχεία από το πεδίο όλων των πιθανών κλειδιών. Εάν το μέγεθος
του κλειδιού είναι μεγάλο, η επίθεση αυτού του είδους θεωρείται πρακτικά
ατελέσφορη. Κατά συνέπεια, ένας επιτιθέμενος για να είναι αποτελεσματικός θα πρέπει
να αξιοποιήσει ανάλυση του κρυπτογραφήματος εφαρμόζοντας διάφορες στατιστικές
δοκιμές σε αυτό. Ο επιτιθέμενος για να χρησιμοποιήσει αυτή την προσέγγιση θα πρέπει
να γνωρίζει τον τύπο του αρχικού κειμένου που χρησιμοποιείται, π.χ. ένα απλό κείμενο
σε συγκεκριμένη γλώσσα, ένα εκτελέσιμο αρχείο σε περιβάλλον συγκεκριμένου
λειτουργικού συστήματος, ένα αρχείο με πηγαίο κώδικα σε συγκεκριμένη γλώσσα
προγραμματισμού κλπ.
13
ότι συγκεκριμένα πρότυπα αρχικού κειμένου θα εμφανιστούν σε ένα μήνυμα. Για
παράδειγμα, ένα αρχείο σε μορφή postscript αρχίζει πάντοτε με το ίδιο πρότυπο, ή
μπορεί να υπάρξει μία τυποποιημένη επικεφαλίδα ή ένα λογότυπο σε ένα ηλεκτρονικό
μήνυμα μεταφοράς κεφαλαίων. Τα προαναφερόμενα παραδείγματα αποτελούν
επιθέσεις γνωστών μηνυμάτων. Με αυτή τη γνώση ο αναλυτής μπορεί να είναι σε θέση
να συμπεράνει το κλειδί, με βάση τον τρόπο που μετασχηματίστηκε το γνωστό αρχικό
κείμενο.
Στον Πίνακα 1. 2 εμφανίζονται και άλλοι δύο τύποι επίθεσης, η επίθεση επιλεγμένου
κρυπτογραφήματος (chosen ciphertext attack) και η επίθεση επιλεγμένου κειμένου
(chosen text attack), επιθέσεις οι οποίες δεν επιχειρούνται συχνά ως τεχνικές
κρυπτανάλυσης, μπορούν όμως να αποτελέσουν δυνητικούς τρόπους επίθεσης [8].
14
2.Κρυπτοσυστήματα και Αλγόριθμοι
Εάν ο πομπός και ο δέκτης χρησιμοποιούν το ίδιο κλειδί, τότε το σύστημα αναφέρεται
ως συμμετρικό ή μοναδικού κλειδιού ή μυστικού κλειδιού ή συμβατικής
κρυπτογραφίας. Εάν, όμως, ο πομπός και ο δέκτης χρησιμοποιούν διαφορετικά κλειδιά,
τότε το σύστημα αναφέρεται ως ασύμμετρο, ή σύστημα ζεύγους κλειδιών, ή
κρυπτογραφίας δημοσίου κλειδιού.
Ένας κωδικοποιητής τμημάτων (block cipher) επεξεργάζεται την είσοδο ενός τμήματος
στοιχείων κάθε φορά, παράγοντας ένα τμήμα εξόδου για κάθε συγκεκριμένο τμήμα
εισόδου. Αντίθετα, ένας κωδικοποιητής ροής (stream cipher) επεξεργάζεται κατά
συνεχή τρόπο τα στοιχεία εισόδου και κάθε φορά παράγεται ως έξοδος ένα στοιχείο, με
τη σειρά που καταφθάνουν τα δεδομένα[8].
15
Κρυπτοσυστήματα
Κλασσικά Μοντέρνα
Κρυπτοσυστήματα Κρυπτοσυστήματα
Μετάθεσης Συμμετρικά
Πολυσταδιακές Μονοσταδιακές
Συμμετρικοί Ψευδοτυχαίες
κρυπταλγόριθμοι ακολουθίες
Αντικατάστασης
Συναρτήσεις Ψηφιακές
κατακερματισμού υπογραφές
Μονοαλφαβητικής Πολυαλφαβητικής
Ασύμμετρα
Πολυγραμματικής Ομοφωνικής
Συμμετρικοί Ψηφιακές
κρυπταλγόριθμοι υπογραφές
Ρότορες
Κρυπτοσύστημα μετάθεσης.
Πρόκειται για μία απλή κρυπτογραφική μέθοδο κατά την οποία το κρυπτοκείμενο
προκύπτει με απλή αντιμετάθεση της διαδοχής των συμβόλων του αρχικού κειμένου.
Αυτό συνεπάγεται ότι το κρυπτοκείμενο αποτελείται από τα ίδια σύμβολα με αυτά του
αρχικού κειμένου και το μέγεθος του παραμένει σταθερό [11]. Υπάρχουν δύο τύποι
τέτοιων κρυπτοσυστημάτων:
Κρυπτοσύστημα αντικατάστασης.
Στην περίπτωση αυτή τμήματα του αρχικού κειμένου αντικαθίστανται από σύμβολα
του κρυπτογραφικού αλφαβήτου, σύμφωνα με κάποιους καθορισμένους κανόνες. Τα
τμήματα αυτά μπορεί να αποτελούνται από ένα ή περισσότερα γράμματα [12].
Διακρίνονται οι παρακάτω περιπτώσεις:
16
• Πολυαλφαβητική μετάθεση. Όπως και στη μονοαλφαβητική μετάθεση κάθε
σύμβολο του αρχικού κειμένου αντικαθίσταται από ένα άλλο σύμβολο με τη
διαφορά ότι χρησιμοποιούνται για την κρυπτογράφηση περισσότερα του ενός
κρυπτογραφικά αλφάβητα. Παραδείγματα αποτελούν ο κώδικας του Vigenere
και το κρυπτογραφικό αλφάβητο που χρησιμοποιείται από τις μηχανές
κρυπτογράφησης που λειτουργούσαν με τροχούς, όπως η Enigma.
• Πολυγραφική ή πολυγραμματική μετάθεση. Πρόκειται για μια
κρυπτογραφική μέθοδο στην οποία, σε αντίθεση με τη μονοαλφαβητική
μετάθεση, δεν αντιστοιχίζεται κάθε γράμμα σε ένα διαφορετικό του
κρυπτογραφικού αλφαβήτου, αλλά η αντιστοιχία αφορά ομάδες γραμμάτων ή
συλλαβές. Συνήθως η κρυπτογράφηση γίνεται ανά δύο γράμματα (διγραφικός
κώδικας), γεγονός που παρέχει κάποια πλεονεκτήματα, όπως ότι η κατανομή
των πιθανοτήτων εμφάνισης των γραμμάτων είναι πολλαπλάσια αυτών από τα
άλλα είδη μετάθεσης και ότι λόγω του μεγαλύτερου αριθμού δυνατών
συνδυασμών γραμμάτων (για το λατινικό αλφάβητο 262 =676 δυνατοί
συνδυασμοί ανά δυάδα) απαιτείται για το σπάσιμο του κώδικα πληθώρα
κρυπτογραφημένων μηνυμάτων.
• Ομοφωνική μετάθεση. Αποτελεί μία πρώτη προσπάθεια να αυξηθεί η
δυσκολία της ανάλυσης του κρυπτοκειμένου που βασίζεται στη συχνότητα
εμφάνισης του κάθε συμβόλου. Σύμφωνα με την μέθοδο αυτή τα γράμματα του
αρχικού μηνύματος αντιστοιχίζονται σε περισσότερα από ένα σύμβολα του
κρυπτογραφικού αλφαβήτου. Συνήθως στα γράμματα με την μεγαλύτερη
συχνότητα εμφάνισης αντιστοιχίζονται περισσότερα κρυπτογραφικά σύμβολα
από ότι στα λιγότερο εμφανιζόμενα γράμματα. Με τον τρόπο αυτό η κατανομή
των συχνοτήτων εμφάνισης εξομαλύνεται δυσκολεύοντας ακόμη περισσότερο
τη διαδικασία αποκρυπτογράφησης.
17
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Κατά την κρυπτογράφηση το κλειδί k προστίθεται στον αριθμό κάθε γράμματος του
μηνύματος και υπολογίζεται το υπόλοιπο της διαίρεσης του αθροίσματος με το πλήθος
των γραμμάτων της αλφαβήτου (για το λατινικό αλφάβητο έχουμε modulo 26 αφού το
πλήθος των γραμμάτων είναι 26). Έτσι, για παράδειγμα, εάν το κλειδί k είναι το 3, τότε
το μήνυμα “SECURE“ κρυπτογραφείται σε “VHFXUH”. Πιο συγκεκριμένα για το γράμμα
“S” προκύπτει το “V” γιατί το “S” έχει αντίστοιχο αριθμό το 18 και κρυπτογραφείται με
τον υπολογισμό 18 + 3 = 21 οπότε 21mod26 = 21, που αντιστοιχεί στο γράμμα “V”.
Γενικότερα, παρά τον μεγάλο αριθμό κλειδιών, πράγμα που αποκλείει μια απλή επίθεση
εξαντλητικής αναζήτησης (exhaustive search attack), ένας κρυπτογραφικός αλγόριθμος
απλής αντικατάστασης είναι εύκολο να σπάσει. Ένας λόγος είναι ότι σε κάθε φυσική
γλώσσα τα γράμματα της αλφαβήτου παρουσιάζουν πολύ διαφορετικές συχνότητες
εμφάνισης στις διάφορες προτάσεις π.χ. στα Ελληνικά το γράμμα Α είναι πολύ πιο
συχνά επαναλαμβανόμενο σε σχέση με γράμματα όπως Ζ και το Ψ. Αυτή η πληροφορία
συνδυαζόμενη με συχνότητες εμφάνισης συνδυασμών δύο ή τριών γραμμάτων μπορεί
να χρησιμοποιηθεί για να εξαχθούν αντιστοιχίες μεταξύ του αρχικού και του
κρυπτογραφημένου κειμένου, από τις οποίες είναι δυνατόν στη συνέχεια να προκύψει η
τιμή του κλειδιού [13,14,15].
18
Ο κρυπτογραφικός αλγόριθμος Vigenere είναι και αυτός μια ειδική μορφή
κρυπτογραφικού αλγορίθμου ροής. Ακριβώς όπως με τον κρυπτογραφικό αλγόριθμο
του Καίσαρα, χρησιμοποιεί πρόσθεση με υπολογισμό του modulo 26 αντί για πρόσθεση
με υπολογισμό του modulo 2 για να συνδυάσει το αρχικό κείμενο με την κλειδοροή. Η
κλειδοροή είναι απλά η λέξη κλειδί, η οποία επαναλαμβάνεται όσο χρειάζεται. Όμως
πάλι παραβαίνει τους κανόνες των γεννητριών κλειδοροής. Η περίοδος της ακολουθίας
κλειδοροής είναι μικρή. Έτσι προκύπτει φυσιολογικά ότι ο κρυπτογραφικός αλγόριθμος
Vigenere σπάζει εύκολα [13,14,15].
Ο παραπάνω κώδικας μοιάζει απολύτως ασφαλής. Και αυτό γιατί για την
αποκρυπτογράφηση του κειμένου είναι απαραίτητο το μπλοκ με τα γράμματα-κλειδιά
του σημειωματάριου μίας χρήσης, ενώ η μέθοδος ανάλυσης των πιθανοτήτων
εμφάνισης κάθε γράμματος αδυνατεί να συμβάλλει σε λύση του γρίφου, καθώς ένα
συγκεκριμένο κρυπτογραφημένο κείμενο μπορεί με τις ίδιες πιθανότητες να αντιστοιχεί
σε χιλιάδες αρχικά-μη κρυπτογραφημένα μηνύματα με την ίδια έκταση [13,14,15].
Το ότι ο κώδικας αυτός μολονότι ασφαλής δεν επικράτησε οφείλεται στα κάτωθι
μειονεκτήματα:
19
2.3 Σύγχρονα Κρυπτοσυστήματα
20
Επομένως, ο αποστολέας θα πρέπει να στείλει το κλειδί στον παραλήπτη, χωρίς να
πέσει στα χέρια του αντιπάλου. Ο λόγος που δεν αποστέλλεται απευθείας το κείμενο
μέσω ενός ασφαλούς καναλιού είναι ότι τα ασφαλή κανάλια δεν είναι πάντοτε
διαθέσιμα, απαιτούν σχετικά μεγάλη προσπάθεια για να δημιουργηθούν και η μορφή
τους είναι ανάλογα με την περίσταση. Για παράδειγμα ο αποστολέας και ο παραλήπτης
μπορεί να είχαν συναντηθεί κάποια στιγμή στο παρελθόν και να είχαν μοιραστεί το
κλειδί με την προοπτική να το χρησιμοποιήσουν σε μελλοντική επικοινωνία. Το
ασφαλές κανάλι ήταν η επαφή τους χωρίς τη μεσολάβηση κάποιου τρίτου (μιας
τηλεφωνικής εταιρείας για παράδειγμα). Ένας άλλος τρόπος για τη δημιουργία
ασφαλούς καναλιού, είναι να τεμαχιστεί το κλειδί και τα τεμάχια να διαβιβασθούν μέσω
διαφορετικών καναλιών, όπως τηλεφωνικά, ταχυδρομικά, ή με κούριερ, έτσι ώστε ο
αντίπαλος να μην είναι σε θέση να μπορεί να τα παρακολουθεί όλα και να συλλέξει όλα
τα τεμάχια για να χτίσει το κλειδί. Επίσης το κλειδί είναι πολύ μικρότερο σε μέγεθος
από το απλό κείμενο και επιπλέον μπορεί να επαναχρησιμοποιηθεί για την
κρυπτογράφηση πολλών κειμένων. Αυτό βέβαια είναι και μια πολύ σημαντική
κρυπτογραφική αδυναμία που μπορεί να εκμεταλλευτεί ο αντίπαλος και να σπάσει το
κρυπτοσύστημα.
Συνεπώς για την ασφαλή χρήση της συμμετρικής κρυπτογραφίας πρέπει να πληρούνται
οι ακόλουθες προϋποθέσεις:
21
Ενδεικτικά αναφέρονται παρακάτω οι συμμετρικοί αλγόριθμοι κρυπτογράφησης.
• ORYX
• RC4
• SEAL
• Ε0
• Α5/x
22
Κλειδί k
Γεννήτρια
Κλειδοροής
01110...
Μήνυμα M
Μήνυμα M 01101
01101 XOR XOR
Κρυπτογραφημένο κείμενο C
00011
ci = mi ⊕ ki , για i ≥ 0,
Όπου m0 , m1 , ... είναι τα bits του αρχικού κειμένου, k0 , k1 , ... είναι τα bits της
κλειδοροής και c0 ,c1 , ... είναι τα bits του κρυπτογραφημένου κειμένου. Το σύμβολο ⊕
συμβολίζει την πράξη της αποκλειστικής διάζευξης (exclusive – or) μεταξύ των bits.
Αντίστοιχα για την αποκρυπτογράφηση θα ισχύει :
mi = ci ⊕ ki , για i ≥ 0,
23
πλήθος των ψηφίων μηδέν (0) και των ψηφίων ένα (1), ή ότι κάθε μηδενικό
ψηφίο ακολουθείται από το ψηφίο ένα (1) τόσο συχνά όσο και το αντίστροφο.
• Η κλειδοροή θα πρέπει να έχει μεγάλη γραμμική ισοδυναμία (linear
equivalence). Οποιαδήποτε ακολουθία δυαδικών ψηφίων μπορεί να παραχθεί
με χρήση γραμμικών μεθόδων, για παράδειγμα με υπολογισμό της επόμενης
τιμής βάσει των προηγούμενων τιμών της ακολουθίας. Αν στον υπολογισμό
αυτό χρησιμοποιείται ένας μικρός σχετικά αριθμός προηγούμενων τιμών, τότε
λέμε πως η ακολουθία έχει μικρή γραμμική ισοδυναμία. Αντίθετα εάν στον
υπολογισμό χρησιμοποιείται ένας μεγάλος αριθμός προηγούμενων τιμών, τότε η
ακολουθία έχει μεγάλη γραμμική ισοδυναμία. Μία κλειδοροή με μεγάλη
γραμμική ισοδυναμία εγγυάται μεγαλύτερη ασφάλεια των κρυπτογραφημένων
δεδομένων απέναντι σε προσπάθειες κρυπτανάλυσης.
Οι αλγόριθμοι τμήματος συμμετρικού κλειδιού είναι οι πιο διάσημοι και πιο σημαντικοί
σε πολλά κρυπτογραφικά συστήματα. Από μόνoι τους προσφέρουν εμπιστευτικότητα
(confidentiality) αλλά λόγω της προσαρμοστικότητας τους συχνά χρησιμοποιούνται και
για την γεννήτρια παραγωγής ψευδοτυχαίων ακολουθιών, αλγορίθμους ροής,
συναρτήσεων κατακερματισμού (hash functions) και MACs (Message Authentication
Codes). Επίσης μπορούν να χρησιμοποιηθούν ως βασικό στοιχείο σε τεχνικές
αυθεντικοποίησης μηνύματος, σε μηχανισμούς ακεραιότητας μηνύματος, σε
πρωτόκολλα αυθεντικοποίησης οντότητας και σε ψηφιακές υπογραφές. Παρόλο που
προσφέρουν υψηλό επίπεδο ασφάλειας οι αλγόριθμοι τμήματος δεν μπορούν να
χρησιμοποιηθούν σε όλες τις εφαρμογές που απαιτούν κρυπτογραφικά συστήματα.
Αυτό ισχύει λόγω των απαιτήσεων ταχύτητας και περιορισμένης μνήμης ορισμένων
εφαρμογών [17].
24
απλού κειμένου σε τμήματα μήκους n-bits κρυπτοκειμένου. Το n ονομάζεται μήκος
τμήματος. Μπορεί να θεωρηθεί ως ένα απλό κρυπτοσύστημα αντικατάστασης με
χαρακτήρες μεγάλου μεγέθους. Η συνάρτηση έχει ως παράμετρο το διάνυσμα κλειδί k
διάστασης n, k ∈ K όπου Κ είναι ένα υποσύνολο του συνόλου όλων των διανυσμάτων
διάστασης n.
Ένας αλγόριθμος τμήματος n-bits είναι ένα τμήμα (μπλοκ n-bits) αρχικού κειμένου, που
αντιμετωπίζεται σαν ένα σύνολο και χρησιμοποιείται για να παράγει ένα τμήμα
κρυπτογραφήματος ίσου μήκους. Η συνάρτηση κρυπτογράφησης Ε(Ρ, k) είναι μια
αντιστρέψιμη αντιστοιχία και συμβολίζεται Εk(P). Η αντίστροφη αντιστοιχία είναι η
συνάρτηση αποκρυπτογράφησης η οποία συμβολίζεται Dk(P). Η σχέση C= Εk(P)
συμβολίζει ότι το κρυπτοκείμενο C προκύπτει από την κρυπτογράφηση του απλού
κειμένου Ρ. Η διαδικασία κρυπτογράφησης και αποκρυπτογράφησης παρουσιάζονται
στην Εικόνα 2. 4.
Τότε ο αριθμός των πιθανών αντιμεταθέσεων b-bit blocks είναι (2b)!, αλλά τελικά
περιορίζεται από το κλειδί k και είναι 2k. Επομένως για ένα “καλό” αλγόριθμο τμήματος
θα πρέπει να ισχύουν οι εξής ιδιότητες:
25
Το 1949 ο Shannon εισήγαγε τις έννοιες σύγχυση (Confusion) και διάχυση (Diffusion). Η
σύγχυση ορίζεται ως η λειτουργία η οποία κάνει τη σχέση μεταξύ κλειδιού και
κρυπτοκειμένου όσο το δυνατόν πολυπλοκότερη ενώ η διάχυση ορίζεται ως η
λειτουργία η οποία διαχέει την επιρροή των bits του απλού κειμένου έτσι ώστε τα bits
του κρυπτοκειμένου να εξαρτώνται από ολόκληρο το κείμενο. Η σύγχυση συνήθως
δίνεται από τη χρήση μιας αντικατάστασης η οποία ονομάζεται S-Box και η διάχυση
δίνεται από τη χρήση μιας αντιμετάθεσης.
Η άλλη μεγάλη κατηγορία για αλγόριθμους τμήματος είναι το δίκτυο Feistel. Στα
κρυπτοσυστήματα τύπου Feistel, το κείμενο χωρίζεται σε δύο μέρη και αφού το κάθε
ένα επιδέχεται διαφορετικές τροποποιήσεις στη συνέχεια συνδυάζονται με τέτοιο
τρόπο ώστε το ένα να “ενημερώνει” το άλλο. Οι τροποποιήσεις σε κάθε γύρο γίνονται
μέσο της συνάρτησης F η οποία συνήθως είναι ένα δίκτυο αντικατάστασης-
αντιμετάθεσης. Το κύριο χαρακτηριστικό του δικτύου Feistel είναι ότι η συνάρτηση F
μπορεί να είναι οποιαδήποτε συνάρτηση ακόμα και αν δεν είναι αντιστρέψιμη. Η δομή
του Feistel είναι τέτοια ώστε ο κάθε γύρος να είναι αντιστρέψιμος ακόμα και όταν η
συνάρτηση F δεν είναι. Όλα τα παραπάνω μπορούν να φανούν αναλυτικά στην Εικόνα
2. 6.
26
Η συνάρτηση F όπως ήδη αναφέραμε είναι συνήθως ένα δίκτυο αντικατάστασης-
αντιμετάθεσης. Αυτό είναι που θα δώσει στο κρυπτοσύστημα την απαιτούμενη
σύγχυση και διάχυση. Στη θεωρία ένας τρόπος να κατασκευάσει κάποιος ένα “καλό”
αλγόριθμο τμήματος είναι με το να επιλέξει για συνάρτηση F μια τυχαία συνάρτηση (Αν
η F είναι τυχαία συνάρτηση που αντιστοιχεί n-bits σε n-bits, τότε η δομή του Feistel
δίνει μια τυχαία συνάρτηση που αντιστοιχεί 2n-bits σε 2n-bits) και να χρησιμοποιήσει
τουλάχιστον τρείς γύρους ώστε να είναι ανθεκτικό σε συγκεκριμένους τύπους
επιθέσεων. Στη πράξη όμως είναι απαραίτητο να χρησιμοποιούνται διαφορετικά μέρη
του κλειδιού σε κάθε γύρο (στη διαδικασία κρυπτογράφησης). Επομένως υπάρχει η
ανάγκη για ένα Πρόγραμμα κλειδιού [17].
27
2.3.3.2 Μέθοδοι Γεμίσματος
Η διαγραφή του γεμίσματος από τον παραλήπτη είναι στοιχειώδης αν η δομή των
δεδομένων είναι τέτοια ώστε ο παραλήπτης μπορεί εύκολα να καταλάβει το τέλος του
string των δεδομένων. Κυρίως αυτό συμβαίνει σε περιπτώσεις όπου τα μηνύματα που
ανταλλάσσονται είναι καθορισμένου μήκους. Αλλιώς θα πρέπει να χρησιμοποιηθεί ένα
“ειδικό” string, το οποίο δεν εμφανίζεται πουθενά αλλού στο μήνυμα, για να δείχνει το
τέλος των δεδομένων. Σε αυτή τη περίπτωση μπορεί να χρησιμοποιηθεί οποιαδήποτε
μέθοδος γεμίσματος με την πιο απλή να είναι η πρόσθεση του ελάχιστου αριθμού από
μηδενικά στο τέλος του μηνύματος ώστε όλο το μήνυμα να είναι πολλαπλάσιο του j
[19,15].
Μια μέθοδος γεμίσματος μπορεί να σχεδιαστεί έτσι ώστε η διαγραφή του γεμίσματος
από τον παραλήπτη να γίνεται εύκολα ανεξάρτητα από το string δεδομένων. Μια τέτοια
μέθοδος είναι το Σαφές γέμισμα όπου προτείνει την προσθήκη ενός 1 στο τέλος του
μηνύματος, ακολουθούμενο από τον ελάχιστο αριθμό από μηδενικά ώστε το string που
έχει υποστεί γέμισμα να έχει μήκος πολλαπλάσιο του j. Αν ο παραλήπτης γνωρίζει ότι
έχει χρησιμοποιηθεί αυτή η μέθοδος, η αφαίρεση του γεμίσματος είναι κάτι τετριμμένο.
Το μειονέκτημα της μεθόδου αυτής είναι ότι μερικές φορές θα έχει ένα παραπάνω block
σε σχέση με το μηδενικό γέμισμα. Αυτό γίνεται στις περιπτώσεις όπου το τελευταίο
block έχει j-1 bits οπότε η μέθοδος θα προσθέσει ένα 1 και ένα ολόκληρο block με
μηδενικά [19,15].
28
ένα string n-bits και όχι αυθαίρετου μήκους. Ακόμα και όταν κρυπτογραφούμε string n-
bits μια μέθοδος λειτουργίας θα αποτρέψει τη διαρροή πληροφορίας που προκύπτει
από επαναλαμβανόμενα n-bits στο απλό κείμενο.
Το 1980 στις Η.Π.Α. έγιναν πρότυπα τέσσερις μέθοδοι λειτουργίας ονόματι Electronic
Codebook (ECB), Cipher Block Chaining (CBC), Output Feedback (OFB), και Cipher
Feedback(CFB). Αυτές οι μέθοδοι περιγράφηκαν κυρίως για χρήση με το
κρυπτοσύστημα DES αλλά αργότερα εφαρμόστηκαν και σε άλλους αλγορίθμους
τμήματος. Οι τέσσερις μέθοδοι λειτουργίας αρχικά καθορίστηκαν στο Αμερικανικό
πρότυπο μεθόδων λειτουργίας, NBS FIPS Pub.81, και στη συνέχεια έγιναν κρατικό
πρότυπο στις Η.Π.Α., ANSI X3.106 το 1983. Το τελευταίο δεν είναι πλέον διαθέσιμο
καθώς αντικαταστάθηκε από ένα πρότυπο του διεθνούς οργανισμού ISO
[20,9,15,17,18].
Στην ECB μέθοδο, ίδια blocks απλού κειμένου καταλήγουν σε ίδια block
κρυπτοκειμένου. Αυτό είναι πρόβλημα όταν κρυπτογραφούνται μεγάλα μηνύματα
αφού η πιθανότητα να υπάρχουν δύο ίδια block είναι μεγάλη. Για παράδειγμα, αν το
απλό κείμενο είναι ένα κείμενο στα Αγγλικά τροποποιημένο σε δυαδική μορφή, τότε η
πιθανότητα να υπάρχουν δύο ίδια blocks είναι αρκετά μεγάλη αφού
επαναλαμβανόμενες λέξεις και φράσεις είναι κάτι το συνηθισμένο.
Επίσης η χρήση αυτής της μεθόδου έχει σαν αποτέλεσμα την εμφάνιση ενός φαινομένου
που ονομάζεται εξάπλωση σφάλματος (error propagation). Έτσι αν ένα απλό bit έχει
σφάλμα κατά τη μετάδοση του μηνύματος, κατά την αποκρυπτογράφηση θα είναι
λάθος ένα ολόκληρο block [9,15,17,18].
29
2.3.3.3.2 Cipher Block Chaining (CBC) Mode
Όπως και στην ECB, έτσι και στη μέθοδο Αλυσιδωτής Κρυπτογράφησης Τμημάτων (CBC)
το απλό κείμενο πρέπει να γεμίσει με κάποια από τις μεθόδους γεμίσματος ώστε να έχει
μήκος πολλαπλάσιο του j και να χωριστεί σε μια ακολουθία τμημάτων j-bits: P0, P1, …,Pq.
Πρέπει να επιλεγεί ένα διάνυσμα αρχικοποίησης (IV) το οποίο θα γίνει XOR με το
πρώτο block και το αποτέλεσμα αυτό θα είναι είσοδος στη συνάρτηση
κρυπτογράφησης. Για κάθε επόμενο block η είσοδος στον αλγόριθμο κρυπτογράφησης
είναι το αποτέλεσμα XOR του τρέχοντος block και του προηγούμενου
κρυπτογραφήματος. Έτσι η κρυπτογράφηση (Εικόνα 2. 8) περιέχει τον υπολογισμό
τμημάτων κρυπτοκειμένου C0, C1, …, Cq ως εξής:
Το διάνυσμα αρχικοποίησης IV πρέπει να είναι γνωστό τόσο στον πομπό όσο και στο
δέκτη. Για την επίτευξη μέγιστης ασφάλειας πρέπει να διασφαλίζεται η μυστικότητα
του διανύσματος αρχικοποίησης με τον ίδιο τρόπο που συμβαίνει και για το κλειδί.
Αυτό επιτυγχάνεται με την αποστολή του διανύσματος αρχικοποίησης
χρησιμοποιώντας τη μέθοδο ECB.
Αν το διάνυσμα αρχικοποίησης είναι ίδιο για κάθε μήνυμα, τότε η κρυπτογράφηση του
ίδιου κειμένου καταλήγει στο ίδιο κρυπτοκείμενο. Επομένως οι χρήστες θα πρέπει να
χρησιμοποιούν διαφορετικά διανύσματα αρχικοποίησης για κάθε μήνυμα.
Το πλεονέκτημα της συγκεκριμένης μεθόδου έναντι της ECB είναι ότι ίδια blocks απλού
κειμένου δεν καταλήγουν σε ίδια block κρυπτοκειμένου. Τέλος, όσον αφορά την
εξάπλωση σφάλματος και αυτή η μέθοδος παρουσιάζει το φαινόμενο αυτό. Πιο
συγκεκριμένα, αν υποθέσουμε ότι το block κρυπτοκειμένου C1 έχει σφάλμα μετάδοσης
σε 1-bit, τότε επειδή κατά την αποκρυπτογράφηση το block απλού κειμένου P1
εξαρτάται από δύο blocks κρυπτοκειμένου (𝑃1 = 𝐶0 ⊕ 𝐷𝐾 [𝐶1 ] ) καταλήγουμε ότι το Ρ1
θα έχει τυχαίο αριθμό bits που είναι λάθος. Επίσης το block απλού κειμένου Ρ2 θα έχει
και αυτό σφάλμα κατά 1-bit, αφού (𝑃2 = 𝐶1 ⊕ 𝐷𝐾 [𝐶2 ] ) και το C1 είναι λάθος
[9,15,17,18].
30
2.3.3.3.3 Cipher Feedback (CFB) Mode
Η CFB λειτουργεί ως εξής: Το αρχικό κείμενο διαιρείται σε μια σειρά από blocks μήκους
j-bits, τα P1, P2,…,Pq, όπου το Pq περιέχει t≤j bits. Κατά τη διαδικασία της
κρυπτογράφησης, η είσοδος της συνάρτησης κρυπτογράφησης είναι ένας καταχωρητής
ολίσθησης 64-bits που αρχικοποιείται με κάποιο διάνυσμα αρχικοποίησης IV. Στα j
αριστερά, δηλαδή στα j πλέον σημαντικά ψηφία της εξόδου της συνάρτησης
κρυπτογράφησης, εκτελείται η πράξη XOR με την πρώτη μονάδα του αρχικού κειμένου
P1, ώστε να παραχθεί η πρώτη μονάδα του κρυπτογραφήματος C1, η οποία μετά
αποστέλλεται(Εικόνα 2. 9). Ακολούθως, τα περιεχόμενα του καταχωρητή ολίσθησης
ολισθαίνουν αριστερά κατά j bit και το C1 τοποθετείται στα δεξιά, δηλαδή στα λιγότερο
σημαντικά j bit του καταχωρητή ολίσθησης. Η διαδικασία αυτή επαναλαμβάνεται
μέχρις ότου κρυπτογραφηθούν όλες οι μονάδες αρχικού κειμένου. Για την
αποκρυπτογράφηση χρησιμοποιείται το ίδιο σχήμα, αλλά στη λαμβανόμενη μονάδα
κρυπτογραφημάτων εκτελείται η πράξη XOR με την έξοδο της συνάρτησης
κρυπτογράφησης για την παραγωγή της μονάδας αρχικού κειμένου. Σημειώνεται ότι
χρησιμοποιείται η συνάρτηση κρυπτογράφησης και όχι η συνάρτηση
αποκρυπτογράφησης.
Όπως στην CBC mode, έτσι και στη CFB, αν το διάνυσμα αρχικοποίησης είναι το ίδιο για
κάθε μήνυμα, τότε η κρυπτογράφηση του ίδιου κειμένου καταλήγει στο ίδιο
κρυπτοκείμενο. Επομένως οι χρήστες θα πρέπει να χρησιμοποιούν διαφορετικά
διανύσματα αρχικοποίησης για κάθε ένα μήνυμα και αν γίνεται να τα κρατούν κρυφά.
Όσον αφορά την εξάπλωση σφάλματος και αυτή η μέθοδος παρουσιάζει το φαινόμενο
αυτό. Πιο συγκεκριμένα, αν υποθέσουμε ότι το block κρυπτοκειμένου Ci έχει σφάλμα
μετάδοσης σε 1-bit, τότε επειδή κατά την αποκρυπτογράφηση το block απλού κειμένου
Ρi εξαρτάται από δύο blocks κρυπτοκειμένου καταλήγουμε ότι ένα τουλάχιστον block
απλού κειμένου θα έχει τυχαίο αριθμό bits που είναι λάθος [9,15,17,18].
31
2.3.3.3.4 Output Feedback (OFB) Mode
Ο τρόπος λειτουργίας της OFB είναι παρόμοιος, γενικά, με τη μέθοδο λειτουργίας CFB. Η
κύρια διαφορά τους έγκειται στο γεγονός ότι ο καταχωρητής ολίσθησης
επανατροφοδοτείται από την έξοδο της λειτουργίας κρυπτογράφησης (Εικόνα 2. 10),
ενώ στη μέθοδο CFB ο καταχωρητής ολίσθησης επανατροφοδοτείται από την
κρυπτογραφημένη ακολουθία.
Όπως και στις δύο προηγούμενες μεθόδους, έτσι και στη OFB, αν το διάνυσμα
αρχικοποίησης είναι το ίδιο για κάθε μήνυμα, τότε η κρυπτογράφηση του ίδιου
κειμένου καταλήγει στο ίδιο κρυπτοκείμενο. Επομένως οι χρήστες θα πρέπει να
χρησιμοποιούν διαφορετικά διανύσματα αρχικοποίησης για κάθε ένα μήνυμα και αν
γίνεται να τα κρατούν κρυφά.
Όσον αφορά την εξάπλωση σφάλματος αυτή η μέθοδος δεν παρουσιάζει το φαινόμενο
αυτό. Πιο συγκεκριμένα, αν υποθέσουμε ότι το block κρυπτοκειμένου Ci έχει σφάλμα
μετάδοσης σε 1-bit, τότε το block απλού κειμένου Pi θα έχει σφάλμα σε ένα bit
[9,15,17,18].
Ένα κοινό πρόβλημα που παρουσιάζουν οι παραπάνω μέθοδοι, εκτός από την ECB είναι
πως πρέπει να γίνει αποκρυπτογράφηση όλων για να μπορούμε να διαβάσουμε ένα
κομμάτι δεδομένων. Αυτό αποτελεί σοβαρό πρόβλημα, ιδιαίτερα σε περιπτώσεις που η
πρόσβαση στα δεδομένα γίνεται με μη σειριακό τρόπο, όπως η πρόσβαση σε αρχεία
σκληρού δίσκου. Για να λυθεί το παραπάνω χρησιμοποιούμε την Counter Mode.
32
Εικόνα 2. 11 Counter Mode.
Στο σημείο αυτό αξίζει να αναφερθούν ορισμένες πληροφορίες και μια συνοπτική
περιγραφή των πιο σημαντικών συμμετρικών αλγορίθμων κρυπτογράφησης. Στο
επόμενο κεφάλαιο θα γίνει μια εκτενής περιγραφή του συμμετρικού
κρυπτοσυστήματος AES.
O DES εγκρίθηκε ως ομοσπονδιακό πρότυπο τον Νοέμβριο του 1976 και δημοσιεύθηκε
στις 15 Ιανουαρίου του 1977 ως FIPS PUB 46 και η χρήση του ήταν επιτρεπτή σε όλα τα
μη απόρρητα δεδομένα. Στη συνέχεια επιβεβαιώθηκε ως πρότυπο το 1983, το 1988
(αναθεωρήθηκε ως FIPS-46-1), το 1993 (ως FIPS-46-2) και πάλι το 1999 (ως FIPS-46-
3). Ο τελευταίος ορισμός ήταν ο Triple DES. Στις 26 Μαΐου του 2002 ο DES τελικά
εκτοπίστηκε από τον Advanced Encryption Standard (AES) κατόπιν δημόσιου
διαγωνισμού. Στις 19 Μαΐου του 2005 ο FIPS 46-3 είχε επισήμως αποσυρθεί, αλλά το
Εθνικό Ινστιτούτο Προτύπων και Τεχνολογίας (National Institute of Standards and
Technology - NIST) ενέκρινε τον Triple DES το έτος 2003 για τις ευαίσθητες
πληροφορίες της κυβέρνησης. Μια άλλη θεωρητική επίθεση, η γραμμική κρυπτανάλυση,
δημοσιεύθηκε το 1994, αλλά ήταν μια επίθεση εξαντλητικής αναζήτησης το 1998 που
απέδειξε ότι θα μπορούσε κάποιος πρακτικά να επιτεθεί στον DES και τονίστηκε η
ανάγκη για αντικατάσταση του αλγόριθμου.
33
Σύμφωνα με το πρότυπο DES το αρχικό κείμενο είναι μεγέθους 64-bit και το κλειδί έχει
μήκος 56-bit. Τα απλά κείμενα μεγαλύτερου μεγέθους επεξεργάζονται σε τμήματα των
64-bit.
Το αρχικό κείμενο έχει τρία στάδια επεξεργασίας. Στην αρχή, το κείμενο των 64-bit
ακολουθεί έναν αρχικό μετασχηματισμό (initial permutation - IP) στα πλαίσια του
οποίου τα bits αναδιατάσσονται για να παραχθεί η μετασχηματισμένη είσοδος.
Ακολουθεί ένα στάδιο που αποτελείται από 16 επαναλήψεις της ίδιας λειτουργίας. Η
έξοδος της τελευταίας επανάληψης, δηλαδή της δέκατης έκτης, αποτελείται από 64-bit
που αποτελούν συνάρτηση του αρχικού κειμένου και του κλειδιού. Το αριστερό μισό
τμήμα και το δεξί μισό τμήμα της εξόδου αντιμετατίθενται, ώστε να παραχθεί η αρχική
έξοδος. Η τιμή αυτή τροποποιείται με βάση ένα μετασχηματισμό που είναι o
αντίστροφος του αρχικού μετασχηματισμού (inverse initial permutation – IP-1), ώστε
να παραχθεί το κρυπτογράφημα των 64-bit.
Η ανησυχία που υπήρχε για την ισχύ του αλγορίθμου DES βασιζόταν σε δύο αιτίες:
αιτίες σχετιζόμενες με τον ίδιο τον αλγόριθμο και αιτίες σχετιζόμενες με τη χρήση
κλειδιού με μέγεθος 56-bit.
Η δεύτερη κατηγορία αιτιών ανησυχίας βασιζόταν στο μήκος του κλειδιού. Ήδη από τα
τέλη της δεκαετίας του '70 εμπειρογνώμονες σε θέματα ασφάλειας προειδοποιούσαν
ότι η χρονική διάρκεια κατά την οποία ο αλγόριθμος DES με μέγεθος κλειδιού 56 bit θα
θεωρείται ασφαλής αλγόριθμος, είναι ολοένα και μικρότερη, λαμβάνοντας υπόψη τις
διαφαινόμενες τάσεις αύξησης της ταχύτητας των επεξεργαστών και ταυτόχρονης
μείωσης των τιμών του υλικού. Τον Ιούλιο του 1998, το Ίδρυμα Electronic Frontier
Foundation - EFF ανακοίνωσε ότι κατάφερε εντός τριών ημερών την κρυπτανάλυση
ενός DES κρυπτομηνύματος χρησιμοποιώντας μία μηχανή ειδικού σκοπού
αποκαλούμενη DES cracker που κόστισε λιγότερο από 250.000 δολάρια. Το EFF
δημοσίευσε λεπτομερή περιγραφή της μηχανής, παρέχοντας τη δυνατότητα και σε
όποιον άλλον επιθυμούσε να δημιουργήσει αντίστοιχες ατομικές μηχανές
[5,8,9,15,17,18].
34
2.3.4.2 Αλγόριθμος Triple DES
O ΤDES ή TDEA ή συνηθέστερα 3DES προτάθηκε αρχικά από τον W. Tuchman και το
1985 προτυποποιήθηκε στο ANSI X9.17, ώστε να χρησιμοποιηθεί σε οικονομικές
εφαρμογές. Το 1999, με τη δημοσίευση του ως FIPS PUB 46-3, o TDES ενσωματώθηκε
ως τμήμα της προτυποποίησης κρυπτογράφησης δεδομένων DES. Ο TDES ακολούθησε
τον αλγόριθμο 2DES, ο οποίος δεν αξιοποιήθηκε ευρέως αφού θεωρήθηκε ευάλωτος
στις κρυπταναλυτικές επιθέσεις τύπου ενδιάμεσου (man in the middle attack).
Ο TDES χρησιμοποιεί τρία κλειδιά και τρεις εκτελέσεις του αλγορίθμου DES. Ο
αλγόριθμος ακολουθεί τη διαδοχή: κρυπτογράφηση, αποκρυπτογράφηση,
κρυπτογράφηση (EDE – encryption – decryption - encryption) (Εικόνα 2. 12 α):
C=EK3[DK2[EK1[P]]]
όπου:
C = κρυπτογράφημα
P = αρχικό κείμενο
EK[X] = κρυπτογράφηση του Χ με χρήση του κλειδιού Κ
DK[Y] = αποκρυπτογράφηση του Χ με χρήση του κλειδιού Κ
Αξίζει να σημειωθεί ότι η ύπαρξη της αποκρυπτογράφησης στο δεύτερο στάδιο της
κρυπτογράφησης TDES δεν παρουσιάζει κάποια κρυπτογραφική χρησιμότητα, απλώς
επιτρέπει στους χρήστες του TDES να αποκρυπτογραφήσουν τα στοιχεία που
κρυπτογραφούνται από τους χρήστες του απλού DES:
C=EK1[DK1[EK1[P]]]=EK1[P]
Ο TDES, με την υποστήριξη τριών διαφορετικών κλειδιών, διαθέτει κλειδί μήκους 168-
bit. Στα πλαίσια του FIPS 46-3 επιτρέπεται, επίσης, η χρήση δύο κλειδιών K1, K2, με K1
= K3. Το γεγονός αυτό εξασφαλίζει μήκος κλειδιού 112-bit. Το FIPS 46-3 περιλαμβάνει
τις ακόλουθες οδηγίες για το TDES:
Ο TDES αποτελεί έναν εξαιρετικό αλγόριθμο, ο οποίος επειδή προέρχεται από τον DES
παρουσιάζει την ίδια ρωμαλεότητα με αυτόν σε κρυπταναλυτικές επιθέσεις. Επιπλέον,
με μήκος κλειδιού 168-bit οι επιθέσεις τύπου εξαντλητικής αναζήτησης είναι πρακτικά
ατελέσφορες. Συνεπώς ο TDES αναμένεται ότι θα αξιοποιείται ολοένα και περισσότερο
τα επόμενα χρόνια, μέχρι την ολοκληρωτική μετάβαση στις επερχόμενες υλοποιήσεις
του AES [5,8,9,15,17,18].
35
K1 K2 K3
P A B C
E D E
α)Κρυπτογράφηση
K3 K2 K1
B A
C P
D E D
β)Αποκρυπτογράφηση
Εικόνα 2. 12 TDES.
Περισσότερα όμως για το πρότυπο AES θα δούμε στο επόμενο κεφάλαιο όπου και
παρουσιάζεται αναλυτικά όλη η λειτουργία του.
36
2.3.4.4 Αλγόριθμος IDEA (International Data Encryption Algorithm)
Παρόλο που δεν έχει την κατασκευή ενός αλγορίθμου Feistel, η αποκρυπτογράφηση
γίνεται με τον ίδιο τρόπο που γίνεται και η κρυπτογράφηση. Έχει σχεδιαστεί για να
είναι εύκολα εφαρμόσιμος τόσο σε υλικό όσο και σε λογισμικό. Μερικές όμως
αριθμητικές διεργασίες που χρησιμοποιεί ο IDEA καθιστούν τις λογισμικές εφαρμογές
αργές, παρόμοιες σε ταχύτητα με τον DES.
Ο IDEA ήταν ένας από τους προτεινόμενους 128-bit αντικαταστάτες του DES, έχει
υποβληθεί σε αξιοσημείωτη διερεύνηση και εμφανίζεται ανθεκτικός σε
κρυπταναλυτικές επιθέσεις. Ο IDEA χρησιμοποιείται στο προϊόν λογισμικού PGP, ως μία
από τις εναλλακτικές επιλογές, καθώς και σε διάφορα εμπορικά προϊόντα
[5,8,9,15,17,18].
Ο κρυπτογραφικός αλγόριθμος RC2 αναπτύχθηκε από τον Ron Rivest της εταιρίας RSA
Security το 1987. Είναι ένας κρυπτογραφικός αλγόριθμος τμήματος με μέγεθος block 64
bits που χρησιμοποιεί 18 γύρους σε δίκτυο Feistel. Βασικό χαρακτηριστικό του είναι ότι
υποστηρίζει κλειδιά μεταβλητού μεγέθους από 8 έως 128 bits. Αν το μέγεθος του
κλειδιού είναι μεγαλύτερο από 56 bits είναι ανεκτικότερος από τον αλγόριθμο DES
[5,8,9,15,17,18].
Ο RC4 είναι ένας αλγόριθμος ροής που σχεδιάστηκε από τον Ron Rivest της εταιρίας
RSA Security το 1987 και δημοσιεύτηκε το 1994. Έχει μεταβλητό μήκος κλειδιού από 40
έως 2048 bits και λειτουργεί σε επίπεδο byte. Χρησιμοποιεί 256 γύρους και θεωρείται
εξαιρετικά ασφαλής και οι υλοποιήσεις του σε λογισμικό τρέχουν πολύ γρήγορα.
Χρησιμοποιείται για κρυπτογράφηση τοπικά αποθηκευμένων αρχείων και για τη
διασφάλιση της επικοινωνίας μεταξύ δύο απομακρυσμένων σημείων μέσω του
πρωτοκόλλου SSL [5,8,9,15,17,18].
37
2.3.4.6 Αλγόριθμος RC5
Ο RC5 αναπτύχθηκε το 1994 από τον R. Rivest, έναν από τους σχεδιαστές του
αλγορίθμου δημοσίου κλειδιού RSA. Ο RC5 προσδιορίζεται στο RFC 2040 και
σχεδιάστηκε για να υποστηρίζει τα ακόλουθα χαρακτηριστικά:
Ο RC5 χρησιμοποιείται σε διάφορα προϊόντα από την RSA Data Security, Inc
[5,8,9,15,17,18].
38
δεδομένων. Οι υπόλοιποι 16 κύκλοι αξιοποιούν 8 S-boxes των 32 bit με πράξεις
πρόσθεσης και XOR [5,8,9,15,17,18].
Όπως ο αλγόριθμος DES, ο αλγόριθμος Blowfish χρησιμοποιεί S-boxes, XOR, καθώς και
δυαδική πρόσθεση. Αντίθετα από τον DES που χρησιμοποιεί σταθερά S-boxes, ο
Blowfish χρησιμοποιεί δυναμικά S-boxes που παράγονται ως συνάρτηση του κλειδιού.
Στον Blowfish, τα υποκλειδιά και τα S-boxes παράγονται από την επανειλημμένη
εφαρμογή του ίδιου του αλγορίθμου Blowfish στο κλειδί. Συνολικά απαιτούνται 521
εκτελέσεις του αλγορίθμου κρυπτογράφησης Blowfish για την παραγωγή των
υποκλειδιών και των S-boxes. Απόρροια των χαρακτηριστικών αυτών είναι το
συμπέρασμα ότι ο Blowfish δεν είναι κατάλληλος για εφαρμογές στις οποίες το μυστικό
κλειδί αλλάζει συχνά.
39
2.3.4.12 Αλγόριθμος CAST-128
Το CAST χρησιμοποιεί σταθερά S-boxes, αλλά μόνον αυτά που είναι σημαντικά
μεγαλύτερα των S-boxes που χρησιμοποιούνται στο DES. Τα S-boxes σχεδιάστηκαν
προσεκτικά, ώστε να μην παρουσιάζουν γραμμικότητα στη σχέση εισόδου και εξόδου,
συνεπώς να είναι ανθεκτικά σε κρυπταναλυτικές επιθέσεις. Η διαδικασία παραγωγής
υποκλειδιών που χρησιμοποιείται στον CAST-128 είναι διαφορετική από αυτήν που
υιοθετείται σε άλλους συμβατικούς αλγορίθμους κρυπτογράφησης τμημάτων. Οι
σχεδιαστές του CAST προσπάθησαν να δημιουργήσουν υποκλειδιά με μεγαλύτερο
βαθμό ανθεκτικότητας σε γνωστές κρυπταναλυτικές επιθέσεις. Θεωρήθηκε ότι η χρήση
μη-γραμμικών S-boxes για παραγωγή κλειδιών από το βασικό κλειδί, παρείχε αυτή την
ισχύ. Αξιοσημείωτο χαρακτηριστικό γνώρισμα του CAST-128 αποτελεί η συνάρτηση
κύκλου F, η οποία διαφέρει από γύρο σε γύρο, καθιστώντας τον αλγόριθμο
κρυπταναλυτικά ανθεκτικότερο [5,8,9,15,17,18].
Το μήκος κλειδιού είναι ένας από τους διάφορους παράγοντες που προσδιορίζουν το
βαθμό ασφαλείας που προσφέρει μια κρυπτογράφηση. Όπως και με όλα τα θέματα
ασφαλείας, το σημαντικότερο θέμα είναι η εξισορρόπηση του κόστους, του χρόνου και
άλλων στοιχείων. Κλειδιά των 56 bits που χρησιμοποιούνται, για παράδειγμα, στον DES,
δεν είναι ασφαλή ώστε να αποτρέψουν τους διάφορους εισβολείς.
40
• Ο αλγόριθμος πρέπει να είναι διαθέσιμος σε όλους τους χρήστες.
• Ο αλγόριθμος πρέπει να είναι προσαρμόσιμος για χρήση σε διάφορες
εφαρμογές.
• Ο αλγόριθμος πρέπει να είναι οικονομικά υλοποιήσιμος σε ηλεκτρονικές
συσκευές.
• Ο αλγόριθμος πρέπει να είναι αποτελεσματικός στη χρήση.
Όλα τα παραπάνω έχουν ληφθεί υπόψη και έχουν εφαρμοστεί στους αλγορίθμους που
μελετήσαμε. Οι διαφορές τους βρίσκονται στο μέγεθος του κλειδιού που
χρησιμοποιούν, στο μέγεθος του τμήματος που επεξεργάζονται και στον τρόπο με τον
οποίο επεξεργάζονται τα δεδομένα. Βέβαια κάποιοι αλγόριθμοι έχουν υποστεί
κρυπταναλυτικές επιθέσεις και κάποιοι επίσης έχουν σπάσει. Στον Πίνακα 2. 1
παρουσιάζονται συνοπτικά τα χαρακτηριστικά των πιο δημοφιλών συμμετρικών
αλγορίθμων [21].
DES IBM 1975 64 bits 56 bits Δίκτυο Feistel 16 Ναι Επίθεση ωμής βίας
(Brute force attack),
διαφορική
κρυπτανάλυση,
γραμμική
κρυπτανάλυση
επίθεση Davies
TDES IBM 1978 64 bits 112 bits ή Δίκτυο Feistel 48 Όχι Πιθανώς σε
168 bits θεωρητικό επίπεδο
AES Joan Daemen 128 bits 128 bits, Δίκτυο 10/12/14 Όχι Επιθέσεις πλευρικού
& Vincent 192 bits, αντικαταστάσεων- καναλιού
Rijmen 1998 256 bits αντιμεταθέσεων
Twofish Bruce 128 bits 128 bits, Δίκτυο Feistel 16 Όχι Κατατετμημένη
Schneier 192 bits, διαφορική
1993 256 bits κρυπτανάλυση
Blowfish Bruce 64 bits 32-448 bit Δίκτυο Feistel 16 Όχι Δεύτερης τάξης
Schneier 1993 σε βήματα διαφορική επίθεση
των 8 bits.
128 bits
προεπιλογή
RC2 Ron Rivest 64 bits 8-128 bit Δίκτυο Feistel 18 Ναι Σχετικές επιθέσεις
1987 σε βήματα κλειδιού
των 8 bits.
64 bits
προεπιλογή
RC4 Ron Rivest - 40-2048 Ροής 256 Ναι Διάκριση με βάση το
1987 bits χρονοδιάγραμμα
αδύναμου κλειδιού
41
2.3.5 Ασύμμετρα Κρυπτοσυστήματα
Για την ασφαλή αποστολή ενός μηνύματος, ο αποστολέας χρησιμοποιεί για την
κρυπτογράφηση του το δημόσιο κλειδί του προβλεπόμενου παραλήπτη. Το μήνυμα
είναι δυνατόν να διαβαστεί μόνον από αυτόν (τον παραλήπτη), διότι η
αποκρυπτογράφησή του γίνεται με χρήση του μυστικού, ιδιωτικού του κλειδιού.
Επομένως, εξασφαλίζεται το απόρρητο του μηνύματος. Εξάλλου, είναι υπολογιστικά
ανέφικτο να εξαχθεί το ιδιωτικό κλειδί από το αντίστοιχο δημόσιο κλειδί. Στην Εικόνα
2. 13 που ακολουθεί παρουσιάζεται σχηματικά η παραπάνω διαδικασία.
Η ασφάλεια της όλης διαδικασίας βασίζεται στη μυστικότητα των ιδιωτικών κλειδιών.
Αν παραβιαστεί η ακεραιότητα του συστήματος, υπάρχει η δυνατότητα να αλλάξουν
μόνο τα χρησιμοποιούμενα κλειδιά, αντί να αλλάξει ολόκληρος ο αλγόριθμος
κρυπτογράφησης όπως θα συνέβαινε στην περίπτωση της συμμετρικής
κρυπτογράφησης.
Η δημιουργία του δημόσιου και του ιδιωτικού κλειδιού γίνεται από ειδικές συναρτήσεις
οι οποίες δέχονται ως είσοδο έναν μεγάλο τυχαίο αριθμό και στην έξοδο παράγουν το
ζεύγος των κλειδιών. Είναι προφανές ότι όσο πιο τυχαίος είναι ο αριθμός που παρέχεται
ως είσοδος στην γεννήτρια κλειδιών τόσο πιο ασφαλή είναι τα κλειδιά που παράγονται.
42
Οι κρυπτογραφικοί αλγόριθμοι δημοσίου κλειδιού μπορούν να εγγυηθούν
εμπιστευτικότητα (confidentiality), δηλαδή ότι το κρυπτογραφημένο μήνυμα που θα
σταλεί από τον αποστολέα μέσω του διαδικτύου στον παραλήπτη θα είναι αναγνώσιμο
από αυτόν και μόνο αφού μπορεί να αποκρυπτογραφηθεί μόνο από το ιδιωτικό του
κλειδί. Άρα λοιπόν με αυτόν τον τρόπο ο αποστολέας γνωρίζει ότι το κρυπτογραφημένο
μήνυμα μπορεί να αποκρυπτογραφηθεί μονάχα από τον παραλήπτη και έτσι
διασφαλίζεται η εμπιστευτικότητα του μηνύματος.
Η παραπάνω μέθοδος μπορεί να εξασφαλίσει την εμπιστευτικότητα αλλά όχι και την
πιστοποίηση του αποστολέα. Αυτό με λίγα λόγια σημαίνει πως η παραπάνω μέθοδος
δεν μπορεί να εγγυηθεί την ταυτότητα του αποστολέα. Πράγματι, ο αποστολέας μπορεί
να δηλώσει ψευδή ταυτότητα και ο παραλήπτης να νομίσει ότι το συγκεκριμένο μήνυμα
προήλθε από άλλο πρόσωπο.
Παρόλο που η παραπάνω μέθοδος εγγυάται την ταυτοποίηση του αποστολέα, δεν
δύναται να εγγυηθεί και την εμπιστευτικότητα του μηνύματος. Πράγματι, το μήνυμα
μπορεί να το αποκρυπτογραφήσει ο οποιοσδήποτε διαθέτει το δημόσιο κλειδί του
αποστολέα. Όπως έχει ήδη ειπωθεί, το δημόσιο κλειδί είναι γνωστό σε όλη την
διαδικτυακή κοινότητα, άρα πρακτικά ο οποιοσδήποτε μπορεί να διαβάσει το
περιεχόμενο του μηνύματος.
43
Συνδυάζοντας τις δύο τεχνικές που παρουσιάστηκαν παραπάνω είναι εφικτό να
επιτευχθεί και εμπιστευτικότητα του μηνύματος και πιστοποίηση του αποστολέα.
Δηλαδή αφενός το μήνυμα να παραμένει γνωστό μόνο στον αποστολέα και τον
παραλήπτη και αφετέρου ο παραλήπτης να γνωρίζει με ασφάλεια ποιος του έστειλε το
μήνυμα. Για να επιτευχθεί αυτό ο αποστολέας μπορεί να κρυπτογραφήσει το μήνυμα
πρώτα με το δικό του ιδιωτικό κλειδί και στην συνέχεια με το δημόσιο κλειδί του
παραλήπτη. Όταν ο παραλήπτης λάβει το μήνυμα θα πρέπει να χρησιμοποιήσει το
ιδιωτικό του κλειδί για να το αποκρυπτογραφήσει (εμπιστευτικότητα) και στην
συνέχεια να αποκρυπτογραφήσει το αποτέλεσμα χρησιμοποιώντας το δημόσιο κλειδί
του αποστολέα (πιστοποίηση) [6,16].
• RSA
• Ανταλλαγή κλειδιού Diffie-Hellman
• DSA
• Paillier
• El Gamal
• Κρυπτογραφία ελλειπτικών καμπυλών (ECC)
C = Me mod n
M = C d mod n = (Me)d mod n = M e. d mod n
Τόσο ο αποστολέας όσο και ο παραλήπτης θα πρέπει να γνωρίζουν τις τιμές των n και e.
Αντιθέτως, την τιμή του d πρέπει να γνωρίζει μόνον ο παραλήπτης. Ουσιαστικά ο RSA
είναι ένας αλγόριθμος για ασύμμετρο κρυπτοσύστημα με δημόσιο κλειδί KU={e,n} και
ιδιωτικό κλειδί KR={d,n}. Για να είναι ικανοποιητικός ο αλγόριθμος αυτός θα πρέπει να
ικανοποιούνται οι ακόλουθες απαιτήσεις:
44
Οι δύο πρώτες απαιτήσεις ικανοποιούνται εύκολα. Η τρίτη απαίτηση μπορεί να
ικανοποιηθεί μόνο για μεγάλες τιμές των e και n.
Αρχικά επιλέγονται δύο πρώτοι αριθμοί p, q και υπολογίζεται το γινόμενό τους n, το
οποίο είναι βασικός παράγοντας στη διαδικασία κρυπτογράφησης και
αποκρυπτογράφησης. Ακολούθως χρησιμοποιείται η τιμή της συνάρτησης φ(n),
γνωστή ως συνάρτηση του Euler για το n (φ(n) =(p-1)(q-1)), η οποία δείχνει το πλήθος
των θετικών ακεραίων που είναι μικρότεροι από n και πρώτοι με αυτόν. Επιλέγεται
ένας ακέραιος αριθμός e, ο οποίος είναι πρώτος αριθμός ως προς το φ(n), δηλαδή ο
μέγιστος κοινός διαιρέτης του e και του φ(n) να είναι το 1. Τελικά υπολογίζεται ο d, ως
ο φυσικός αντίστροφος αριθμός του e modulo φ(n), από τη σχέση d=e-1 mod φ(n).
Μπορεί να αποδειχθεί ότι το d και το e πληρούν τις απαιτούμενες ιδιότητες.
Υποθέτουμε ότι ο χρήστης Α έχει δημοσιεύσει το δημόσιο κλειδί του και ο χρήστης Β
επιθυμεί να αποστείλει ένα μήνυμα Μ στον Α. Τότε ο Β υπολογίζει την παράσταση
C=Memod n και μεταδίδει το C. Για την αποκρυπτογράφηση του μηνύματος, ο χρήστης
Α υπολογίζει την παράσταση M=Cd mod n.
Οι περισσότερες, όμως, συζητήσεις για την κρυπτανάλυση του RSA έχουν επικεντρωθεί
στη διαδικασία ανεύρεσης δύο πρώτων αριθμών που να είναι παράγοντες του n. Για
ένα μεγάλο αριθμό n, η διαδικασία αυτή αποτελεί δύσκολο πρόβλημα αλλά όχι σε τόσο
μεγάλο βαθμό όσο ήταν τα προηγούμενα χρόνια. Για παράδειγμα, τον Ιανουάριο του
1977 οι σχεδιαστές του RSA ζήτησαν από τους αναγνώστες του επιστημονικού
περιοδικού Scientific American να αποκρυπτογραφήσουν ένα κρυπτογραφημένο
μήνυμα που είχαν δημοσιεύσει σε στήλη του περιοδικού. Μάλιστα, προσέφεραν αμοιβή
100 δολαρίων για μία μόνο πρόταση του αποκρυπτογραφημένου κειμένου, γεγονός που
εκτιμούσαν πως δεν είναι δυνατό να συμβεί στα επόμενα 40 τετράκις εκατομμύρια
χρόνια. Όμως τον Απρίλιο του 1994, μία ερευνητική ομάδα που εργαζόταν
αξιοποιώντας την υπολογιστική ισχύ 1600 υπολογιστών στο Internet κέρδισε το
βραβείο μετά από 8 μήνες προσπάθειας. Στην περίπτωση αυτή, χρησιμοποιήθηκε
δημόσιο κλειδί μεγέθους 129 δεκαδικών ψηφίων (μήκος του n), δηλαδή περίπου 428
bits. Επιπλέον, το 1996 αναλύθηκε σε γινόμενο πρώτων παραγόντων ένας αριθμός 130
ψηφίων με 10 φορές λιγότερες πράξεις από όσες είχαν απαιτηθεί κατά την ανάλυση του
αριθμού με 129 ψηφία. Τα αποτελέσματα αυτά, βεβαίως, με κανένα τρόπο δε μειώνουν
τις δυνατότητες του RSA. Απλώς σημαίνουν ότι πρέπει να χρησιμοποιούνται
μεγαλύτερα μεγέθη κλειδιών. Ένα κλειδί μεγέθους 2048 bits θεωρείται ισχυρό για όλες
τις σημερινές τυπικές εφαρμογές[5,8,9,15,17,18].
45
Σκοπός του αλγορίθμου είναι να καταστήσει εφικτή και ασφαλή μεταξύ δύο χρηστών
την ανταλλαγή ενός μυστικού κλειδιού, το οποίο ακολούθως θα χρησιμοποιηθεί για
κρυπτογράφηση μηνυμάτων. Ο αλγόριθμος περιορίζεται ακριβώς στην ανταλλαγή των
κλειδιών.
Για οποιοδήποτε ακέραιο b και για μία πρωτογενή ρίζα a ενός πρώτου αριθμού p,
μπορεί να βρεθεί ένας μοναδικός πρώτος αριθμός i, τέτοιος, ώστε
b=a i mod p όπου 0≤ i ≤ (p-1)
Έστω ότι οι Α και Β επιθυμούν να ανταλλάξουν ένα κλειδί. Ο Α επιλέγει ένα τυχαίο
ακέραιο XA με XA<q και υπολογίζει το YA =aXA mod q. Ομοίως, ο Β επιλέγει ανεξάρτητα
από τον Α έναν τυχαίο ακέραιο XB με XB <q και υπολογίζει το YB = aXB mod q. Κάθε
πλευρά κρατά μυστική την αντίστοιχη τιμή του Χ, δηλαδή τα XA, XB και θέτει την
αντίστοιχη ποσότητα Υ δημοσίως διαθέσιμη στην άλλη πλευρά. Ο Α υπολογίζει το κλειδί
σύμφωνα με τη σχέση K=(YB)XA mod q, όπως επίσης και ο Β σύμφωνα με τη σχέση
K=(YA)XB mod q.
Η ασφάλεια της ανταλλαγής κλειδιού κατά Diffie-Hellman έγκειται στο γεγονός ότι ενώ
είναι υπολογιστικά εύκολο να υπολογιστεί η ποσότητα δύναμη mod πρώτου αριθμού,
είναι πολύ δύσκολο να υπολογιστούν οι διακριτοί λογάριθμοι. Και για μεγάλους
πρώτους αριθμούς το πρόβλημα θεωρείται ανέφικτο να επιλυθεί [5,8,9,15,17,18].
46
περιβάλλον ιστοσελίδων εφαρμογών ηλεκτρονικού εμπορίου, όπου πραγματοποιούνται
πολλές ασφαλείς δοσοληψίες. Τα τελευταία χρόνια έχει αρχίσει να αναπτύσσεται ένα
ανταγωνιστικό σύστημα του RSA. Πρόκειται για την Κρυπτογραφία Ελλειπτικής
Καμπύλης (Elliptic Curve Cryptography - ECC). Ήδη, το ECC κινείται στα πλαίσια
προτυποποίησής του, αφού το έχει συμπεριλάβει το πρότυπο για ασύμμετρα
κρυπτοσυστήματα IEEE P1363.
Ο κύριος λόγος που καθιστά ελκυστικό το ECC συγκρινόμενο με τον αλγόριθμο RSA,
είναι ότι προσφέρει το ίδιο επίπεδο ασφάλειας για μικρότερο πλήθος bits, μειώνοντας
κατ’ αυτόν τον τρόπο τον απαιτούμενο υπολογιστικό χρόνο και φόρτο εργασίας.
Σύμφωνα με σχετικά πρόσφατες επιστημονικές ανακοινώσεις, έγινε κατορθωτό να
κρυπταναλυθεί το ECC με μέγεθος κλειδιού 109 bits αξιοποιώντας αδιάκοπα την
επεξεργαστική ισχύ 10.000 υπολογιστών επί 549 ημέρες. Στην παρούσα φάση ο
αλγόριθμος θεωρείται ασφαλής αν το μέγεθος του κλειδιού διατηρεί μήκος τουλάχιστον
163 bits. Από την άλλη πλευρά, αν και η θεωρία του ECC ήταν γνωστή για αρκετό καιρό,
μόλις πρόσφατα έχουν ξεκινήσει να εμφανίζονται προϊόντα που χρησιμοποιούν ECC. Το
γεγονός αυτό δικαιολογεί το χαμηλό επίπεδο εμπιστοσύνης προς το ECC, σχετικά με το
RSA.
47
Αλγόριθμος Κρυπτογράφηση/ Ψηφιακή Ανταλλαγή
Αποκρυπτογράφηση Υπογραφή κλειδιών
RSA x x x
Diffie-Hellman - - x
ECC x x x
Κάποιοι αλγόριθμοι είναι κατάλληλοι και για τις τρεις εφαρμογές, άλλοι μόνο για δύο ή
μία από αυτές. Στον Πίνακα 2. 2 αναφέρονται οι εφαρμογές που υποστηρίζονται από
τους αλγορίθμους που επεξηγήσαμε.
Η ψηφιακή υπογραφή είναι ένας εύκολος, αποδοτικός και ασφαλής τρόπος υπογραφής
ηλεκτρονικών εγγράφων. Είναι το ηλεκτρονικό ισοδύναμο της γραπτής υπογραφής. Επί
της ουσίας είναι ψηφιακά δεδομένα τα οποία βρίσκονται συνημμένα σε άλλα
ηλεκτρονικά δεδομένα ή συσχετίζονται λογικά με αυτά και αποδεικνύουν την
γνησιότητά τους.
Στη διαδικασία της δημιουργίας και επαλήθευσης της υπογραφής εμπλέκεται και η
έννοια της συνάρτησης κατακερματισμού (hash function). Με την εφαρμογή της
συνάρτησης κατακερματισμού, από ένα μήνυμα ανεξαρτήτου του μεγέθους του,
παράγεται η “σύνοψή του”, η οποία είναι μία σειρά από bits συγκεκριμένου μεγέθους
(π.χ. 128 ή 160 bits). Η σύνοψη του μηνύματος (fingerprint ή message digest) είναι μία
ψηφιακή αναπαράσταση του μηνύματος, είναι μοναδική για το μήνυμα και το
αντιπροσωπεύει.
Η συνάρτηση κατακερματισμού είναι μονόδρομη διότι από την σύνοψη που δημιουργεί,
είναι υπολογιστικά αδύνατον κάποιος να εξάγει το αρχικό μήνυμα. Η πιθανότητα δύο
μηνύματα να έχουν την ίδια σύνοψη είναι εξαιρετικά μικρή. Αυτό σημαίνει ότι αν το
μήνυμα του αποστολέα έχει κάποια συγκεκριμένη σύνοψη και το μήνυμα που λάβει ο
παραλήπτης (χρησιμοποιώντας την ίδια συνάρτηση κατακερματισμού) παράγει
διαφορετική σύνοψη, τότε το μήνυμα κατά την μετάδοσή του έχει αλλοιωθεί.
Οποιαδήποτε αλλαγή σε ένα μήνυμα συνεπάγεται και τη δημιουργία διαφορετικής
σύνοψης.
48
Θεωρώντας ότι ο αποστολέας έχει ένα συγκεκριμένο ζευγάρι κλειδιών και το ιδιωτικό
του κλειδί είναι στην πλήρη κατοχή του, τότε το γεγονός ότι ο αποστολέας χρησιμοποιεί
το ιδιωτικό του κλειδί για να κρυπτογραφήσει το μήνυμα, πιστοποιεί στον παραλήπτη
που το αποκρυπτογραφεί με το αντίστοιχο δημόσιο κλειδί (του αποστολέα) την
ταυτότητα του αποστολέα (αυθεντικότητα). Η ψηφιακή υπογραφή είναι ένας τρόπος
πιστοποίησης της ταυτότητας του αποστολέα ενός μηνύματος [7,8,13,15,16,22].
49
Εικόνα 2. 16 Διαδικασία επαλήθευσης ψηφιακής υπογραφής.
50
ακεραιότητας και της αυθεντικοποίησης του αποστολέα κατά την αποστολή του
μηνύματος που περιέχει το δημόσιο κλειδί. Οποιοσδήποτε μπορεί να πραγματοποιήσει
μία τέτοια μετάδοση. Με τον τρόπο αυτό, κάποιος Χ μπορεί να προσποιηθεί ότι είναι ο Α
και να στείλει ένα δημόσιο κλειδί σε τρίτον ή να το μεταδώσει προς περισσότερες
οντότητες. Μέχρι τη στιγμή που ο Α θα αντιληφθεί ότι βρίσκεται σε εξέλιξη μία απάτη, ο
Χ θα έχει διαβάσει όλα τα κρυπτογραφημένα μηνύματα που προορίζονταν για τον Α,
ενώ έχει τη δυνατότητα να υπογράφει και να αυθεντικοποιείται ως Α.
51
2.3.6 Σύγκριση Συμμετρικών - Ασύμμετρων Κρυπτοσυστημάτων
52
διαφορετικά μήκη κλειδιών για να πετύχουν το ίδιο επίπεδο ανθεκτικότητας. Για
παράδειγμα, ένας αλγόριθμος συμμετρικής κρυπτογράφησης με κλειδί μεγέθους 128
bits παρέχει ανθεκτικότερη κρυπτογράφηση από τον αλγόριθμο RSA με το ίδιο μέγεθος
κλειδιού. Για το λόγο αυτό πρέπει να χρησιμοποιούμε κλειδί μεγέθους τουλάχιστον 512
bits προκειμένου η κρυπτογράφηση RSA να είναι ανθεκτική, ενώ οι συμμετρικοί
αλγόριθμοι πετυχαίνουν το ίδιο επίπεδο ανθεκτικότητας με κλειδί 56 bits. Όμως ακόμη
και αυτά τα επίπεδα ανθεκτικότητας αρχίζουν να αποδεικνύονται ευπαθή σε επιθέσεις
[23,24].
• Ασφάλεια
• Γρήγορη λειτουργία
• Εύκολη υλοποίηση σε λογισμικό
• Αποδοτική υλοποίηση σε υλικό
Όμως μειονεκτούν:
• Υψηλή ασφάλεια
• Ψηφιακές υπογραφές
53
54
3.Το πρότυπο AES
Τον Ιανουάριο του 1997, το “Εθνικό Ινστιτούτο Προτύπων & Τεχνολογίας” των ΗΠΑ
(National Institute of Standards and Technology, NIST) προκήρυξε διεθνή διαγωνισμό
για την υιοθέτηση του νέου κρυπτογραφικού προτύπου εμπορικής (μη κυβερνητικής)
χρήσεως, του AES. Το αξιοσημείωτο είναι ότι για πρώτη φορά στα χρονικά της
σύγχρονης κρυπτογραφίας οι διαδικασίες αξιολόγησης και επιλογής των υποψηφίων
προτάσεων θα ήταν ανοικτές.
55
Αλγόριθμος Δημιουργός Χώρα
CAST-256 Entrust Καναδάς
Crypton Future Systems Ν. Κορέα
DEAL Outerbridge, Knudsen * ΗΠΑ, Δανία
DFC ENS-CNRS * Γαλλία
E2 NTT Ιαπωνία
Frog TecApro Κροατία
HPC Schroeppel * ΗΠΑ
LOKI97 Brown et al. * Αυστραλία
Magenta Deutsche Telekom Γερμανία
MARS IBM ΗΠΑ
RC6 RSA Laboratories ΗΠΑ
Rijndael Daemen, Rijmen * Βέλγιο
SAFER+ Cylink ΗΠΑ
Serpent Anderson, Biham, Knudsen * Αγγλία, Ισραήλ, Δανία
Twofish Counterpane ΗΠΑ
* Οι συγκεκριμένοι συμμετάσχοντες στον διαγωνισμό δεν ήταν εταιρείες, αλλά
ανεξάρτητοι ερευνητές.
Πίνακας 3. 1 Υποψήφιοι για το πρότυπο AES.
56
να υλοποιηθεί με ασφαλή και αποτελεσματικό τρόπο σε διάφορα περιβάλλοντα, καθώς
και να μπορεί να υλοποιηθεί ως κωδικοποιητής ροής (stream cipher), ως αλγόριθμος
κατακερματισμού (hashing algorithm) και να προσφέρει και επιπρόσθετες
κρυπτογραφικές λειτουργίες. Ακόμα, να είναι εφικτή η υλοποίηση του αλγορίθμου και
σε υλικό και σε λογισμικό, καθώς και σε firmware. Και η απλότητα του αλγορίθμου
αποτέλεσε έναν παράγοντα αξιολόγησης [26].
Το επίπεδο της πρόσθεσης (XOR) του υποκλειδιού εφαρμόζεται ήδη πριν από τον
πρώτο κύκλο μετασχηματισμού, επειδή, σε άλλη περίπτωση, όλες οι άλλες πράξεις
μετασχηματισμού, που προηγούνται της πρώτης εκτέλεσης αυτού του επιπέδου ή που
ακολουθούν την τελευταία του εκτέλεση, δεν συμβάλουν στην ασφάλεια του
κρυπτογραφικού συστήματος αφού μπορούν να αφαιρεθούν από τον κρυπταναλυτή
χωρίς γνώση του κλειδιού (όπως η αρχική και τελική μετάθεση στον DES). Σε πολλούς
κρυπτογραφικούς αλγορίθμους προβλέπονται αντίστοιχες αρχικές ή τελικές πράξεις
μετασχηματισμού βασισμένες στο κλειδί, όπως στον IDEA ή τον Blowfish. Το επίπεδο
γραμμικής ανάμιξης στον τελευταίο κύκλο είναι διαφορετικό σε σύγκριση με τους
άλλους κύκλους. Αυτή η διαφορά σχεδιάστηκε έτσι ώστε να προκύπτουν περισσότερες
ομοιότητες στη δομή της κρυπτογράφησης και της αποκρυπτογράφησης. Μια ανάλογη
διαφορά για παρόμοιο σκοπό είναι η έλλειψη της ανταλλαγής των υποτμημάτων στον
τελευταίο κύκλο του DES [26].
57
3.4 Μαθηματικό υπόβαθρο του AES
b7 x7+ b6 x6 + b5 x5 + b4 x4 + b3 x3 + b2 x2 + b1 x +b0
Παράδειγμα
Σε πολυωνυμική μορφή:
(x6 + x4 + x2 + x + 1)+(x7 + x4 + x3 + 1)= x7 + x6 + x3 + x2 + x
Σε δυαδική μορφή:
“01010111” + “10011001” = “11001110”
Σε δεκαεξαδική μορφή:
“57” +”99” = “CE”
58
Παράδειγμα
Επίσης, ισχύει a(x) × (b(x) + c(x))= a(x) × b(x) + a(x) × c(x). Από τα προηγούμενα
συνάγεται ότι το σύνολο των 256 δυνατών τιμών των bytes, με την πράξη XOR ως
πρόσθεση και την πράξη του πολλαπλασιασμού, όπως ορίστηκε παραπάνω, έχει τη
δομή του πεπερασμένου πεδίου GF(28).
Αν b7 = 0, τότε το αποτέλεσμα του γινομένου έχει βαθμό μικρότερο του 8 και η πράξη
mod m(x) δεν το επηρεάζει. Δηλαδή, σε δυαδική παράσταση το αποτέλεσμα λαμβάνεται
με την ολίσθηση κατά μια θέση προς τα αριστερά της δυαδικής παράστασης του b(x).
Αν b7 = 1, τότε ο βαθμός του γινομένου είναι 8, ίσος με αυτόν του m(x) και επομένως το
m(x) πρέπει να αφαιρεθεί από το γινόμενο x × b(x).
Παράδειγμα
59
3.4.5 Πολλαπλασιασμός με συντελεστές στο GF(28)
Έτσι, δεν μπορεί το πολυώνυμο c(x) να αναπαρασταθεί από ένα διάνυσμα τεσσάρων
bytes. Μπορεί όμως να περιοριστεί μέσω της πράξης modulo ένα πολυώνυμο τετάρτου
βαθμού που θα οδηγήσει το c(x) σε βαθμό μικρότερο του 4. Στον AES επελέγη το
πολυώνυμο M(x) = x4 + 1, το οποίο είναι μη αναγόμενο και επομένως ο
πολλαπλασιασμός με ένα σταθερό πολυώνυμο τεσσάρων όρων δεν είναι πάντοτε
αντιστρέψιμος. (Στον AES καθορίστηκε ένα τέτοιο σταθερό πολυώνυμο a(x) = “03”x3 +
“01”x2 + “01”x + “02” το οποίο έχει όμως αντίστροφο πολυώνυμο a-1 (x) = “0B”x3 + “0D”x2
+ “09”x + “0E”.) Επειδή x j mod(x4 +1) = x j mod4 , το γινόμενο των πολυωνύμων a(x) και
c(x) δίνεται από :
𝒅𝟎 𝒂𝟎 𝒂𝟑 𝒂𝟐 𝒂𝟏 𝒃𝟎
𝒅𝟏 𝒂𝟏 𝒂𝟎 𝒂𝟑 𝒂𝟐 𝒃𝟏
� �=�𝒂 𝒂𝟏 𝒂𝟎 𝒂𝟑 � . �𝒃𝟐 �
𝒅𝟐 𝟐
𝒅𝟑 𝒂𝟑 𝒂𝟐 𝒂𝟏 𝒂𝟎 𝒃𝟑
60
3.5 Κρυπτογράφηση
Με πίνακα τεσσάρων γραμμών παριστάνεται και το (υπο)κλειδί κάθε κύκλου. Όσο για
το πλήθος των στηλών, αυτό εξαρτάται από το μήκος του κλειδιού. Αν το μήκος είναι
128 bits, τότε ο αριθμός των στηλών του πίνακα είναι 4, ενώ αν το μήκος του κλειδιού
είναι 192 ή 256 bits, ο αριθμός των στηλών του πίνακα είναι 6 ή 8 αντίστοιχα.
Τον αριθμό των στηλών του πίνακα κατάστασης τον συμβολίζουμε με Nb και του
κλειδιού με Nk. Στην Εικόνα 3. 1 φαίνεται ένα παράδειγμα πίνακα κατάστασης για Nb=4
και πίνακα κλειδιού για Nk = 6.
Το πλήθος των κύκλων (Nr), που εκτελούνται κάθε φορά, εξαρτάται από το μήκος του
κλειδιού. Κυμαίνεται δε από 10 έως 14. Στον AES ισχύουν οι ακόλουθοι συνδυασμοί
μήκους κλειδιού, τμήματος και πλήθους κύκλων (Πίνακας 3. 2).
61
Μήκος κλειδιού Μήκος Τμήματος Πλήθος Κύκλων
(Nk) (Nb) (Nr)
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14
62
Ακολουθεί η περιγραφή της λειτουργίας της κρυπτογράφησης σε μορφή ψευδοκώδικα.
Στη συνέχεια θα δούμε τους τέσσερις βασικούς μετασχηματισμούς του AES: SubBytes(),
ShiftRows(), MixColumns(), και AddRoundKey().
Η συνάρτηση SubBytes είναι ένα κουτί αντικατάστασης και συμβολίζεται ως SRD. Η SRD
επιδρά σε μεμονωμένα bytes. Το αξιοσημείωτο είναι πως είναι ίδια για κάθε byte που
δέχεται στην είσοδό της, ενώ πολλοί κρυπταλγόριθμοι κάνουν χρήση διαφορετικών S-
boxes, αναλόγως της εισόδου τους.
Η SRD ορίζεται από την σύνθεση δύο συναρτήσεων g και f , που αμφότερες ενεργούν επί
του GF(28). Η συνάρτηση g είναι υπεύθυνη για την μη γραμμικότητα του SRD και
ορίζεται ως εξής:
g : b⇾ b’=b-1 ή b ⊗ g(b)=1
Επειδή, εξ ορισμού, η αλγεβρική έκφραση της g είναι αρκετά απλή, ώστε να διευκολύνει
κρυπταναλυτικές επιθέσεις που στοχεύουν στα S-Boxes του AES, το αποτέλεσμα της g
αποτελεί όρισμα για την συνάρτηση f , η οποία είναι ένας αντιστρεπτός γραμμικός
μετασχηματισμός στο GF(28). Για την επιλογή της f ελήφθησαν υπ’ όψη τα ακόλουθα
κριτήρια:
63
Σύμφωνα με τα παραπάνω, τα βήματα που πραγματοποιούνται για τον υπολογισμό του
SubBytes μετασχηματισμό είναι τα εξής:
𝑠′ 𝑠0
⎡ 0⎤ 10001111 1
⎡1 1 0 0 0 1 1 1⎤ ⎡𝑠1 ⎤ ⎡1⎤
⎢𝑠′1 ⎥
⎢𝑠′2 ⎥ ⎛ ⎢1 1 1 0 0 0 1 1⎥ ⎢𝑠 ⎥ ⎞ ⎢0⎥
2
⎢𝑠′3 ⎥ ⎜⎢ ⎥ ⎢𝑠 ⎥ ⎟ ⎢ ⎥
⎢𝑠′ ⎥ = ⎜ ⎢1 1 1 1 0 0 0 1⎥ ⊗ ⎢ 3 ⎥ ⎟ ⊕ ⎢0⎥
4 ⎜ ⎢1 1 1 1 1 0 0 0⎥ ⎢𝑠4 ⎥ ⎟ ⎢0⎥
⎢ ⎥ ⎜ ⎢0 1 1 1 1 1 0 0⎥ ⎢𝑠5 ⎥ ⎟ ⎢1⎥
𝑠′
⎢ 5⎥ ⎢0 0 1 1 1 1 1 0⎥ ⎢𝑠6 ⎥ ⎢1⎥
⎢𝑠′6 ⎥
⎝ ⎣0 0 0 1 1 1 1 1⎦ ⎣𝑠7 ⎦ ⎠ ⎣0⎦
⎣𝑠′7 ⎦
Για παράδειγμα έστω ότι έχουμε το δεκαεξαδικό αριθμό {95}. Ο πολλαπλασιαστικός του
αντίστροφος στο GF(28) είναι “95”-1 = “8A”, δηλαδή “10001010” στο δυαδικό. Συνεπώς:
10001111 0 1 1 1 0
⎡1 1 0 0 0 1 1 1⎤ ⎡1⎤ ⎡1⎤ ⎡ 0⎤ ⎡1⎤ ⎡1⎤
⎛ ⎢1 1 1 0 0 0 1 1⎥ ⎢ ⎥ ⎞ ⎢0⎥ ⎢ 0⎥ ⎢0⎥ ⎢0⎥
0
⎜⎢ ⎥ ⎢ ⎥⎟ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥
⎜⎢ 1 1 1 1 0 0 0 1⎥ ⊗ ⎢1⎥ ⎟ ⊕ ⎢0⎥ = ⎢1⎥ ⊕ ⎢0⎥ = ⎢1⎥
⎜ ⎢1 1 1 1 1 0 0 0⎥ ⎢0⎥ ⎟ ⎢0⎥ ⎢ 0⎥ ⎢0⎥ ⎢0⎥
⎜ ⎢0 1 1 1 1 1 0 0⎥ ⎢0⎥ ⎟ ⎢1⎥ ⎢ 0⎥ ⎢1⎥ ⎢1⎥
⎢0 0 1 1 1 1 1 0⎥ ⎢0⎥ ⎢1⎥ ⎢ 1⎥ ⎢1⎥ ⎢0⎥
⎝ ⎣0 0 0 1 1 1 1 1⎦ ⎣1⎦ ⎠ ⎣0⎦ ⎣ 0⎦ ⎣0⎦ ⎣0⎦
δηλαδή, “2Α".
64
Εικόνα 3. 3 Εφαρμογή SubBytes() σε κάθε byte της κατάστασης.
y
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76
1 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0
2 B7 FD 93 26 36 3F FA CC 34 A5 E5 F1 71 D8 31 15
3 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75
4 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84
5 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF
6 D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8
x
7 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2
8 CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73
9 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB
A E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79
B E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08
C BA 78 25 2E 1C D6 B4 C6 E8 DD 74 1F 4B BD 8B 8A
D 70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E
E E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF
F 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16
Με τη βοήθεια του παραπάνω πίνακα μπορούμε πολύ εύκολα να βρούμε την έξοδο του
κουτιού αντικατάστασης για μια δεδομένη είσοδο. Έτσι, αν το byte της εισόδου είναι
“xy” , σε δεκαεξαδική μορφή, αυτό αντικαθίσταται από το byte που βρίσκεται στη σειρά
“x” και τη στήλη “y” του παραπάνω πίνακα. Για παράδειγμα, το byte “95”
αντικαθίσταται από το byte που βρίσκεται στη γραμμή {9} και τη στήλη {5}, δηλαδή
από το byte “2Α".
65
Εικόνα 3. 5 Κατασκευή ενός SBox.
όπου r είναι ο αριθμός της γραμμής και c ο αριθμός της στήλης και η τιμή shift(r,Nb) να
εξαρτάται από τη γραμμή (υπενθυμίζουμε πως Nb= 4).
Γραμμή πίνακα 1 2 3 4
Θέσεις ολίσθησης 0 1 2 3
66
Εικόνα 3. 7 Πίνακας κατάστασης μετά από το μετασχηματισμό ShiftRows.
67
Εικόνα 3. 9 Πίνακας κατάστασης μετά από το μετασχηματισμό MixColumns.
Για την πρώτη εξίσωση έχουμε “02” × “87” = (00001110) ⊕ (00011011) = (00010101)
και “03” × “6E” = “6E” ⊕ (“02” × “6E”) = (01101110) ⊕ (11011100) = (10110010).
Δηλαδή:
Η συνάρτηση αυτή είναι η πράξη XOR που πραγματοποιείται σε κάθε γύρο μεταξύ των
bits της κατάστασης και του κλειδιού γύρου. Η AddRoundKey() δεν απαιτεί ορισμό
αντίστροφης διαδικασίας, καθώς η πράξη XOR είναι αντιστρεπτή αφ’ εαυτής.
68
3.6 Επέκταση κλειδιού
Το αρχικό κλειδί k επεκτείνεται σε ένα μήκος ικανό να καλύψει όλες τις εκτελέσεις του
μετασχηματισμού AddRoundKey() (παρακάτω φαίνεται ο ψευδοκώδικας για την
επέκταση του κλειδιού). Αν συμβολίσουμε με Expanded_Key το αποτέλεσμα της
επέκτασης του αρχικού κλειδιού, τότε οι πρώτες Nk λέξεις του (των 4 bytes) είναι το
αρχικό κλειδί k. Οι υπόλοιπες λέξεις του Expanded_Key υπολογίζονται από τις πρώτες
αυτές λέξεις σύμφωνα με μία συνάρτηση, η οποία εξαρτάται από την τιμή του Nk. Από
τα bytes ki, 0≤i≤4⋅Nk του αρχικού κλειδιού, προκύπτουν τα bytes wi 0≤i≤Nw του
επεκτεταμένου κλειδιού, όπου Nw = 4⋅(Nr + 1). Τα ki και wi διατάσσονται σε πίνακες
διαστάσεων 4×Νκ και 4×Νw αντίστοιχα. Έτσι τα κλειδιά γύρου προκύπτουν από το
επεκτεταμένο κλειδί όπως φαίνεται στην Εικόνα 3. 11. Επειδή οι υπολογισμοί
βασίζονται στους δείκτες των bytes κλειδιού k και των λέξεων του Expanded_Key, θα
ορίσουμε δύο πίνακες-διανύσματα, τον key[i], με στοιχεία τα bytes του αρχικού κλειδιού
k και τον W[j] με στοιχεία τις λέξεις του Expanded_Key.
i = 0
i = Nk
69
Εικόνα 3. 11 Επέκταση κλειδιού.
Στην επέκταση κλειδιού συμμετέχουν, επίσης, για την απαλοιφή πιθανών συμμετριών
κάποιες σταθερές, οι οποίες ονομάζονται σταθερές γύρου (round constants ή RCon)
και ορίζονται ως εξής:
RCon(1)= x0 = 01(16)
RCon(2)= x1 = 02(16)
Για i>2:
RCon(i)= xi-1 =x ⊗ RCon(i-1)= 02(16) ⊗ RCon(i-1)
Λόγω του τρόπου χρήσης των σταθερών γύρου στην επέκταση κλειδιού, είναι αδύνατον
να χρειασθεί σταθερά RCon(i) με i >10 . Οι δυνατές τιμές των σταθερών γύρου,
επομένως, είναι οι:
i RCon(i) RCon(i)
[HEX] [DEC]
1 01 1
2 02 2
3 04 4
4 08 8
5 10 16
6 20 32
7 40 64
8 80 128
9 1B 27
10 36 54
70
Παρατηρούμε στην παραπάνω περιγραφή της KeyExpansion ότι μετά τις πρώτες Nk
λέξεις του Expanded_Key, οι οποίες είναι ακριβώς το δεδομένο κλειδί k, κάθε λέξη W[i]
του Expanded_Key που ακολουθεί είναι ίση με το αποτέλεσμα της συσχέτισης μέσω της
αποκλειστικής διάζευξης (XOR) της προηγούμενης λέξης W[i-1] με την λέξη W[i-Nk]. Για
λέξεις των οποίων οι θέσεις είναι πολλαπλάσια του Nk, στη λέξη W[i-1] εφαρμόζεται
ένας σύνθετος μετασχηματισμός πριν την πράξη της αποκλειστικής διάζευξης
ακολουθούμενος από την εκτέλεση της πράξης αποκλειστικής διάζευξης με τη σταθερά
κύκλου RCon[i]. Ο σύνθετος αυτός μετασχηματισμός αποτελείται από μια κυκλική
ολίσθηση των bytes μιας λέξης (RotWord()), ακολουθούμενος από την αντικατάσταση
όλων των bytes της λέξης (SubWord()).
3.7 Αποκρυπτογράφηση
state = in
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, w[0, Nb-1])
out = state
end
71
Εικόνα 3. 12 Η λειτουργία ευθείας αποκρυπτογράφησης του AES.
𝑠′ 𝑠0
⎡ 0⎤ 00100101 1
⎡1 0 0 1 0 0 1 0⎤ ⎡𝑠1 ⎤ ⎡0⎤
⎢𝑠′1 ⎥
⎢𝑠′2 ⎥ ⎛ ⎢0 1 0 0 1 0 0 1⎥ ⎢𝑠 ⎥ ⎞ ⎢1⎥
2
⎢𝑠′ ⎥ ⎜⎢ ⎥ ⎢𝑠 ⎥ ⎟ ⎢ ⎥
1 0 1 0 0 1 0 0⎥ ⊗ ⎢ 3 ⎥ ⎟ ⊕ ⎢0⎥
f-1(s) => ⎢ 3 ⎥ = ⎜⎢
𝑠′4 ⎜ ⎢0 1 0 1 0 0 1 0⎥ ⎢𝑠4 ⎥ ⎟ ⎢0⎥
⎢ ⎥ ⎜ ⎢0 0 1 0 1 0 0 1⎥ ⎢𝑠5 ⎥ ⎟ ⎢0⎥
⎢𝑠′5 ⎥ ⎢1 0 0 1 0 1 0 0⎥ ⎢𝑠6 ⎥ ⎢0⎥
⎢𝑠′6 ⎥
⎝ ⎣0 1 0 0 1 0 1 0⎦ ⎣𝑠7 ⎦ ⎠ ⎣0⎦
⎣𝑠′7 ⎦
72
y
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 52 09 6A D5 30 36 A5 38 BF 40 A3 9E 81 F3 D7 FB
1 7C E3 39 82 9B 2F FF 87 34 8E 43 44 C4 DE E9 CB
2 54 7B 94 32 A6 C2 23 3D EE 4C 95 0B 42 FA C3 4E
3 08 2E A1 66 28 D9 24 B2 76 5D A2 49 6D 8B D1 25
4 72 F8 F6 64 86 68 98 16 D4 A4 5C CC 5D 65 B6 92
5 6C 70 48 50 FD ED B9 DA 5E 15 46 57 A7 8D 9D 84
6 90 D8 AB 00 8C BC D3 0A F7 E4 58 05 B8 B3 45 06
x
7 D0 2C 1E 8F CA 3F 0F 02 C1 AF BD 03 01 13 8A 6B
8 3A 91 11 41 4F 67 DC EA 97 F2 CF CE F0 B4 E6 73
9 96 AC 74 22 E7 AD 35 85 E2 F9 37 E8 1C 75 DF 6E
A 47 F1 1A 71 1D 29 C5 89 6F B7 62 0E AA 18 BE 1B
B FC 56 3E 4B C6 D2 79 20 9A DB C0 FE 78 CD 5A F4
C 1F DD A8 33 88 07 C7 31 B1 12 10 59 27 80 EC 5F
D 60 51 7F A9 19 B5 4A 0D 2D E5 7A 9F 93 C9 9C EF
E A0 E0 3B 4D AE 2A F5 B0 C8 EB BB 3C 83 53 99 61
F 17 2B 04 7E BA 77 D6 26 E1 69 14 63 55 21 0C 7D
73
3.7.3 Μετασχηματισμός InvMixColumns()
𝑠′ 0𝐸 0𝐵 0𝐷 09 𝑠0,𝑐
⎡ 0,𝑐 ⎤
⎢𝑠′1,𝑐 ⎥ 09 0𝐸 0𝐵 0𝐷 𝑠1,𝑐
⎢𝑠′ ⎥ = � � ⊗ �𝑠 � για 0≤c≤Nb
0𝐷 09 0𝐸 0𝐵 2,𝑐
⎢ 2,𝑐 ⎥ 𝑠3,𝑐
⎣𝑠′3,𝑐 ⎦ 0𝐵 0𝐷 09 0𝐸
Η κατασκευή των συναρτήσεων του AES είναι τέτοια, που επιτρέπει τον ορισμό
αλγορίθμου για ισοδύναμη αποκρυπτογράφηση (equivalent decryption). Αυτός ο
αλγόριθμος έχει την δομή του αλγορίθμου κρυπτογραφήσεως. Διαφοροποιείται,
ωστόσο στη χρήση των αντιστρόφων συναρτήσεων και στην αρίθμηση των γύρων, η
οποία γίνεται αντιστρόφως, όπως και στην ευθεία αποκρυπτογράφηση. Διαφορετική
είναι και η επέκταση κλειδιού. Το επεκτεταμένο κλειδί στην περίπτωση αυτή προκύπτει
από το κανονικό επεκτεταμένο κλειδί, αφού επενεργήσει στα κλειδιά των ενδιαμέσων
γύρων (εκτός, δηλαδή, των γύρων 0 και Nr ) η συνάρτηση InvMixColumns. Παρακάτω
παρουσιάζεται ο ψευδοκώδικας του ισοδύναμου αλγόριθμου κρυπτογραφήσεως και
έπειτα το μπλοκ διάγραμμα του (Εικόνα 3. 14). Αξίζει να σημειωθεί πως η
InvMixColumns() εφαρμόζεται όπως είδαμε σε έναν πίνακα δύο διαστάσεων ενώ τα
κλειδιά του κάθε γύρου χρησιμοποιούνται σαν ένας πίνακας από λέξεις. Για το λόγο
αυτό πρέπει να γίνουν κατάλληλες τροποποιήσεις στον τύπο των δεδομένων.
74
EqInvCipher(byte in[4*Nb], byte out[4*Nb], word dw[Nb*(Nr+1)])
begin
byte state[4,Nb]
state = in
InvSubBytes(state)
InvShiftRows(state)
AddRoundKey(state, dw[0, Nb-1])
out = state
end
75
3.8 Παρουσίαση διαδικασίας κρυπτογραφήσεως μέσω
παραδείγματος
Με το τέλος της περιγραφής των συναρτήσεων του AES και των διαδικασιών
κρυπτογράφησης και αποκρυπτογράφησης, κρίνεται σκόπιμο, για την εμπέδωση και
καλύτερη κατανόηση των προηγουμένων, να γίνει αναλυτική παρουσίαση των δύο
πρώτων γύρων της διαδικασίας κρυπτογράφησης (γύροι 0 και 1), βήμα προς βήμα,
μέσω παραδείγματος (όλες οι τιμές του παραδείγματος είναι στο δεκαεξαδικό σύστημα
αρίθμησης).
00 01 02 03 30 70 97 1𝑎
04 05 06 07 𝑏7 𝑐𝑒 45 06
𝑝= � � 𝑘 = �3𝑓 𝑑2 57 3𝑓 �
08 09 10 20
30 40 50 60 49 𝑓5 42 0𝑑
2. Επέκταση κλειδιού
w[0] = 30 70 97 1a
w[1] = b7 ce 45 06
w[2] = 3f d2 57 3f
w[3] = 49 f5 42 0d
Βάση του i mod Nk = 0 (για i=4 και Nk=4) το w[3] τίθεται σαν temp και εφαρμόζονται σε
αυτό οι υπόλοιπες συναρτήσεις. Έτσι έχουμε:
RotWord(temp) = f5 42 0d 49
SubWord(temp) = e6 2c d7 3b // μπορούμε να το ελέγξουμε και από το πίνακα SBox
temp ⊕ RCon = e7 2c d7 3b // το RCon στο πρώτο γύρο είναι 01
Στη συνέχεια εφαρμόζεται η πράξη w[i] = w[i-Nk] xor temp οπότε για i=4 έχουμε w[4] =
w[0] xor temp και το i αυξάνεται κατά ένα. Συνεπώς:
w[4] = d7 5c 40 21
76
Πλέον η συνθήκη του i mod Nk = 0 (για i=5 και Nk=4) δεν ισχύει οπότε το temp παίρνει
την τιμή w[4] και βάση της w[i] = w[i-Nk] xor temp για i=5 έχουμε w[5] = w[1] xor temp .
Δηλαδή:
w[5] = 60 92 05 27
Παρόμοια υπολογίζονται και τα w[6] και w[7] ώσπου για i=8 ισχύει πάλι η συνθήκη i
mod Nk = 0 και τίθεται σαν temp το w[7] με τις συναρτήσεις RotWord()και SubWord()
να εφαρμόζονται πάνω του και τη διαδικασία να συνεχίζεται μέχρι το w[43] καθώς ο
βρόγχος επαναλαμβάνεται για i < Nb x (Nr +1) με Nr=10 και Nb=4.
w[40] = 3c 20 79 5b
w[41] = 1a c7 4b 2c
w[42] = ab 50 8a 6e
w[43] = d5 24 99 2d
00 04 08 30 30 b7 3f 49 30 b3 37 79
01 05 09 40 70 ce d2 f5 71 cb db b5
s= � �⊕� �= � �
02 06 10 50 97 45 57 42 95 43 47 12
03 07 20 60 1a 06 3f 0d 19 01 1f 6d
77
5. Η νέα κατάσταση προκύπτει από εφαρμογή του μετασχηματισμού
ShiftRows() στην προηγούμενη κατάσταση.
04 6d 9a b6
1f b9 d5 a3
s= � �
a0 c9 2a 1a
3c d4 7c c0
02 03 01 01 04 6d 9a b6 b5 17 1d 53
01 02 03 01 1f b9 d5 a3 fd 90 29 05
s=� �⊗� �= � �
01 01 02 03 a0 c9 2a 1a 04 3a 9f 7a
03 01 01 02 3c d4 7c c0 cb 74 b2 e3
b5 17 1d 53 d7 60 5f 16 62 77 42 45
fd 90 29 05 5c 92 40 b5 a1 02 69 b0
s=� �⊕� �= � �
04 3a 9f 7a 40 05 52 10 44 3f cd 6a
cb 74 b2 e3 21 27 18 15 ea 53 aa f6
Τα βήματα 4 έως 7 απαρτίζουν την δομή όλων των ενδιαμέσων γύρων και στο
συγκεκριμένο παράδειγμα επαναλαμβάνονται άλλες 8 φορές. Ο 10ος και τελικός γύρος
του παραδείγματος περιλαμβάνει τα βήματα 4,5 και 7. Μετά το πέρας του τελικού
γύρου η κατάσταση μετατρέπεται από πίνακα 4x4 σε διάνυσμα 16 bytes και αποτελεί,
πλέον, το κρυπτοκείμενο.
Αρχή Γύρου Μετά από Μετά από Μετά από Κλειδί γύρου
SubBytes ShiftRows MixColumns
00 04 08 30 30 b7 3f 49
01 05 09 40 70 ce d2 f5
02 06 10 50 97 45 57 42
03 07 20 60 1a 06 3f 0d
30 b3 37 79 04 6d 9a b6 04 6d 9a b6 b5 17 1d 53 d7 60 5f 16
71 cb db b5 a3 1f b9 d5 1f b9 d5 a3 fd 90 29 05 5c 92 40 b5
95 43 47 12 2a 1a a0 c9 a0 c9 2a 1a 04 3a 9f 7a 40 05 52 10
19 01 1f 6d d4 7c c0 3c 3c d4 7c c0 cb 74 b2 e3 21 27 18 15
62 77 42 45 aa f5 2c 6e aa f5 2c 6e 29 64 9c 53 00 60 3f 29
a1 02 69 b0 32 77 f9 e7 77 f9 e7 32 da 9d 39 39 96 04 44 f1
44 3f cd 6a 1b 75 bd 02 87 bd 02 1b 75 7a 9a d1 59 19 1c 4e 5e
ea 53 aa f6 ed ac 42 42 87 ed ac ab ea 49 b6 66 41 59 4c
29 04 a3 7a a5 f2 0a da a5 f2 0a da 8e 9d ae 5a a5 c5 fa d3
4c 99 7d c8 29 ee ff e8 ee ff e8 29 39 fe b5 8e ce ca 8e 7f
63 86 9f 07 fb 44 db c5 db c5 fb 44 91 40 a9 3e 30 2c 62 3c
cd ab 10 fa bd 62 ca 2d 2d bd 62 ca 9b 56 c9 97 c3 82 db 97
78
Αρχή Γύρου Μετά από Μετά από Μετά από Κλειδί γύρου
SubBytes ShiftRows MixColumns
2b 58 54 89 f1 6a 20 a7 f1 6a 20 a7 ad f4 c2 74 7f ba 40 93
f7 34 3b f1 68 18 e2 a1 18 e2 a1 68 83 46 67 4e 25 ef 61 1e
a1 6c cb 02 32 50 1f 77 1f 77 32 50 72 d8 3d 2f b8 94 f6 ca
58 d4 12 00 6a 48 c9 63 63 6a 48 c9 c9 ff 63 43 a5 27 fc 6b
d2 4e 82 e7 b5 2f 13 94 b5 2f 13 94 34 66 c6 ad 1d a7 e7 74
a6 a9 06 50 24 d3 6f 53 d3 6f 53 24 1d d1 48 7c 51 be df c1
ca 4c cb e5 74 29 1f d9 1f d9 74 29 04 19 0b 94 c7 53 a5 6f
6c d8 9f 28 50 61 db 34 34 50 61 db 60 67 d0 07 79 5e a2 c9
29 c1 21 d9 a5 78 fd 35 a5 78 fd 35 dd a8 53 87 45 e2 05 71
4c 6f 97 bd 29 a8 88 7a a8 88 7a 29 52 b6 69 46 f9 47 98 59
c3 4a ae fb 2e d6 e4 0f e4 0f 2e d6 58 89 ed 6b 1a 49 ec 83
19 39 72 ce d4 12 40 8b 8b d4 12 40 b5 bc 6c 20 eb b5 17 de
98 4a 56 f6 46 d6 b1 42 46 d6 b1 42 b3 8c 0f b9 ce 2c 29 58
ab f1 f1 1f 62 a1 a1 c0 a1 a1 c0 62 20 61 5f 72 15 52 ca 93
42 c0 01 e8 2c ba 7c 9b 7c 9b 2c ba c9 b2 2a 2c 07 4e a2 21
5e 09 7b fe 58 01 21 bb bb 58 01 21 7a eb 26 5c 48 fd ea 34
7d a0 26 e1 ff e0 f7 f8 ff e0 f7 f8 3a 51 2a b1 92 be 97 cf
35 33 95 e1 96 c3 2a f8 c3 2a f8 96 70 f5 dd 4f e8 ba 70 e3
ce fc 88 0d 8b b0 c4 d7 c4 d7 8b b0 60 1a cb c8 1f 51 f3 d2
32 16 cc 68 23 47 4b 45 45 23 47 4b 97 80 ff a3 22 df 35 01
a8 ef bd 7e c2 df 7a f3 c2 df 7a f3 35 76 41 f0 98 26 b1 7e
98 4f ad ac 46 84 95 91 84 95 91 46 e2 c6 e1 c5 5d e7 97 74
7f 4b 38 1a d2 b3 07 a2 07 a2 d2 b3 06 71 1e 54 63 32 c1 13
b5 5f ca a2 d5 cf 74 3a 3a d5 cf 74 aa fc 48 13 a8 77 42 43
ad 50 f0 8e 95 53 8c 19 95 53 8c 19 3c 1a ab d5
bf 21 76 b1 08 fd 38 c8 fd 38 c8 08 20 c7 50 24
65 43 df 47 4d 1a 9e a0 9e a0 4d 1a 79 4b 8a 99
02 8b 0a 50 77 3d 67 53 53 77 3d 67 5d 2c 6e 2d
a9 49 27 cc
dd ff 98 2c
e7 eb c7 83
08 5b 53 4a
Αρχή Γύρου Μετά από Μετά από Μετά από Κλειδί γύρου
InvMixColumns InvShiftRows InvSubBytes
a9 49 27 cc 3c 1a ab d5
dd ff 98 2c 20 c7 50 24
e7 eb c7 83 79 4b 8a 99
08 5b 53 4a 5b 2c 6e 2d
95 53 8c 19 95 53 8c 19 ad 50 f0 8e 98 26 b1 7e
fd 38 c8 08 08 fd 38 c8 bf 21 76 b1 5d e7 97 74
9e a0 4d 1a 4d 1a 9e a0 65 43 df 47 63 32 c1 13
53 77 3d 67 77 3d 67 53 02 8b 0a 50 a8 77 42 43
79
Αρχή Γύρου Μετά από Μετά από Μετά από Κλειδί γύρου
InvMixColumns InvShiftRows InvSubBytes
35 76 41 f0 c2 df 7a f3 c2 df 7a f3 a8 ef bd 7e 92 be 97 cf
e2 c6 e1 c5 84 95 91 46 46 84 95 91 98 4f ad ac e8 ba 70 e3
06 71 1e 54 07 a2 d2 b3 d2 b3 07 a2 7f 4b 38 1a 1f 51 f3 d2
aa fc 48 13 3a d5 cf 74 d5 cf 74 3a b5 5f ca a2 22 df 35 01
3a 51 2a b1 ff e0 f7 f8 ff e0 f7 f8 7d a0 26 e1 ce 2c 29 58
70 f5 dd 4f c3 2a f8 96 96 c3 2a f8 35 33 95 e1 15 52 ca 93
60 1a cb c8 c4 d7 8b b0 8b b0 c4 d7 ce fc 88 0d 07 4e a2 21
97 80 ff a3 45 23 47 4b 23 47 4b 45 32 16 cc 68 48 fd ea 34
b3 8c 0f b9 46 d6 b1 42 46 d6 b1 42 98 4a 56 f6 45 e2 05 71
20 61 5f 72 a1 a1 c0 62 62 a1 a1 c0 ab f1 f1 1f f9 47 98 59
c9 b2 2a 2c 7c 9b 2c ba 2c ba 7c 9b 42 c0 01 e8 1a 49 ec 83
7a eb 26 5c bb 58 01 21 58 01 21 bb 5e 09 7b fe eb b5 17 de
dd a8 53 87 a5 78 fd 35 a5 78 fd 35 29 c1 21 d9 1d a7 e7 74
52 b6 69 46 a8 80 7a 29 29 a8 88 7a 4c 6f 97 bd 51 be df c1
58 89 ed 6b e4 0f 2e d6 2e d6 e4 0f c3 4a ae fb c7 53 a5 6f
b5 bc 6c 20 8b d4 12 40 d4 12 40 8b 19 39 72 ce 79 5e a2 c9
34 66 c6 ad b5 2f 13 94 b5 2f 13 94 d2 4e 82 e7 7f ba 40 93
1d d1 48 7c d3 6f 53 24 24 d3 6f 53 a6 a9 06 50 25 ef 61 1e
04 19 0b 94 1f d9 74 29 74 29 1f d9 ca 4c cb e5 b8 94 f6 ca
6067 d0 07 34 50 61 db 50 61 db 34 6c d8 9f 28 a5 27 fc 6b
ad f4 c2 74 f1 6a 20 a7 f1 6a 20 a7 2b 58 54 89 a5 c5 fa d3
83 46 67 4e 18 e2 a1 68 68 18 e2 a1 f7 34 3b f1 ce ca 8e 7f
72 d8 3d 2f 1f 77 32 50 32 50 1f 77 a1 6c cb 02 30 2c 62 3c
c9 ff 63 43 63 6a 48 c9 6a 48 c9 63 58 d4 12 00 c3 82 db 97
8e 9d ae 5a a5 f2 0a da a5 f2 0a da 29 04 a3 7a 00 60 3f 29
39 fe b5 8e ee ff e8 29 29 ee ff e8 4c 99 7d c8 96 04 44 f1
91 40 a9 3e db c5 fb 44 fb 44 db c5 63 86 9f 07 19 1c 4e 5e
9b 56 c9 97 2d bd 62 ca bd 62 ca 2d cd ab 10 fa 66 41 59 4c
29 64 9c 53 aa f5 2c 6e aa f5 2c 6e 62 77 42 45 d7 60 5f 16
da 9d 39 39 77 f9 e7 32 32 77 f9 e7 a1 02 69 b0 5c 92 40 b5
7a 9a d1 59 bd 02 1b 75 1b 75 bd 02 44 3f cd 6a 40 05 52 10
ab ea 49 b6 42 87 ed ac 87 ed ac 42 ea 53 aa f6 21 27 18 15
b5 17 1d 53 04 6d 9a b6 04 6d 9a b6 30 b3 37 79 30 b7 3f 49
fd 90 29 05 1f b9 d5 a3 a3 1f b9 d5 71 cb db b5 70 ce d2 f5
04 3a 9f 7a a0 c9 2a 1a 2a 1a a0 c9 95 43 47 12 97 45 57 42
cb 74 b2 e3 3c d4 7c c0 d4 7c c0 3c 19 01 1f 6d 1a 06 3f 0d
00 04 08 30
01 05 09 40
02 06 10 50
03 07 20 60
80
3.9 Ασφάλεια AES
Σαν κρυπτογραφικό πρότυπο ο AES, θα πρέπει να είναι ανθεκτικός σε όλες τις γνωστές
κρυπταναλυτικές επιθέσεις. Για το λόγο αυτό, σχεδιάστηκε να είναι ανθεκτικός σε
αυτές και ιδιαίτερα στη διαφορική και γραμμική κρυπτανάλυση. Οι αλγόριθμοι
τμήματος γενικά, για να διασφαλίσουν αυτό το επίπεδο ασφάλειας θα πρέπει να έχουν
διάχυση και μη-γραμμικότητα.
Η διάχυση καθορίζεται από την εξάπλωση των bits στο κρυπτογράφημα. Πλήρης
διάχυση σημαίνει ότι κάθε bit της κατάστασης εξαρτάται από όλα τα bits της
προηγούμενης κατάστασης. Στον AES, σε δυο διαδοχικούς γύρους παρέχεται πλήρη
διάχυση μέσω των μετασχηματισμών ShiftRows και MixColumns. Οι δύο αυτοί
μετασχηματισμοί σε συνδυασμό με την επέκταση κλειδιού παρέχουν την απαραίτητη
διάχυση στο κρυπτογράφημα ώστε να είναι ανθεκτικό στις γνωστές επιθέσεις.
Παρόλο που η επαναληψιμότητα έχει πολλά οφέλη, μπορεί να κάνει έναν αλγόριθμο πιο
ευάλωτο σε συγκεκριμένες επιθέσεις. Ο σχεδιασμός του AES εξασφαλίζει ότι η
επανάληψη δεν θα οδηγήσει σε κενά ασφαλείας. Για παράδειγμα, οι σταθερές γύρου
διαχωρίζουν τα μοτίβα μεταξύ των κλειδιών γύρου [25].
3.10 Εφαρμογές
Ο AES είναι κατάλληλος για διάφορες εφαρμογές, όπως για την ασφάλεια
δρομολογητών δικτύου, ασύρματες επικοινωνίες, αποθήκευση κρυπτογραφημένων
δεδομένων, Smart Cards, ασφαλή συστήματα βιντεοεπιτήρησης, ασφαλή ταυτοποίηση
μέσω ραδιοσυχνοτήτων (Radio Frequency Identification RFID), ΑΤΜ, οικονομικές
συναλλαγές ηλεκτρονικού εμπορίου και πληθώρα άλλων εφαρμογών.
81
Καθώς ο αλγόριθμος είναι ελεύθερος, μπορεί να χρησιμοποιηθεί για εμπορικούς και μη
σκοπούς καθώς και για ιδιωτική και δημόσια χρήση. Σε επίπεδο λογισμικού υπάρχουν
πολλές έτοιμες βιβλιοθήκες σε διάφορες γλώσσες προγραμματισμού. Ενδεικτικά
υπάρχουν βιβλιοθήκες σε C/ASM (AES Crypt, OpenSSL, GnuTLS, mcrypt Microsoft
CryptoAPI κ.α.), C++ (Botan, Crypto++), C#/.NET (.NET Framework 3.5 Bouncy Castle
Crypto Library), Java (Java Cryptography Extension, IAIK, Bouncy Castle Crypto Library),
Javascript (Implementation for JavaScript, Stanford Javascript Crypto Library), PHP
(phpseclib), Python (Python AES, NCrypt, alo-aes, pycrypt κ.α.) Flex/AS3 (as3crypto). Οι
παραπάνω βιβλιοθήκες χρησιμοποιούνται σε πολλές εφαρμογές όπως σε εργαλεία
αρχείων και συμπίεσης (7z, PKZIP, RAR, WinZip κ.α.), λειτουργικά συστήματα
(Encrypting File System στα Windows XP SP1), κρυπτογράφηση δίσκων (DiskCryptor,
BitLocker, Geli, Crypt4000 κ.α.), κρυπτογράφηση αρχείων (gKrypt, NCrypt AES Crypt
κ.α.), ασφάλεια επικοινωνίας σε τοπικά δίκτυα (IEEE 802. 11i, ITU-T G.hn) και διάφορα
άλλες (GPG, IPsec, IronKey, XFire, CyaSSL κ.α.). Επίσης έχει αναπτυχθεί ένα ρεπερτόριο
εντολών επονομαζόμενο ως AES Instruction Set σαν επέκταση εντολών μιας x86
αρχιτεκτονικής για μικροεπεξεργαστές που χρησιμοποιείται από την Intel και την AMD
[27].
Από όλα τα παραπάνω συμπεραίνουμε πως ο AES είναι ένας από τους πιο
καταξιωμένους αλγόριθμους κρυπτογράφησης. Ο σχεδιασμός, η ταχύτητα και η
αποδοτικότητα του, έχουν συνδέσει τον AES με ποικίλες εφαρμογές καταρτώντας τον
αναπόσπαστο κομμάτι της κρυπτογραφίας.
82
4.Υλοποιήσεις AES
Οι επεξεργαστές γενικού σκοπού παρέχουν μεγάλη ισχύ για την ικανοποίηση των
αναγκών των χρηστών, με αποτέλεσμα η πλειοψηφία των κρυπτογραφικών
εφαρμογών να υλοποιείται σε επίπεδο λογισμικού. Ωστόσο οι υλοποιήσεις υλικού είναι
ο μόνος τρόπος για την επίτευξη υψηλής ταχύτητας, πολύ μεγαλύτερης των
επεξεργαστών γενικού σκοπού.
Τα ASICs σχεδιάζονται με την περιγραφή της συμπεριφοράς στη φυσική διάταξη και το
σχέδιο απαιτεί πολύ χρόνο και ανθρώπινο δυναμικό. Η τελική διάταξη στέλνεται σε ένα
εργοστάσιο παραγωγής ανεβάζοντας το κόστος ακόμα πιο πολύ. Επιπλέον, κάθε
σφάλμα στο σχεδιασμό έχει μεγάλο αντίκτυπο στο σχεδιαστικό κύκλο και στο κόστος.
Για τους λόγους αυτούς οι σχεδιαστές χρειάζονταν οικονομικές συσκευές ταχείας
προτοτυποποίησης και η ιδέα αυτή οδήγησε στα FPGAs.
83
δυνατότητα επαναπρογραμμάτισης μπορεί να αποτελέσει ένα σημαντικό
χαρακτηριστικό του σχεδίου. Στην κρυπτογραφία, είναι συχνά χρήσιμη η εναλλαγή
μεταξύ κρυπτογραφικών αλγορίθμων και η παραμετροποίηση ενός FPGA μπορεί να
επιτύχει κάτι τέτοιο. Επιπλέον, η διόρθωση σφαλμάτων ή η αναβάθμιση ενός
υπάρχοντος προϊόντος είναι τόσο εύκολη όσο και η αναβάθμιση μιας υλοποίησης
λογισμικού.
Το κόστος ενός σχεδίου που βασίζεται σε τεχνολογία των FPGA είναι πολύ μικρότερο
από αυτό σε τεχνολογία ASIC. Οι ίδιοι οι σχεδιαστές μπορούν να προγραμματίσουν ένα
FPGA και συνεπώς απαιτείται μικρότερο ανθρώπινο δυναμικό για την ανάπτυξη ενός
σχεδίου. Παρόλα αυτά η υλοποίηση σε FPGA είναι πιο ακριβή από την υλοποίηση σε
λογισμικό.
Οι υλοποιήσεις σε υλικό είναι πολύ πιο εύκολο να προστατευθούν. Είναι σχετικά εύκολα
να σχεδιαστούν κυκλώματα που θα διασφαλίζουν ότι καμία επίθεση δεν είναι δυνατή,
εκτός και αν υπάρχει φυσική πρόσβαση στη συσκευή. Ένας από τους τρόπους επίθεσης
σε μια υλοποίηση υλικού είναι η αντικατάσταση του κρυπτογραφικού τσιπ με κάποιο
άλλο που θα εκτελεί την ίδια διεργασία με το αρχικό τσιπ αλλά παράλληλα θα διαρρέει
πληροφορίες και στον επιτιθέμενο.
Τα σχέδια σε FPGAs δεν παρέχουν μεγάλη προστασία ενάντια σε φυσικές επιθέσεις. Δεν
είναι πολύ δύσκολο να αναγνωρισθούν οι μηχανισμοί ασφαλείας μέσω του bitstream
παραμετροποίησης και να τροποποιηθούν αναλόγως. Επιπλέον οι συσκευές FPGA είναι
εξοπλισμένες με μια λειτουργία που επιτρέπει την ανάγνωση των περιεχομένων των
καταχωρητών και της μνήμης η οποία βοηθάει στην απασφαλμάτωση. Έτσι τίθενται σε
κίνδυνο ευαίσθητες πληροφορίες όπως το κλειδί κρυπτογράφησης.
Η προστασία των σχεδίων ASIC είναι κατά κάποιο τρόπο πιο εύκολη. Το ASIC μπορεί να
σχεδιαστεί ώστε να είναι ανθεκτικό, δηλαδή το τσιπ δεν επιτρέπει διαρροή
πληροφορίας υπό καμία μορφή πίεσης. Κάποιες από τις πιθανές επιθέσεις μπορεί να
βασίζονται σε ανάλυση κατανάλωσης ισχύος ή λανθασμένη εισαγωγή. Επιπλέον, μπορεί
να έχει υλοποιημένο έναν πολύ ισχυρό μηχανισμό αυθεντικοποίησης καθιστώντας την
αντικατάσταση του τσιπ δύσκολη.
84
ASICs FPGAs Λογισμικό
Ταχύτητα Πολύ γρήγορο Γρήγορο Μέτρια Γρήγορο
Διαδικασία Ανάπτυξης
Κόστος Σχεδιασμού Πολύ ακριβό Μέτρια ακριβό Οικονομικό
Χρόνος Σχεδιασμού Μεγάλος Μέτρια μεγάλος Μικρός
Εργαλεία Πολύ ακριβά Οικονομικά Οικονομικά
Σχεδιασμού
Συντήρηση και Ακριβά Οικονομικά Οικονομικά
Αναβάθμιση
Κρυπτογραφικά Θέματα
Αντίσταση Ισχυρή Περιορισμένη Αδύναμη
Παραποίησης
Προστασία Κλειδιού Ισχυρή Περιορισμένη Αδύναμη
Ευελιξία Αλγορίθμου Όχι Ναι Ναι
1. Αρχείο Sboxes.cpp
Στο αρχείο αυτό υπάρχουν οι πίνακες αντικατάστασης για τους
μετασχηματισμούς SubBytes και InvSubBytes καθώς και ο πίνακας με τις
σταθερές γύρου RCon.
2. Αρχείο AES.cpp
Είναι το κύριο αρχείο του προγράμματος και περιέχει όλες τις απαραίτητες
συναρτήσεις για την εκτέλεση του AES και τη main() συνάρτηση του
προγράμματος.
Στο σημείο αυτό θα περιγράψουμε αναλυτικά τα δύο αρχεία, τις συναρτήσεις που
χρησιμοποιούνται και τη main() συνάρτηση του προγράμματος. Ο πλήρης κώδικας
βρίσκεται στο Παράρτημα Α [σελ.135].
Sboxes.cpp
85
AES.cpp
Η κύρια συνάρτηση που αποτελεί το κυρίως σώμα του αλγόριθμου είναι η συνάρτηση
Encryption, η οποία με τη σειρά της καλεί άλλες συναρτήσεις για την υλοποίηση των
ενδιάμεσων μετασχηματισμών. Πριν όμως δούμε την περιγραφή της συνάρτησης αυτής
θα δούμε πως πραγματοποιείται η επέκταση του κλειδιού και οι ενδιάμεσες
συναρτήσεις που το επιτυγχάνουν.
RotWord(): Συνάρτηση που δέχεται σαν είσοδο τέσσερα bytes, πραγματοποιεί κυκλική
ολίσθηση των δεδομένων και επιστρέφει τα μετατεθειμένα bytes.
SubWord(): Συνάρτηση που δέχεται σαν είσοδο τέσσερα bytes, κάθε byte γίνεται
είσοδος στον πίνακα αντικατάστασης Sbox (πίνακας που βρίσκεται στο αρχείο
Sboxes.cpp και πραγματοποιεί τον SubByte μετασχηματισμό) και αντικαθιστάται. Όταν
ολοκληρωθεί η διαδικασία και για τα τέσσερα byte επιστρέφονται τα
μετασχηματισμένα bytes.
KeyExpansion() : Συνάρτηση που δέχεται σαν είσοδο έναν πίνακα 4x8 bytes που
αποτελεί το αρχικό κλειδί. Ο λόγος που ο πίνακας είναι 4x8 είναι για να υποστηρίζεται η
επέκταση κλειδιού για 128 bits (16 bytes) 192 bits (24 bytes) και 256 bits (32 bytes).
Στη συνάρτηση αυτή υπάρχουν μεταβλητές (Nk, Nw) που καθορίζουν το πλήθος των
απαιτούμενων επαναλήψεων, ανάλογα με το μήκος του αρχικού κλειδιού για τη σωστή
υλοποίησή του. Έτσι μετά από κατάλληλο αριθμό επαναλήψεων προκύπτει ο πίνακας
extendedkey που περιέχει το επεκτεταμένο κλειδί. Παρακάτω παρουσιάζεται ο κώδικας
για την επέκταση του κλειδιού.
if (j%Nk == 0){
RotWord(temp);
SubWord(temp) ;
temp [0]= temp[0] ^ RCon[j/Nk];
for (int i=0; i<4; ++i)
extendedkey[i][j]=extendedkey[i][j-Nk]^temp[i];}
else if (Nk==8 && j%Nk==4){
SubWord(temp) ;
for (int i=0; i<4; ++i)
extendedkey[i][j]=extendedkey[i][j-Nk]^temp[i];}
else
for (int i=0; i<4; ++i)
extendedkey[i][j]=extendedkey[i][j-Nk]^extendedkey[i][j-1];}}
86
Για την υλοποίηση της Encryption είναι απαραίτητες οι εξής συναρτήσεις:
SetRoundKey(): Δέχεται σαν είσοδο έναν ακέραιο που αντιπροσωπεύει το γύρο που
εκτελείται και επιστέφει έναν δισδιάστατο πίνακα 4x4 roundkey που περιέχει το κλειδί
γύρου.
SubBytes(): Συνάρτηση που δέχεται σαν είσοδο έναν πίνακα 4x4 που αποτελεί τον
πίνακα κατάστασης, όπου κάθε byte γίνεται είσοδος στον πίνακα αντικατάστασης Sbox
και αντικαθιστάται. Έτσι όταν ολοκληρωθεί η διαδικασία επιστρέφεται ο
μετασχηματισμένος πίνακας κατάστασης.
ShifRows(): Συνάρτηση που δέχεται σαν είσοδο έναν πίνακα 4x4 που αποτελεί τον πίνακα
κατάστασης και πραγματοποιεί σε κάθε γραμμή την κατάλληλη ολίσθηση. Με το τέλος
των επαναλήψεων, επιστρέφεται η νέα μετατοπισμένη κατάσταση.
multiply(): Συνάρτηση που είναι απαραίτητη για τον μετασχηματισμό MixColumns και
πραγματοποιεί τον πολλαπλασιασμό δύο bytes στο πεδίο GF(28) και επιστρέφει το
γινόμενο τους.
MixColumns(): Συνάρτηση που δέχεται σαν είσοδο τον πίνακα κατάστασης, εκτελεί τους
πολλαπλασιασμούς με το πολυώνυμο c(x) = “03”x3 + “01”x2 + “01”x + “02”, modulo (x4 + 1)
όπως περιγράφεται και στην ενότητα 3.5.3 και επιστρέφει τη μετασχηματισμένη
κατάσταση.
AddRoundKey(): Συνάρτηση που δέχεται σαν είσοδο τον πίνακα κατάστασης και το κλειδί
γύρου υπό μορφή πίνακα 4x4 και πραγματοποιεί την πράξη αποκλειστικής διάζευξης
(XOR).
Encryption(): Αποτελεί τον κύριο πυρήνα του προγράμματος καθώς αυτή είναι που
κρυπτογραφεί τα δεδομένα. Η Encryption δέχεται σαν είσοδο τα αρχικά δεδομένα υπό
μορφή πίνακα 4x4 και το κλειδί του κάθε γύρου επίσης σε πίνακα 4x4. Εκτελεί αρχικά την
AddRoundKey και έπειτα επαναλαμβάνει μέσω μιας for loop τους απαραίτητους
μετασχηματισμούς δίνοντας κάθε φορά στην έξοδο το αποτέλεσμα κάθε συνάρτησης. Το
πλήθος των επαναλήψεων εξαρτάται από την τιμή Nr που παίρνει τιμές 10,12 και 14
ανάλογα με τον αλγόριθμο που έχουμε επιλέξει (AES-128 έχει Nr 10, AES-192 έχει Nr 12,
AES-256 έχει Nr 14, ). Μετά το πέρας των επαναλήψεων εκτελείται ο τελευταίος γύρος
του αλγορίθμου όπου όπως έχουμε προαναφέρει δεν περιέχει τον μετασχηματισμό
MixColumns. Ο κώδικας για τη συνάρτηση κρυπτογράφησης παρουσιάζεται παρακάτω.
InvSubBytes(): Συνάρτηση που δέχεται σαν είσοδο τον πίνακα κατάστασης, όπου κάθε
byte γίνεται είσοδος στον πίνακα αντικατάστασης InvSbox και αντικαθιστάται.
InvShifRows(): Συνάρτηση που δέχεται σαν είσοδο τον πίνακα κατάστασης και
πραγματοποιεί σε κάθε γραμμή την κατάλληλη ολίσθηση.
InvMixColumns(): Συνάρτηση που δέχεται σαν είσοδο τον πίνακα κατάστασης, εκτελεί
τους πολλαπλασιασμούς με το d(x)= “0B”x3 + “0D”x2 + “09”x + “0e”, modulo (x4 + 1) και
επιστρέφει τη μετασχηματισμένη κατάσταση.
87
void Encryption (unsigned char state[4][4],unsigned char rkey[4][4])
{
SetRoundKey(0);
cout<<"Round Key (0) : "; printmatrix(roundkey);
AddRoundKey(state,roundkey);
cout<<"Add Round (0) : "; printmatrix (state);
for (int i=1; i<Nr; i++){
SubBytes(state);
cout<<"SubBytes ("<<i<<") : "; printmatrix (state);
ShiftRows(state);
cout<<"ShiftRows ("<<i<<") : "; printmatrix (state);
MixColumns(state);
cout<<"MixColumn ("<<i<<") : "; printmatrix (state);
SetRoundKey(i);
cout<<"Round Key ("<<i<<") : "; printmatrix(roundkey);
AddRoundKey(state,roundkey);
cout<<"Add Round ("<<i<<") : "; printmatrix (state);
}
SubBytes(state);
cout<<"SubBytes ("<<Nr<<") : "; printmatrix (state);
ShiftRows(state);
cout<<"ShiftRows ("<<Nr<<") : "; printmatrix (state);
SetRoundKey(Nr);
cout<<"Round Key ("<<Nr<<") : "; printmatrix(roundkey);
AddRoundKey(state,roundkey);
cout<<"Add Round ("<<Nr<<") : "; printmatrix (state);
}
Επιπλέον για το χειρισμό των δεδομένων και την εμφάνιση των αποτελεσμάτων
χρησιμοποιήθηκαν οι παρακάτω συναρτήσεις.
88
void Decryption (unsigned char state[4][4],unsigned char rkey[4][4]){
SetRoundKey(Nr);
cout<<"Round Key ("<<Nr<<") : "; printmatrix(roundkey);
AddRoundKey(state,roundkey);
cout<<"Add Round ("<<Nr<<") : "; printmatrix (state);
InvShiftRows(state);
cout<<"InvSftRos ("<<Nr<<") : "; printmatrix (state);
InvSubBytes(state);
cout<<"InvSuBtes ("<<Nr<<") : "; printmatrix (state);
Αρχικά το πρόγραμμα μας ζητά να επιλέξουμε τον αλγόριθμο που θέλουμε να τρέξουμε
(Εικόνα 4. 1). Αν επιλέξουμε το 1 για AES-128 τότε θα δοθούν οι τιμές Nk=4, Nb=4 και
Nr=10 οι οποίες θα παραμετροποιήσουν τον αλγόριθμο. Αντίστοιχα στο 2 για AES-192 θα
δοθούν οι τιμές Nk=6, Nb=4 και Nr=12 και τέλος για AES-256 θα δοθούν οι τιμές Nk=8,
Nb=4 και Nr=14.
89
Εικόνα 4. 1 Υλοποίηση σε λογισμικό. Έναρξη προγράμματος(αριστερά). Είσοδος δεδομένων
στο πρόγραμμα και μετατροπή στο δεκαεξαδικό σύστημα (δεξιά).
90
4.3 Διαδικτυακή υλοποίηση
Στα πλαίσια της ερευνητικής εργασίας αναπτύχθηκε και μια διαδικτυακή υλοποίηση
του AES η οποία είναι επέκταση της υλοποίησης σε λογισμικό. Το εκτελέσιμο αρχείο
AES.exe τροποποιήθηκε κατάλληλα και προστέθηκαν σε αυτό και άλλοι αλγόριθμοι
κρυπτογράφησης (DES και TDES, από την εργασία “Συμμετρικοί Αλγόριθμοι
Κρυπτογράφησης Δεδομένων – Οι περιπτώσεις των αλγορίθμων DES και TDEA” της
Φλωκατούλας Δώρας) μετατράπηκε στο αρχείο crypto.cgi και αναρτήθηκε στον
ιστότοπο:
http://www.ellab.physics.upatras.gr/~bakalis/cgi-bin/Cryptography/cryptography.htm
Στην αρχική σελίδα παρουσιάζονται συνοπτικά οι βασικές πληροφορίες για τους τρεις
αλγορίθμους και δίνεται ο σύνδεσμος για τα πρότυπα υλοποίησης τους. Για την πιο
εύχρηστη εκτέλεση των αλγορίθμων έχουν προστεθεί οι παρακάτω επιλογές:
• Έλεγχος εισόδου : Τα δεδομένα εισάγονται στα πεδία Key και Message. Για τη
σωστή εισαγωγή των δεδομένων εκτελείται ένα αρχείο JavaScript το οποίο ελέγχει
κάθε φορά το μήκος των δεδομένων και του κλειδιού έτσι ώστε να μην
ξεπερνιέται ο επιτρεπτός αριθμός δεδομένων που χρειάζεται ο εκάστων
αλγόριθμος.
91
Εικόνα 4. 3 Διαδικτυακή υλοποίηση.
Στο σημείο αυτό θα παραθέσουμε ένα παράδειγμα για την καλύτερη κατανόηση της
διαδικτυακής υλοποίησης. Έστω ότι επιλέγουμε σαν μέθοδο εισόδου την ASCI επιλογή,
σαν κλειδί το “0123456789102030” και σαν κείμενο το «hello!!!”. Για το παράδειγμά μας
θα χρησιμοποιήσουμε τον αλγόριθμο AES-128 και θα επιλέξουμε από το πρόγραμμα να
εκτελέσει μια πλήρη λειτουργία (κρυπτογράφηση και αποκρυπτογράφηση). Σύμφωνα
με αυτές τις επιλογές η αρχική σελίδα θα πρέπει να είναι όπως και στην Εικόνα 4. 4.
92
Το αποτέλεσμα που παίρνουμε είναι αρχικά ένας πίνακας που έχει τις επιλογές μας,
δηλαδή μέθοδο εισόδου ASCII, αλγόριθμος AES-128, λειτουργία πλήρη, κλειδί
“0123456789102030” κείμενο “hello!!!” και ένα textbox με τα ενδιάμεσα βήματα. Στην
Εικόνα 4. 5 παρουσιάζεται το τελικό αποτέλεσμα και στην Εικόνα 4. 6 τα περιεχόμενα
του textbox για την επιβεβαίωση της ορθής λειτουργίας.
93
Εικόνα 4. 6 Αποτελέσματα διαδικτυακής υλοποίησης.
94
4.4 VHDL υλοποίηση AES
Μέγεθος κλειδιού: Στην πρώτη υλοποίηση το κλειδί είναι μήκους 128 bits και στη
δεύτερη δίνεται η δυνατότητα κρυπτογράφησης με κλειδί 128/192 και 256.
Μονάδα παραγωγής κλειδιού: Και στις δύο περιπτώσεις υπάρχει μονάδα που δέχεται ως
είσοδο το εκάστοτε κλειδί και παράγει τα κλειδιά του κάθε γύρου. Στην περίπτωση των
τριών κλειδιών, υπάρχουν σήματα εισόδου που ενεργοποιούν ανάλογα την παραγωγή
10, 12 και 14 υποκλειδιών αντίστοιχα, ανάλογα με τις απαιτήσεις του αλγόριθμου.
Μέγεθος μπλοκ: Η είσοδος και η έξοδος από το κύκλωμα είναι 128 bits και είναι
υλοποιημένο με μέθοδο μη-ανατροφοδότησης.
Κοινή χρήση πόρων: Με σκοπό να ελαττωθεί όσο το δυνατόν περισσότερο ο χώρος που
καταλαμβάνει το κύκλωμα, τόσο στην υλοποίηση με κλειδί 128 bits όσο και στην
υλοποίηση με τα τρία κλειδιά, η κρυπτογράφηση και αποκρυπτογράφηση μοιράζονται
όσο το δυνατόν περισσότερους πόρους γίνεται.
95
4.4.1 AES-128
Από το βασικό κλειδί που εισάγεται παράγονται δέκα υποκλειδιά για την περίπτωση
του AES 128 τα οποία χρησιμοποιούνται στην κρυπτογράφηση και
αποκρυπτογράφηση. Σε πολλές υλοποιήσεις ο αλγόριθμος είναι ανεξάρτητος από την
παραγωγή των κλειδιών, τα οποία πολλές φορές είναι αποθηκευμένα σε μνήμη και
χρησιμοποιούνται από τον αλγόριθμο χωρίς να παράγονται εκείνη τη στιγμή.
Στη συγκεκριμένη υλοποίηση το μυστικό κλειδί εισέρχεται στο κύκλωμα και ακολούθως
παράγονται τα δέκα υποκλειδιά. Επίσης υπάρχει επιλογή αλλαγής του κλειδιού και
επαναπροσδιορισμού των υποκλειδιών κάτι που είναι χρήσιμο σε εφαρμογές που το
κλειδί αλλάζει συνεχώς. Συγκεκριμένα μόλις η είσοδος newkey γίνει ‘1’ η μονάδα
ελέγχου στέλνει τα κατάλληλα σήματα και η διαδικασία παραγωγής ξεκινάει από την
αρχή. Τέλος υπάρχει μια είσοδος round των τεσσάρων bits η οποία οδηγεί το κατάλληλο
κλειδί στην έξοδο του κυκλώματος. Στην Εικόνα 4. 8 παρουσιάζεται το μπλοκ
διάγραμμα για τη μονάδα παραγωγής των κλειδιών και στον Πίνακα 4. 2 τα αρχεία που
έχουν χρησιμοποιηθεί.
Αρχείο Περιγραφή
KeyExpansion.vhd Υλοποιεί την παραγωγή των κλειδιών
key_pack.vhd Πακέτο που περιλαμβάνει όλα τα επιμέρους τμήματα που
χρησιμοποιούνται
ControlKey.vhd Μονάδα ελέγχου που με κατάλληλα σήματα ενεργοποιεί
τις απαραίτητες ενέργειες
mux_nbits.vhd 2 σε 1 πολυπλέκτης μεταβλητού μήκους εισόδου
reg_nbits.vhd Καταχωρητής μεταβλητού μήκους εισόδου
SubBytes.vhd Μετασχηματισμός ενός byte με μη-γραμμική
αντικατάσταση
96
Εικόνα 4. 8 Μπλοκ διάγραμμα υλοποίησης συμμετρικού αλγορίθμου AES.
97
Σύμφωνα με το Fips-197 το αρχικό κλειδί πρέπει να περάσει από μια σειρά
μετασχηματισμών (SubWord, RotWord, xor με RCon) και σε κάθε επανάληψη να
παράγεται ένα κλειδί γύρου. Στο παραπάνω κύκλωμα η διαδικασία έχει ως εξής: Το
κλειδί των 128 bits χωρίζεται σε τέσσερις λέξεις των 32 bits (4 bytes) οι οποίες
αποτελούν είσοδο σε τέσσερις πολυπλέκτες (key_to_mux0-3), έτσι στον αριστερότερο
πολυπλέκτη έχουμε τα πρώτα 32 bits του κλειδιού (περισσότερο σημαντικά) και στο
δεξιότερο τα τελευταία 32 bits (λιγότερο σημαντικά). Η είσοδος του κλειδιού την
πρώτη φορά θα πρέπει να συνοδεύεται με ένα bit ελέγχου newkey το οποίο θα πρέπει
να γίνεται “1” σε κάθε κλειδί και μετά να μηδενίζεται. Το bit αυτό οδηγείται σε μια
μονάδα ελέγχου η οποία στην ουσία είναι ένας μετρητής και ενεργοποιεί τα κατάλληλα
σήματα για τους καταχωρητές, τους πολυπλέκτες και δίνει κάθε φορά την τιμή RCon.
Συνεπώς στον πρώτο κύκλο οι πολυπλέκτες παίρνουν σαν είσοδο τους το αρχικό κλειδί
και το βγάζουν στην έξοδό τους. Η έξοδος του δεξιότερου πολυπλέκτη (key_to_mux0)
είναι αυτή που θα επιδεχθεί τους μετασχηματισμούς. Επιπλέον, το κλειδί οδηγείται σε
έναν καταχωρητή 128 bits για την αποθήκευση του.
32
SubBytes
98
key_pack.vhd: Είναι αρχείο το οποίο περιλαμβάνει όλα τα επιμέρους τμήματα που
χρησιμοποιούνται και καλείται στο κυρίως αρχείο του κυκλώματος.
SubBytes.vhd: Είναι το τμήμα που υλοποιεί τον μη γραμμικό μετασχηματισμό ενός byte.
Έχει σαν είσοδο 8 bits δεδομένων και μετά από μια σειρά πράξεων, παίρνουμε μια έξοδο
των 8 επίσης bits.
ControlKey.vhd: Είναι η μονάδα που ελέγχει όλα τα επιμέρους τμήματα για την επέκταση
του κλειδιού. Οι είσοδοι της μονάδας ελέγχου είναι το bit newkey και ένα ρολόι Clk, σαν
έξοδο παίρνουμε το bit sel, το bit En, ένα διάνυσμα ld μήκους 11 bits και τη σταθερά
γύρου RCon μήκους 8 bits. Η μονάδα ελέγχου λειτουργεί ως εξής: Μόλις έρθει το bit
newkey με τιμή “1” θέτει το sel στη τιμή “0”, δηλαδή ενεργοποιεί την L_in είσοδο του
πολυπλέκτη που είναι το αρχικό κλειδί, το En στη τιμή “1” ,ενεργοποιεί δηλαδή τους
πολυπλέκτες, δίνει την τιμή “0” σε έναν εσωτερικό μετρητή, μηδενίζει το διάνυσμα ld
(έτσι το διάνυσμα έχει την τιμή “00000000000” και δεν ενεργοποιείται κανένας
καταχωρητής για την αποθήκευση των κλειδιών γύρου) και τέλος δίνει την
δεκαεξαδική τιμή “01” στη σταθερά γύρου RCon. Όταν το bit newkey γίνει “0” τότε στη
θετική ακμή του ρολογιού θα συμβούν τα εξής, τα ld(0) και ld(1) θα πάρουν τη τιμή “1”,
δηλαδή θα αποθηκευτεί το αρχικό κλειδί και το κλειδί του πρώτου γύρου, ο μετρητής
θα αυξηθεί κατά 1 και με την εντολή ld(count+1)<='1'; και με αυτόν τον τρόπο σε κάθε
κύκλο ρολογιού θα αποθηκεύεται το κλειδί γύρου. Στη συνέχεια η σταθερά γύρου θα
προστίθεται στον εαυτό της με τον έλεγχο να παίρνει τις τιμές “1B” και “36” στους
κατάλληλους γύρους και να μηδενίζεται όταν πρέπει. Η όλη διαδικασία
επαναλαμβάνεται συνεχώς μέχρις ότου να έρθει ένα νέο σήμα newkey που θα ξεκινήσει
τη διαδικασία από την αρχή.
KeyExpansion.vhd: Είναι το κύριο τμήμα για την παραγωγή του κλειδιού. Έχει σαν
είσοδο το αρχικό κλειδί, την επιλογή newkey, ένα ρολόι, την είσοδο round για την
επιλογή του κλειδιού γύρου και σαν έξοδος δίνεται το κατάλληλο κλειδί. Το αρχείο αυτό
καλεί το αρχείο key_pack.vhd που περιλαμβάνει όλα τα επιμέρους τμήματα, δημιουργεί
τους καταχωρητές τους πολυπλέκτες και όλα τα τμήματα που είναι απαραίτητα, και τα
συνδέει κατάλληλα όπως φαίνεται στην Εικόνα 4. 9. Τέλος ανάλογα με την τιμή της
εισόδου round οδηγεί τα περιεχόμενα των καταχωρητών που περιέχουν τα κλειδιά
γύρου στην έξοδο του κυκλώματος.
99
Παράδειγμα εξομοίωσης
Μεταγλώτιση σχεδίου
Quartus II Version 7.2 Build 203 02/05/2008 SP 2 SJ Full Version
Top-level Entity Name KeyExpansion
Family Cyclone II
Device EP2C35F672C6
Total logic elements 2.206 / 33.216 (7%)
Total combinational functions 1.566 / 33.216 (5%)
Dedicated logic registers 1.586 / 33.216 (5%)
Total registers 1.586
Total pins 262 / 475 (55%)
Total memory bits 0 / 483.840 (0%)
Embedded Multiplier 9-bit elements 0 / 70 (0%)
Total PLLs 0 / 4 (0%)
Timing Models Final
Πίνακας 4. 3 Αναφορά μεταγλώττισης για την επέκταση κλειδιού.
100
4.4.1.2 Μονάδα κρυπτογράφησης/αποκρυπτογράφησης
Αρχείο Περιγραφή
mux_clk.vhd Πολυπλέκτης 2 σε 1 που διατηρεί τα δεδομένα
mux_nbits.vhd Πολυπλέκτης 2 σε 1 μεταβλητού μήκους εισόδου
mux3in1.vhd Πολυπλέκτης 3 σε 1 μεταβλητού μήκους εισόδου
ShiftRows.vhd Μετάθεση των 128 bits
InvShiftRows.vhd Αντίστροφη μετάθεση των 128 bits
SubBytes128.vhd Μετασχηματισμός των 128 bits με μη-γραμμική
αντικατάσταση
InvSubBytes128.vhd Αντίστροφος μετασχηματισμός των 128 bits με μη-
γραμμική αντικατάσταση
InvMixColumn128.vhd Πολλαπλασιασμός στο πεπερασμένο πεδίο GF(28) με
δεδομένο πολυώνυμο. Η υλοποίηση εφαρμόζει και τον
κανονικό μετασχηματισμό MixColumn και τον αντίστροφο
InvMixColumn για 128 bits δεδομένα
101
Περιγραφή αρχείων
mux_clk.vhd: Το αρχείο αυτό περιγράφει έναν πολυπλέκτη δύο εισόδων L_in και R_in
όπου ανάλογα με τα σήματα εισόδου οδηγούνται στην έξοδο mux_out. Συγκεκριμένα το
κύκλωμα έχει ένα bit εισόδου ενεργοποίησης του πολυπλέκτη En, ένα bit επιλογής
εξόδου sel, και ένα ρολόι Clk. Όταν σε κάθε θετική ακμή του ρολογιού ο πολυπλέκτης
είναι ενεργός (En=”1”) τότε ανάλογα με την τιμή sel παίρνουμε την επιθυμητή έξοδο
(L_in αν το sel=”0” R_in αν το sel=”1”).
mux3in1.vhd: Είναι ένας πολυπλέκτης τριών εισόδων, MC, IMC, last_round και
τοποθετείται μετά το μετασχηματισμό InvMixColumn. Ο πολυπλέκτης αυτός χρησιμεύει
για την υλοποίηση των εννιά επαναλήψεων και του τελευταίου γύρου. Έχει ένα bit
εισόδου για την ενεργοποίηση του En, ένα διάνυσμα μήκους δύο bits για την επιλογή
εξόδου sel, και μια έξοδο mux_out. Η λειτουργία του είναι όπως αυτή ενός απλού
πολυπλέκτη, δηλαδή όταν είναι ενεργός (En=”1”) αν το sel έχει την τιμή “00” δίνει έξοδο
MC, αν το sel έχει την τιμή “01” δίνει έξοδο IMC, διαφορετικά δίνει έξοδο last_round.
SubBytes.vhd: Για τον SubByte μετασχηματισμού έχουν γίνει πολλές προσπάθειες και
έρευνες για την καλύτερη και αποδοτικότερη υλοποίηση του [32, 33, 34, 35, 36]. Σε μια
πρώτη προσέγγιση θα μπορούσε ο μετασχηματισμός να υλοποιείται μέσω μιας μνήμης
RAM όπου θα ήταν αποθηκευμένοι μέσα οι πίνακες μετασχηματισμού κάτι ανάλογο
δηλαδή, με την υλοποίηση σε λογισμικό. Όμως η προσπέλαση της μνήμης θα είχε μεγάλη
επίπτωση στην αύξηση της καθυστέρησης, πράγμα που θα έκανε τον αλγόριθμο αρκετά
αργό. Για το λόγο αυτό έχουν γίνει προσπάθειες για τον επί τόπου υπολογισμό του
μετασχηματισμού μέσω πράξεων στο πεδίο GF(28). Οι X. Zhang και K.K. Parhi [34]
στηρίχθηκαν στην ιδιότητα ότι το πεδίο GF(28) μπορεί να χτιστεί επαναληπτικά από το
πεδίο GF(2) χρησιμοποιώντας τα ακόλουθα ανάγωγα πολυώνυμα
όπου φ = {10}2 και λ = {1100}2 . Επιπλέον για την αναπαράσταση ενός στοιχείου στο
πεδίο GF(28) πρέπει να εφαρμοστεί μια ισομορφική συνάρτηση f(x) = δ × x και η
αντίστροφη της. Η συνάρτηση δ που αντιστοιχεί στο πολυώνυμο p(x) = x8+x4+x3+x+1
είναι ένας πίνακας 8x8 όπως φαίνεται παρακάτω:
102
Εικόνα 4. 13 Μπλοκ διάγραμμα υλοποίησης SubBytes.
11000010
⎡0 1 0 0 1 0 1 0⎤
⎢0 1 1 1 1 0 0 1⎥
⎢ ⎥
0 1 1 0 0 0 1 1⎥
δ =⎢
⎢0 1 1 1 0 1 0 1⎥
⎢0 0 1 1 0 1 0 1⎥
⎢0 1 1 1 1 0 1 1⎥
⎣0 0 0 0 0 1 0 1⎦
Οι R.R. Rachh, P.V. A. Mohan και B.S. Anami [33] στηριζόμενοι στην εργασία των Zhang
και Parhi βελτιστοποίησαν ακόμα περισσότερο το κύκλωμα ελαχιστοποιώντας της
πύλες που χρειάζονται για την υλοποίηση του και συνδυάζοντας την έξοδο από την
ισομορφική συνάρτηση δ με την έξοδο από την αντίστροφη ισομορφική συνάρτηση και
το μετασχηματισμό συσχέτισης ελαττώνοντας έτσι την κρίσιμη διαδρομή και
ελαχιστοποιώντας τις απαιτούμενες πύλες (Εικόνα 4. 14). Έτσι κατέληξαν στην
υλοποίηση του μετασχηματισμού μέσα από πύλες xor και and την οποία και
χρησιμοποιήσαμε. Για είσοδο x και έξοδο t των 8 bits οι σχέσεις είναι οι ακόλουθες για
κάθε ένα μπλοκ:
Μπλοκ Ι:
q(3) = (x(7)⋅(x(5)⊕ x(4) ⊕ x(1) ⊕ x(0))) ⊕ (x(6)⋅(x(5) ⊕ x(4) ⊕ x(2) ⊕ x(1))) ⊕ (x(5) ⋅(x(4)
⊕ x(2) ⊕ x(1) ⊕ x(0))) ⊕ (x(4)⋅(x(2) ⊕ x(1))) ⊕ ((x(3)) ⋅(x(2) ⊕ x(1))) ⊕ (x(2)⋅ x(1))
q(2) = (x(7)⋅(x(6) ⊕ x(5) ⊕ x(3) ⊕ x(2) ⊕ x(0))) ⊕ (x(6)⋅(x(5) ⊕ x(3) ⊕ x(2) ⊕ x(1) ⊕ x(0)))
⊕ (x(5)⋅(x(3) ⊕ x(2))) ⊕ (x(4)⋅(x(3) ⊕ x(2) ⊕ x(0))) ⊕ (x(3)⋅(x(2) ⊕ x(0))) ⊕ ((x(2) ⊕
x(1))⋅ x(0))
q(1) = (x(7)⋅(x(5) ⊕ x(2) ⊕ x(0) ⊕'1')) ⊕ (x(6)⋅(x(5) ⊕ x(3))) ⊕ (x(5)⋅(x(4) ⊕ x(3) ⊕ x(2) ⊕
x(0) ⊕'1')) ⊕ (x(4)⋅(x(2) ⊕'1')) ⊕ (x(3)⋅(x(2) ⊕ x(0))) ⊕ (x(2)⋅(x(1) ⊕ x(0) ⊕'1')) ⊕
x(1)
q(0) = (x(7)⋅(x(6) ⊕ x(4) ⊕ x(0))) ⊕ (x(6)⋅(x(5) ⊕ x(4) ⊕ x(3) ⊕ x(1) ⊕'1')) ⊕ (x(5)⋅(x(3) ⊕
x(0) ⊕'1')) ⊕ (x(4)⋅(x(3) ⊕ x(1))) ⊕ (x(3)⋅(x(2) ⊕ x(1) ⊕ x(0) ⊕'1')) ⊕ ((x(2) ⊕ x(1))⋅
x(0)) ⊕ (x(0) ⊕ x(2))
103
Μπλοκ ΙΙ
Μπλοκ ΙΙΙ
t(3) <= (y(3)⋅(x(7) ⊕ x(6) ⊕ x(5) ⊕ x(4) ⊕ x(3) ⊕ x(2) ⊕ x(1)))⊕(y(2)⋅(x(7) ⊕ x(6) ⊕ x(5) ⊕
x(3) ⊕ x(2) ⊕ x(0)))⊕(y(1)⋅(x(7) ⊕ x(3) ⊕ x(1) ⊕ x(0)))⊕(y(0)⋅(x(6) ⊕ x(4) ⊕ x(1) ⊕
x(0)))
t(2) = (y(3)⋅(x(5) ⊕ x(2) ⊕ x(1) ⊕ x(0)))⊕(y(2)⋅(x(7) ⊕ x(6) ⊕ x(5) ⊕ x(4) ⊕ x(3) ⊕ x(2) ⊕
x(0)))⊕(y(1)⋅(x(7) ⊕ x(5) ⊕ x(4)))⊕(y(0)⋅(x(4) ⊕ x(2) ⊕ x(1) ⊕ x(0)))
InvSubBytes.vhd: Όπως και στη περίπτωση του SubBytes.vhd η υλοποίηση έγινε με βάση
την εργασία των Rachh, Mohan και Anami. Η βελτιστοποίηση στα Μπλοκ Ι, ΙΙ και ΙΙΙ
γίνεται πλέον στη διαδικασία μετασχηματισμού, αντίστροφος μετασχηματισμός
συσχέτισης και ισομορφική συνάρτηση, πολλαπλασιαστική αντιστροφή, αντίστροφη
ισομορφική συνάρτηση (Εικόνα 4. 15, [33,34]).
104
Οι συναρτήσεις που υλοποιούν τον αντίστροφο μετασχηματισμό είναι οι εξής:
Μπλοκ Ι:
q(3) =(x(7) ⋅(x(4) ⊕x(1) ⊕x(0)))⊕(x(6) ⋅(x(4) ⊕x(2) ⊕x(0))) ⊕(x(5) ⋅(x(4) ⊕x(3))) ⊕(x(4)
⋅(x(2) ⊕x(1)))⊕x(4) ⊕(x(3) ⋅(x(1) ⊕x(0)))⊕(x(2) ⋅(x(1)⊕x(0)))⊕(x(0))
q(2) =(x(7) ⋅(x(5) ⊕x(2) ⊕x(1) ⊕x(0)))⊕x(7) ⊕(x(6) ⋅(x(5) ⊕x(4)))⊕x(6) ⊕(x(4) ⋅(x(2)
⊕x(1)))⊕x(4)⊕(x(3) ⋅x(1))⊕(x(1) ⋅(x(0)))⊕x(1) ⊕(x(0)) ⊕'1'
q(1) =(x(7) ⋅(x(4) ⊕x(2) ⊕x(0) ⊕x(1)))⊕x(7) ⊕(x(6) ⋅(x(5) ⊕x(4) ⊕x(2) ⊕x(1)))⊕x(6)
⊕(x(5) ⋅(x(3) ⊕x(1)⊕x(0)))⊕x(5) ⊕(x(4) ⋅(x(2)))⊕x(4) ⊕(x(3) ⋅(x(2) ⊕x(0)))⊕(x(2))
⊕(x(1)) ⊕(x(0))
q(0) =(x(7) ⋅(x(4) ⊕x(0))) ⊕(x(6) ⋅(x(5) ⊕x(4) ⊕x(1))) ⊕(x(5) ⋅x(4)) ⊕(x(4) ⋅(x(3) ⊕x(2)
⊕x(1))) ⊕x(4) ⊕(x(3) ⋅(x(2) ⊕x(0))) ⊕x(3) ⊕(x(1) ⋅x(0)) ⊕'1'
Μπλοκ ΙΙ
Μπλοκ ΙΙI
t(4)=(y(3)⋅(x(6)⊕x(5)⊕x(2)⊕x(0)⊕'1'))⊕(y(2)⋅(x(7)⊕x(5)⊕x(1)))⊕(y(1)⋅(x(5)⊕x(4)⊕x(3)
⊕x(2)⊕x(1)⊕x(0)⊕'1'))⊕(y(0)⋅(x(7)⊕x(6)⊕x(5)⊕x(4)⊕x(2)))
t(1)=(y(3)⋅(x(7)⊕x(6)⊕x(2)⊕x(1))) ⊕ (y(2)⋅(x(7)⊕x(6)⊕x(3)⊕x(2)⊕x(1)⊕x(0)⊕'1')) ⊕
(y(1) ⋅(x(5)⊕x(4)⊕x(3)⊕'1'))⊕(y(0)⋅(x(6)⊕x(3) ⊕x(0)))
105
Εικόνα 4. 16 Υλοποίηση πολλαπλασιασμού {02}16 με πολυώνυμο.
Όπου S είναι η αρχική κατάσταση S’ η τελική και c η στήλη του πίνακα κατάστασης. Ο
σταθερός πολλαπλασιασμός με το {02}16 αναφέρεται σαν XTime και με βάση το ότι ένα
πολυώνυμο στο GF(28) εκφράζεται ως S = s7x7 + s6x6 + s5x5 + s4x4 + s3x3 + s2x2 + s1x + s0 ο
πολλαπλασιασμός γίνεται :
{02}12S = xS = s7x8 + s6x7 + s5x6 + s4x5 + s3x4 + s2x3 + s1x2 + s0x modp(x)
= s6x7 + s5x6 + s4x5 + (s3 + s7)x4 + (s2 + s7)x3 + s1x2 + (s0 + s7)x + s7
Συνεπώς ο πολλαπλασιασμός XTime υλοποιείται με τρείς πύλες xor με μια μόλις πύλη
στην κρίσιμη διαδρομή (Εικόνα 4. 16).
S’0,c = ({02}16(S0,c + S1,c) + (S2,c + S3,c) + S1,c) + ({02}16({04}16(S0,c + S2,c) + {04}16(S1,c + S3,c)) +
{04}16(S0,c + S2,c))
S’1,c = ({02}16(S1,c + S2,c) + (S3,c + S0,c) + S2,c) + ({02}16({04}16(S0,c + S2,c) + {04}16(S1,c + S3,c)) +
{04}16(S1,c + S3,c))
S’2,c = ({02}16(S2,c + S3,c) + (S0,c + S1,c) + S3,c) + ({02}16({04}16(S0,c + S2,c) + {04}16(S1,c + S3,c)) +
{04}16(S0,c + S2,c))
S’3,c = ({02}16(S3,c + S0,c) + (S1,c + S2,c) + S0,c) + ({02}16({04}16(S0,c + S2,c) + {04}16(S1,c + S3,c)) +
{04}16(S1,c + S3,c))
106
Εικόνα 4. 17 Υλοποίηση πολλαπλασιασμού {04}16 με πολυώνυμο.
107
4.4.1.3 Μονάδα ελέγχου
Η μονάδα ελέγχου είναι υπεύθυνη για το συγχρονισμό όλου του κυκλώματος. Στην
ουσία δεν είναι τίποτα περισσότερο από έναν μετρητή που την κατάλληλη στιγμή
στέλνει τα απαραίτητα σήματα τόσο στην μονάδα κρυπτογράφησης
αποκρυπτογράφησης όσο και στη μονάδα επέκτασης κλειδιού. Η μονάδα ελέγχου
περιγράφεται στο αρχείο counter.vhd, έχει σαν είσοδο ένα ρολόι Clk, ένα bit Res και ένα
bit U_D και δίνει σαν έξοδο τα σήματα Sel, En, stop, key_sel μήκους ενός bit και το
διάνυσμα count μήκους τεσσάρων bit. Ο έλεγχος των σημάτων γίνεται κάθε φορά στη
θετική ακμή του ρολογιού και η λειτουργία του είναι η ακόλουθη. Ο πρώτος έλεγχος
αφορά την τιμή του bit U_D που σχετίζεται με την λειτουργία που θα πραγματοποιηθεί
(U_D=”0” για κρυπτογράφηση U_D=”1” για αποκρυπτογράφηση ). Στην περίπτωση της
κρυπτογράφησης ελέγχεται αν πρέπει να μηδενιστεί ο μετρητής και να ξεκινήσει η
διαδικασία από την αρχή, κάτι που είναι απαραίτητο με την εισαγωγή ενός νέου
κλειδιού και για το λόγο αυτό το bit Res τροφοδοτείται από το bit newkey. Όσο το Res
παραμένει μηδέν ο μετρητής αυξάνεται μέχρι και την τιμή 10, όσο δηλαδή και το
απαιτούμενο πλήθος γύρων όπου και σταματάει. Ενδιάμεσα στην τιμή 9 όπου πρέπει να
προσπεραστεί ο μετασχηματισμός MixColumns η μονάδα στέλνει το κατάλληλο σήμα
ώστε να δοθεί η σωστή είσοδος στον πολυπλέκτη που βρίσκεται μετά από το τμήμα
InvMixColumns128 και να πραγματοποιηθεί σωστά η διαδικασία.
Η περίπτωση της αποκρυπτογράφησης είναι ιδιαίτερη και αυτό λόγο του ότι για να
ξεκινήσει η διαδικασία αποκρυπτογράφησης πρέπει πρώτα να παραχθεί το 10ο
υποκλειδί και να χρησιμοποιηθεί πρώτο. Για το λόγο αυτό η αρχικοποίηση του μετρητή
γίνεται από το 10 και προστίθεται ένας επιπλέον εσωτερικός μετρητής που θα δώσει
αυτούς τους απαραίτητους 10 κύκλους ρολογιού. Έτσι όταν πρέπει η διαδικασία να
ξεκινήσει από την αρχή μέσω του bit Res και οι δύο μετρητές αρχικοποιούνται στο 10.
Όσο ο εσωτερικός μετρητής μετράει αντίστροφα τα πάντα παραμένουν ανενεργά
δίνοντας χρόνο στην παραγωγή του κλειδιού. Όταν μηδενιστεί αυτός ο μετρητής τότε
ξεκινάει ο κύριος αντίστροφα μέχρι να μηδενιστεί όπου και σταματάει. Αντίστοιχα με τη
διαδικασία κρυπτογράφησης όταν ο μετρητής φτάσει στο 1 στέλνει το κατάλληλο σήμα
ώστε να δοθεί η κατάλληλη είσοδος στον πολυπλέκτη που βρίσκεται μετά από το τμήμα
InvMixColumns128 και να προσπεραστεί ο μετασχηματισμός InvMixColumns.
Εφόσον είδαμε την κάθε μονάδα ξεχωριστά θα παρουσιάσουμε στην παρούσα ενότητα
πως αυτές οι μονάδες συνδέονται μεταξύ τους για να υλοποιηθεί ο αλγόριθμος AES.
Παρακάτω στον Πίνακα 4. 5 παρουσιάζονται όλα τα επιμέρους αρχεία που
χρησιμοποιήθηκαν με μια συνοπτική περιγραφή, το μπλοκ διάγραμμα στην Εικόνα 4.
19. που αποτελεί το πλήρες κύκλωμα και στη συνέχεια ένα παράδειγμα εξομοίωσης.
Το κύκλωμα όπως φαίνεται και στην Εικόνα 4. 8 έχει σαν είσοδο το αρχικό κλειδί, το
αρχικό μήνυμα και τα δύο μήκους 128 bits, ένα bit λειτουργίας (Operation), ένα ρολόι
Clk, και ένα bit newkey για την επιλογή νέου κλειδιού και δίνει σαν έξοδο το
κρυπτογράφημα plaintext. Το αρχικό κλειδί οδηγείται στην μονάδα επέκτασης κλειδιού
μαζί με το bit ελέγχου newkey και η διαδικασία παραγωγής των υποκλειδιών ξεκινά. Το
αρχικό μήνυμα οδηγείται στη μονάδα κρυπτογράφησης/αποκρυπτογράφησης μαζί με
το bit Operation και περιμένει τα κατάλληλα σήματα από τη μονάδα ελέγχου ώστε να
ξεκινήσει η διαδικασία. Η μονάδα ελέγχου δέχεται τα σήματα newkey και Operation
108
δίνοντας στην έξοδο τα απαραίτητα σήματα στη μονάδα κλειδιού και στη μονάδα
κρυπτογράφησης/αποκρυπτογράφησης. Στο σημείο αυτό είναι σημαντικό να
αναφέρουμε την τροποποίηση που χρειάζεται το κύκλωμα ώστε να πραγματοποιηθεί η
μέθοδος ισοδύναμης κρυπτογράφησης η οποία δεν είναι τίποτα περισσότερο από μια
προσθήκη της συνάρτησης MixColumn σε κάθε κλειδί. Συγκεκριμένα σε όλα τα κλειδιά
γύρου εκτός από το πρώτο πριν γίνουν xor με την τρέχουσα κατάσταση στο τέλος κάθε
γύρου εφαρμόζεται ο μετασχηματισμός MixColumn και έπειτα προστίθενται. Έτσι στην
έξοδο του κλειδιού υπάρχει μια επιπλέον μονάδα InvMixColumn128 και ένας
πολυπλέκτης που επιλέγει αν θα βγάλει έξοδο τα κλειδιά γύρου ή τα μετασχηματισμένα
κλειδιά (Εικόνα 4. 19). Κάθε φορά η μονάδα ελέγχου στέλνει το σήμα που δείχνει σε
ποιον γύρο βρίσκεται η διαδικασία στη μονάδα κλειδιού, εξάγοντας έτσι τα σωστά
κλειδιά γύρου τα οποία τροφοδοτούνται στη μονάδα
κρυπτογράφησης/αποκρυπτογράφησης. Η τελική κατάσταση σε κάθε γύρο οδηγείται
στην έξοδο ciphertext και μόλις η διαδικασία ολοκληρωθεί η τελική κατάσταση
αποτελεί και το κρυπτοκείμενο.
Αρχείο Περιγραφή
key_pack.vhd Αρχείο που περιλαμβάνει τα τμήματα που
χρησιμοποιούνται για το κλειδί
pack_for_all.vhd Αρχείο που περιλαμβάνει όλα τα τμήματα που
χρησιμοποιούνται
mux_clk.vhd Πολυπλέκτης 2 σε 1 που διατηρεί τα δεδομένα
mux_nbits.vhd Πολυπλέκτης 2 σε 1 μεταβλητού μήκους εισόδου
mux3in1.vhd Πολυπλέκτης 3 σε 1 μεταβλητού μήκους εισόδου
reg_nbits.vhd Καταχωρητής μεταβλητού μήκους εισόδου
ControlKey.vhd Μονάδα ελέγχου που με κατάλληλα σήματα ενεργοποιεί
τις απαραίτητες ενέργειες
KeyExpansion.vhd Αρχείο που υλοποιεί την επέκταση κλειδιού
ShiftRows.vhd Μετάθεση των 128 bits
InvShiftRows.vhd Αντίστροφη μετάθεση των 128 bits
SubBytes.vhd Μετασχηματισμός ενός byte με μη-γραμμική
αντικατάσταση
SubBytes128.vhd Συνδυασμός του SubByte μετασχηματισμού για υλοποίηση
σε 128 bits
InvSubBytes.vhd Αντίστροφος μετασχηματισμός ενός byte με μη-γραμμική
αντικατάσταση
InvSubBytes128.vhd Συνδυασμός του InvSubByte μετασχηματισμού για
υλοποίηση σε 128 bits
x_time.vhd Υλοποίηση πολλαπλασιασμού {02}16 με πολυώνυμο.
x_time4.vhd Υλοποίηση πολλαπλασιασμού {04}16 με πολυώνυμο.
MixColumn_Inv32.vhd Πολλαπλασιασμός στο πεπερασμένο πεδίο GF(28) με
δεδομένο πολυώνυμο. Η υλοποίηση εφαρμόζει και τον
κανονικό μετασχηματισμό MixColumn και τον αντίστροφο
InvMixColumn για 32 bits δεδομένα
InvMixColumn128.vhd Συνδυασμός του MixColumn_Inv32 μετασχηματισμού για
υλοποίηση σε 128 bits
109
Εικόνα 4. 19 Κύκλωμα AES-128.
110
Παράδειγμα εξομοίωσης
Μεταγλώτιση σχεδίου
Quartus II Version 7.2 Build 203 02/05/2008 SP 2 SJ Full Version
Top-level Entity Name AES128
Family Cyclone II
Device EP2C35F672C6
Total logic elements 6.012 / 33.216 (18%)
Total combinational functions 5.372 / 33.216(16%)
Dedicated logic registers 1.725 / 33.216(5%)
Total registers 1.725
Total pins 391 / 475 (82%)
Total memory bits 0 / 483.840 (0%)
Embedded Multiplier 9-bit elements 0 / 70 (0%)
Total PLLs 0 / 4 (0%)
Timing Models Final
111
Εικόνα 4. 21 RTL σχηματικό AES-128.
112
Στην Εικόνα 4. 20 φαίνονται ο χώρος που καταλαμβάνει ο αλγόριθμος στο FPGA και
στην Εικόνα 4. 21 το κύκλωμα που δημιουργεί το Quartus II για την υλοποίηση του. Για
την εξομοίωση του αλγορίθμου σε υλικό θα χρησιμοποιήσουμε τις εισόδους που
εισάγαμε και στην περίπτωση του λογισμικού ώστε να μπορέσουμε να συγκρίνουμε τη
σωστή λειτουργία του. Συνεπώς σαν είσοδο κειμένου θα έχουμε το “hello!!!” που
αντιστοιχεί στο δεκαεξαδικό “68656c6c6f2121210000000000000000” και σαν κλειδί
το “0123456789102030” που αντιστοιχεί στο δεκαεξαδικό
“30313233343536373839313032303330”. Για την περίπτωση της κρυπτογράφησης
θα πρέπει να θέσουμε για ένα παλμό ρολογιού το newkey στην τιμή “1” και έπειτα στο
“0” και την είσοδο Operation στη τιμή “0”. Τα αποτελέσματα παρουσιάζονται στην
Εικόνα 4. 22. Όπως παρατηρούμε σε κάθε γύρο που υποδικνείεται από την έξοδο rnd
παίρνουμε την ενδιάμεση κατάσταση στο τέλος κάθε γύρου και στο τέλος (γύρος 10)
δίνεται η τελική έξοδος του κρυπτοκειμένου που στο παράδειγα μας είναι
“44a1aaa9b2a975290795ae5ca91dc2ef”, που συμφωνεί με τα αποτελέσματα της
υλποίησης σε λογισμικό και της διαδικτυακής υλοποίησης. Στη συνέχεια για να
ελέγξουμε και τη λειτουργία της αποκρυπτογράφησης θα εισάγουμε το κρυπτοκείμενο
στην είσοδο plaintext και θα θέσουμε την είσοδο Operation στην τιμή “1”. Όπως
φαίνεται στην Εικόνα 4. 23 αρχικά ο αλγόριθμος περιμένει για 9 κύκλους ρολογιού και
στον 10ο ξεκινάει η διαδικασία της αποκρυπτογράφησης για να δώσει χρόνο στην
μονάδα απέκτασης κλειδιού να παράγει τα κλειδιά. Πλέον οι γύροι μετριούνται
αντίστροφα με την έξοδο ciphertext στο τέλος του κάθε γύρου να αποτελεί την
κατάσταση γύρου. Έπειτα από 10 γύρους αποκρυπτογράφησης λαμβάνουμε τελικά
σαν έξοδο το αρχικό κείμενο “68656c6c6f2121210000000000000000” που είναι και η
είσοδος που είχαμε εισάγει στην αρχή του παραδείγματος.
113
Εικόνα 4. 23 Αποτελέσματα εξομοίωσης αποκρυπτογράφησης.
4.4.2 AES-128/192/256
Η μονάδα παραγωγής κλειδιού πρέπει πλέον να υποστηρίζει και τα τρία κλειδιά μήκους
128, 192 και 256 αντίστοιχα. Οι συναρτήσεις που χρησιμοποιούνται σε σύγκριση με τη
μονάδα παραγωγής του αλγορίθμου AES-128 είναι οι ίδιες. Αυτό που διαφέρει είναι ο
τρόπος που γίνεται η διασύνδεση μεταξύ των καταχωρητών και των πολυπλεκτών που
114
Αρχείο Περιγραφή
KeyExpansion.vhd Υλοποιεί την παραγωγή των κλειδιών
Keypack.vhd Πακέτο που περιλαμβάνει όλα τα επιμέρους τμήματα που
χρησιμοποιούνται
ControlKey.vhd Μονάδα ελέγχου που με κατάλληλα σήματα ενεργοποιεί
τις απαραίτητες ενέργειες
mux_nbits.vhd 2 σε 1 πολυπλέκτης μεταβλητού μήκους εισόδου
mux3in1.vhd Πολυπλέκτης 3 σε 1 μεταβλητού μήκους εισόδου
reg_nbits.vhd Καταχωρητής μεταβλητού μήκους εισόδου
SubBytes.vhd Μετασχηματισμός ενός byte με μη-γραμμική
αντικατάσταση
RotWord.vhd Ολίσθηση δεδομένων
Αρχικά στη μονάδα εισέρχεται το κλειδί που έχει επιλεγεί. Η είσοδος είναι μήκους 256
bits και χωρίζεται σε οκτώ λέξεις των 32 bits και εισάγονται σε οκτώ πολυπλέκτες. Αν
το κλειδί είναι μήκους 128 bits, τότε γεμίζουν τα 128 λιγότερο σημαντικά ψηφία και τα
υπόλοιπα συμπληρώνονται με μηδενικά, αντίστοιχα συμβαίνει και στο κλειδί των 192
bits. Μαζί με το κλειδί έρχεται και το bit newkey, που όπως έχουμε ξανά αναφέρει
ξεκινάει τη διαδικασία από την αρχή μηδενίζοντας τη μονάδα ελέγχου του κλειδιού, ένα
ρολόι Clk, το διάνυσμα round που υποδεικνύει ποιο κλειδί γύρου πρέπει να οδηγηθεί
στην έξοδο και μια νέα επιλογή key_sel μήκους δύο bits. Με την είσοδο αυτή επιλέγεται
ποιό κλειδί έχει επιλεγεί έτσι ωστέ να γίνει η σωστή επέκταση του. Οι δυνατές τιμές που
μπορεί να πάρει είναι “00” ή “01” για κλειδί 128 bits, “10” για κλειδί 192 bits και “11” για
κλειδί 256 bits. Η είσοδος αυτή οδηγείται στην μονάδα ελέγχου όπου αρχικοποιεί
κατάλληλα τους πολυπλέκτες και τους καταχωρητές που θα αποθηκευτούν τα κλειδιά
γύρου και στις εισόδους ενέργοποίησης των τεσσάρων αριστερότερων πολυπλεκτών
(Εικόνα 4. 24 για AES128 ενεργοποιούνται οι τέσσεροι δεξιότεροι, για AES192 οι έξι
δεξιότεροι και για AES256 όλοι οι πολυπλέκτες). Με αυτόν τον τρόπο ανάλογα με το
μέγεθος του κλειδιού έχουμε και τους απαραίτητους πολυπλέκτες. Οι πολυπλέκτες στη
μια τους είσοδο δέχονται το αρχικό κλειδί και στην άλλη την επεκτεταμμένη λέξη. Στην
περίπτωση των κλειδιών 192 και 256 οι επεκτεταμμένες λέξεις είναι 6 και 8 αντίστοιχα
όμως τα δεδομένα που απαιτούνται για τον υπολογισμό των νέων λέξεων από τον
προηγούμενο γύρο χάνονται. Για το λόγο αυτό στην έξοδο κάθε πολυπλέκτη έχει
προστεθεί ένας καταχωρητής που περιέχει τα δεδομένα του προηγούμενου γύρου και
ένας νέος πολυπλέκτης με εισόδο την έξοδο του αρχικού πολυπλέκτη και την έξοδο του
καταχωρητή (για το κλειδί 192 υπάρχουν δύο επιπλέον τέτοιοι καταχωρητές). Έτσι
ανάλογα με την επιλογή του κλειδιού και τα σήματα από τη μονάδα ελέγχου
επιλέγονται ποιες έξόδους θα δώσει ο κάθε πολυπλέκτης. Για παράδειγμα στην
περίπτωση του κλειδιού των 128 bits, οι τέσσεροι δεξιότεροι πολυπλέκτες δίνουν σαν
έξοδο την έξοδο του αρχικού πολυπλέκτη όπως και στην επέκταση κλειδιού του AES-
128, ενώ για κλειδί 192 και 256 δίνουν σαν έξοδο τα δεδομένα των καταχωρητών.
115
Εικόνα 4. 24 Μπλοκ διάγραμμα για τη μονάδα παραγωγής κλειδιών.
116
Επιπλέον συμφωνα με το Fips-197 η πρώτη λέξη αφού δεχθεί τους μετασχηματισμούς
RotWord, SubWord και xor με τη σταθερά RCon, πρέπει να γίνει xor με την τελευταία
λέξη. Στην περίπτωση του κλειδιού των 256 bits απλά υλοποιείται η πράξη πριν την
είσοδο της στον καταχωρητή στις περιπτώσεις όμως των άλλων δύο κλειδιών δεν
μπορεί να γίνει η πράξη απευθείας γιατί κάτι τέτοιο θα επηρεάσει τα δεδομένα για το
κλειδί 256. Για το λόγο αυτό προστίθενται δυο νέοι πολυπλέκτες που έχουν σαν
είσοδους τα μετασχηματισμένα δεδομένα της πρώτης λέξης και τη μετασχηματισμένη
λέξη του επόμενου καταχωρητή (Εικόνα 4. 24). Τέλος μια σημαντική προσθήκη για την
περίπτωση της επέκτασης του κλειδιού των 256 bits είναι ο μετασχηματισμός SubWord
που πρέπει να πραγματοποιείται σε κάθε τέταρτη λέξη. Αυτό επιτυγχάνεται με την
είσοδο του μετασχηματισμού που παίρνει σαν είσοδο τα δεδομένα του πέμπτου
πολυπλέκτη και ενός επιπλέον πολυπλέκτη που δίνει σαν έξοδο είτε τα
μετασχηματισμένα δεδομένα (για 256 bits κλειδί) ή τα δεδομένα του τρίτου
πολυπλέκτη (για κλειδιά 128 και 192).
Η διαδικασία επαναλαμβάνεται για όσους γύρους απαιτείται και ελέγχεται κάθε φορά
από τη μονάδα ελέγχου, με τα αποτελέσματα να αποθηκεύονται σε κάθε γύρο σε
καταχωρητές μήκους 32 bits. Τα δεδομένα των καταχωρητών οδηγούνται κάθε φορά
σε 14 καταχωρητες μήκους 128 bits που θα αποτελέσουν και τα κλειδιά γύρου. Η
μονάδα ελέγχου πέρα από τα κατάλληλα σήματα για τη σωστή λειτουργία της
επέκτασης, είναι υπεύθυνη και σε ποιόν από τους 14 καταχωρητές θα αποθηκεύονται
τα δεδομένα κάθε φορά.
Παράδειγμα εξομοίωσης
Μεταγλώτιση σχεδίου
Quartus II Version 7.2 Build 203 02/05/2008 SP 2 SJ Full Version
Top-level Entity Name KeyExpansion
Family Cyclone II
Device EP2C35F672C6
Total logic elements 8.126 / 33.216 (24%)
Total combinational functions 7.903 / 33.216(24%)
Dedicated logic registers 3.832 / 33.216(12%)
Total registers 3.382
Total pins 392 / 475 (83%)
Total memory bits 0 / 483.840 (0%)
Embedded Multiplier 9-bit elements 0 / 70 (0%)
Total PLLs 0 / 4 (0%)
Timing Models Final
117
Για την επιβεβαίωση της ορθής λειτουργίας της επέκτασης του κάθε κλειδιού θα
ελέγξουμε τα κλειδιά που δίνονται στο Fips-197.
Κλειδί: 2b7e151628aed2a6abf7158809cf4f3c
Κλειδί: 8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b
118
Επέκταση κλειδιού 256 bits
Κλειδί: 603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4
Η μονάδα ελέγχου όπως έχουμε αναφέρει είναι υπεύθυνη για τη σωστή λειτουργία του
κυκλώματος κρυπτογράφησης και για τη σωστή έξοδο των κλειδιών γύρων. Για την
περίπτωση της υλοποίησης των τριών αλγορίθμων αναπτύχθηκαν τρεις μονάδες
ελέγχου, μια για τον AES-128, μια για τον AES-192 και μια για τον AES-256. Η λογική και
ο τρόπος λειτουργίας της είναι ακριβώς ίδια με την υλοποίηση της μονάδας ελέγχου
στον αλγόριθμο AES-128. Αποτελεί, δηλαδή έναν μετρητή που απαριθμεί ως το 10 (AES-
128), 12 (AES-192) και 14 (AES-256) δίνοντας ως έξοδο τα κατάλληλα σήματα. Η μόνη
προσθήκη που έχει πραγματοποιηθεί είναι μια είσοδος ενεργοποίησης Start όπου όταν
έχει την τιμή “1” δίνει τις κατάλληλες τιμές στα σήματα εξόδου και όταν έχει την τιμή
“0” μηδενίζει τις εξόδους. Έτσι από κάθε μεμονωμένη μονάδα ελέγχου παίρνουμε κάθε
φορά όλα τα σήματα (Sel, En, stop, key_sel, count). Τα σήματα αυτά της κάθε μονάδας
γίνονται xor με τα αντίστοιχα σήματα των άλλων μονάδων και οδηγούνται στο
υπόλοιπο κύκλωμα. Με αυτόν τον τρόπο όταν είναι ενεργή μια από τις τρεις μονάδες
μόνο τα δικά της σήματα θα οδηγηθούν στο κύκλωμα καθώς τα σήματα από τις άλλες
μονάδες θα είναι “0”.
119
4.4.2.3 AES-128/192/256 υλοποίηση και εξομοίωση
Όπως και στην περίπτωση του AES-128 οι τρείς συνδυάζονται κατάλληλα και
υλοποιούν το πλήρες κύκλωμα για την κρυπτογράφηση και αποκρυπτογράφηση των
δεδομένων. Στον Πίνακα 4. 9 παρουσιάζονται όλα τα επιμέρους αρχεία που
χρησιμοποιήθηκαν και στην Εικόνα 4. 28 το μπλοκ διάγραμμα του κυκλώματος.
Αρχείο Περιγραφή
key_pack.vhd Αρχείο που περιλαμβάνει τα τμήματα που
χρησιμοποιούνται για το κλειδί
pack_for_all.vhd Αρχείο που περιλαμβάνει όλα τα τμήματα που
χρησιμοποιούνται
mux_clk.vhd Πολυπλέκτης 2 σε 1 που διατηρεί τα δεδομένα
mux_nbits.vhd Πολυπλέκτης 2 σε 1 μεταβλητού μήκους εισόδου
mux3in1.vhd Πολυπλέκτης 3 σε 1 μεταβλητού μήκους εισόδου
reg_nbits.vhd Καταχωρητής μεταβλητού μήκους εισόδου
ControlKey.vhd Μονάδα ελέγχου που με κατάλληλα σήματα ενεργοποιεί
τις απαραίτητες ενέργειες
KeyExpansion.vhd Αρχείο που υλοποιεί την επέκταση κλειδιού
counter_128.vhd Μονάδα ελέγχου για αλγόριθμο AES-128
counter_192.vhd Μονάδα ελέγχου για αλγόριθμο AES-192
counter_256.vhd Μονάδα ελέγχου για αλγόριθμο AES-256
ShiftRows.vhd Μετάθεση των 128 bits
InvShiftRows.vhd Αντίστροφη μετάθεση των 128 bits
SubBytes.vhd Μετασχηματισμός ενός byte με μη-γραμμική
αντικατάσταση
SubBytes128.vhd Συνδυασμός του SubByte μετασχηματισμού για υλοποίηση
σε 128 bits
InvSubBytes.vhd Αντίστροφος μετασχηματισμός ενός byte με μη-γραμμική
αντικατάσταση
InvSubBytes128.vhd Συνδυασμός του InvSubByte μετασχηματισμού για
υλοποίηση σε 128 bits
x_time.vhd Υλοποίηση πολλαπλασιασμού {02}16 με πολυώνυμο.
x_time4.vhd Υλοποίηση πολλαπλασιασμού {04}16 με πολυώνυμο.
MixColumn_Inv32.vhd Πολλαπλασιασμός στο πεπερασμένο πεδίο GF(28) με
δεδομένο πολυώνυμο. Η υλοποίηση εφαρμόζει και τον
κανονικό μετασχηματισμό MixColumn και τον αντίστροφο
InvMixColumn για 32 bits δεδομένα
InvMixColumn128.vhd Συνδυασμός του MixColumn_Inv32 μετασχηματισμού για
υλοποίηση σε 128 bits
AES_128_192_256.vhd Αρχείο που πραγματοποιεί την κατάλληλη συνδεσμολογία
και υλοποιεί τον πλήρη αλγόριθμο
120
Εικόνα 4. 28 Κύκλωμα AES_128_192_256.
121
Η διαδικασία κρυπτογράφησης/αποκρυπτογράφησης είναι εφάμιλλη αυτής του
αλγορίθμου AES-128, το αρχικό κείμενο εισέρχεται στο κύκλωμα μαζί με το κλειδί και
τον τύπο του αλγορίθμου που θα χρησιμοποιηθεί (algorithm). Το bit newkey
σηματοδοτεί την έναρξη για την παραγωγή των κλειδιών και ο συνδυασμός της
εισόδου algorithm (algorithm(1), algorithm(0)) ενεργοποιεί την κατάλληλη μονάδα
ελέγχου για να δοθούν τα σωστά σήματα στο κυρίως σώμα του αλγορίθμου και στην
επέκταση κλειδιού. Η διαδικασία επαναλαμβάνεται για όσους γύρους χρειάζεται
μέχρις ότου δοθούν τα κατάλληλα σήματα όπου σταματάει και εξάγει το τελικό
κρυπτοκείμενο.
Παράδειγμα εξομοίωσης
Για την υλοποίηση του κυκλώματος που υποστηρίζει και τους τρείς αλγορίθμους
ταυτόχρονα χρησιμοποιήθηκε το CYCLONE III EP3C120F780C8 FPGA και αυτό γιατί
οι 475 ακροδέκτες του CYCLONE II EP2C35F672C6 FPGA δεν ήταν αρκετοί καθώς
πλέον χρειαζόμαστε 256 ακροδέκτες για το κλειδί 128 ακροδέκτες για το αρχικό
κείμενο και 128 ακροδέκτες για το κρυπτοκείμενο, δηλαδή περισσότερους από 512
ακροδέκτες. Όπως φαίνεται και στον Πίνακα 4. 10 το κύκλωμα χρησιμοποιεί 12.192
λογικά στοιχεία (10% των διαθέσιμων για το συγκεκριμένο FPGA) 3.993
καταχωρητές (3%) και 521 ακροδέκτες (98%) και με μέγιστη συχνότητα ρολογιού
στα 25,73 MHz. Παρατηρούμε πως ο αλγόριθμος καταλαμβάνει ένα πολύ μικρό μέρος
των διαθέσιμων πόρων του συγκεκριμένου συστήματος αλλά σχεδόν όλους τους
διαθέσιμους ακροδέκτες. Ίσως χρησιμοποιώντας έναν διαφορετικό τρόπο στον
χειρισμό των δεδομένων να μπορούσαμε να ελαττώσουμε τον αριθμό των
ακροδεκτών και να μπορούσαμε να χρησιμοποιήσουμε ένα μικρότερο FPGA, όμως στα
πλαίσια της ερευνητικής εργασίας κάτι τέτοιο δεν ήταν αναγκαίο.
Μεταγλώτιση σχεδίου
Quartus II Version 7.2 Build 203 02/05/2008 SP 2 SJ Full Version
Top-level Entity Name AES_128_192_256
Family Cyclone III
Device EP3C120F780C8
Total logic elements 12.192 / 119.088 (10%)
Total combinational functions 11.704 / 119.088(10%)
Dedicated logic registers 3.993/ 119.088 (3%)
Total registers 3.993
Total pins 521 / 532 (98%)
Total memory bits 0 / 3.981.312 (0%)
Embedded Multiplier 9-bit elements 0 / 576 (0%)
Total PLLs 0 / 4 (0%)
Timing Models Final
122
Εικόνα 4. 29 Λογικά στοιχεία που χρησιμοποιούνται.
Στην Εικόνα 4. 29 φαίνονται ο χώρος που καταλαμβάνει ο αλγόριθμος στο FPGA και
στην Εικόνα 4. 30 το κύκλωμα που δημιουργεί το Quartus II για την υλοποίηση του.
Για την εξομοίωση του αλγορίθμου σε υλικό και για τον έλεγχο του θα
χρησιμοποιήσουμε τα δεδομένα που δίνονται στο Fips-197 (Πίνακας 4. 11).
123
Εικόνα 4. 30 RTL σχηματικό AES_128_192_256.
124
Αποτελέσματα εξομοίωσης
AES-128
Στην Εικόνα 4. 31 παρατηρούμε πως έχουν δοθεί οι επιλογές algorithm “0” για να
χρησιμοποιηθεί ο AES-128 και Operation “0” για να γίνει κρυπτογράφηση. Στην
Εικόνα 4. 32 η είσοδος Operation παίρνει την τιμή “1” για αποκρυπτογράφηση και σαν
κείμενο δίνεται το κρυπτοκείμενο.
125
AES-192
Στην Εικόνα 4. 33 παρατηρούμε πως έχουν δοθεί οι επιλογές algorithm “2” για να
χρησιμοποιηθεί ο AES-192 και Operation “0” για να γίνει κρυπτογράφηση. Στην
Εικόνα 4. 34 η είσοδος Operation παίρνει την τιμή “1” για αποκρυπτογράφηση και σαν
κείμενο δίνεται το κρυπτοκείμενο.
126
AES-256
Στην Εικόνα 4. 35 παρατηρούμε πως έχουν δοθεί οι επιλογές algorithm “3” για τον
AES-192 και Operation “0” για να γίνει κρυπτογράφηση. Στην Εικόνα 4. 36 η είσοδος
Operation παίρνει την τιμή “1” για αποκρυπτογράφηση και σαν κείμενο δίνεται το
κρυπτοκείμενο.
127
128
5.Συμπεράσματα
Στη παρούσα εργασία ασχοληθήκαμε με την επιστήμη της κρυπτογραφίας και την
εξέλιξη της στο πέρασμα των αιώνων. Είδαμε τις μεθόδους που χρησιμοποιήθηκαν
από τις πρώτες εφαρμογές της ως τη σύγχρονη κρυπτογραφία. Παρουσιάστηκαν
διάφοροι αλγόριθμοι κρυπτογράφησης και δόθηκε ιδιαίτερη έμφαση στους
συμμετρικούς αλγορίθμους και ιδιαίτερα στον αλγόριθμο AES που ήταν και το κυρίως
θέμα της εργασίας. Είδαμε αναλυτικά τον τρόπο με τον οποίο ο αλγόριθμος
κρυπτογραφεί και αποκρυπτογραφεί τα δεδομένα και τους μετασχηματισμούς που
χρησιμοποιεί σε κάθε διαδικασία.
Στη συνέχεια έγινε μια προσπάθεια για υλοποίηση του αλγορίθμου τόσο σε επίπεδο
λογισμικού όσο και σε επίπεδο υλικού, παρουσιάζοντας κάθε φορά τα πλεονεκτήματα
και τα μειονεκτήματα της εκάστοτε μεθόδου. Αναπτύχθηκε ένα πρόγραμμα σε C++
και σε επέκταση του αναρτήθηκε στο διαδίκτυο, στο οποίο εισάγοντας τα επιθυμητά
δεδομένα και ένα κλειδί κρυπτογράφησης μπορεί κάποιος να δει τη διαδικασία και τα
ενδιάμεσα βήματα που χρησιμοποιεί ο αλγόριθμος. Στη συνέχεια είδαμε την
υλοποίηση του αλγορίθμου σε υλικό. Χρησιμοποιώντας το σχεδιαστικό εργαλείο
Quartus II αναπτύχθηκαν δύο κυκλώματα σε επίπεδο εξομοίωσης στα οποία δίνοντας
τις επιθυμητές επιλογές και εισόδους πραγματοποιούνταν η κρυπτογράφηση και
αποκρυπτογράφηση των δεδομένων.
129
130
Αναφορές
4. AES Calculator
http://www.unsw.adfa.edu.au/~lpb/src/AEScalc/AEScalc.html
6. “Κρυπτογραφία”,
http://el.wikipedia.org/wiki/%CE%9A%CF%81%CF%85%CF%80%CF%84%CE
%BF%CE%B3%CF%81%CE%B1%CF%86%CE%AF%CE%B1
13. Bruce Schneier, “Applied Cryptography” 2η έκδοση, John Wiley & Sons, 1996
15. Wenbo Mao, “Modern Cryptography: Theory and Practice”, Prentice Hall, 2003
17. William Stallings, “Cryptography and Network Security: Principles and Practice”
4η έκδοση, Prentice Hall, 2005
131
18. Nigel Smart, “Cryptography: An Introduction” 3η έκδοση, Mcgraw-Hill College,
2002
28. P.R. Chodowiec, “Comparison of the Hardware Performance of the AES Candidates
Using Reconfigurable Hardware”, 2002
29. A.J Elbirt, W. Yip, B. Chetwynd, C. Paar, “An FPGA-Based Performance Evaluation
of the AES Block Cipher Candidate Algorithm Finalists”, The Third Advance
Encryption Standard (AES3) Candidate Conference, 2000
33. R. R. Rachh, P.V.Ananda Mohan, B.S. Anami, “Efficient Implementations for AES
Encryption and Decryption”, Springer Science & Business Media, LLC 2012
34. X. Zhang, K. K. Parhi, “High-Speed VLSI Architectures for the AES Algorithm IEEE
Transactions on Very Large Scale Integration(VLSI) Systems, Vol.12, No. 9, 2004
132
35. M.C. Libertatori, J.C. Bonadero, “AES-128 Chipher. Minimum Area, Low Cost FPGA
Implementation”, 2007
36. T. Good, M. Benaissa, “AES on FPGA from the Fastest to the Smallest”, Springer,
2005
133
134
Παράρτημα Α
Αρχείο SBoxes.cpp
135
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0,
0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07,
0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60,
0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F,
0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5,
0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B,
0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55,
0x21, 0x0C, 0x7D};
unsigned char RCon [11]= { 0x00, 0x01, 0x02, 0x04,0x08, 0x10, 0x20,
0x40,0x80, 0x1b, 0x36};
AES.cpp
#include "Sboxes.cpp"
#include <iostream>
int col_num=length/4;
int col_num=length/4;
int length=4*col_num;
136
void printmatrix (unsigned char print[4][4]){
a = RotWord_in[0];
for(int i=0;i<3;i++)
RotWord_in[i] = RotWord_in[i + 1];
RotWord_in[3] = a;
return RotWord_in[4];
}
if (j%Nk == 0)
{
RotWord(temp);
SubWord(temp) ;
temp [0]= temp[0] ^ RCon[j/Nk];
137
for (int i=0; i<4; ++i)
extendedkey[i][j] = extendedkey[i][j - Nk]^temp[i];}
else
for (int i=0; i<4; ++i)
extendedkey[i][j] = extendedkey[i][j - Nk]^extendedkey[i][j - 1];
}
}
out[0] = multiply(0x02,in[0])^multiply(0x03,in[1])^in[2]^in[3];
out[1] = in[0]^multiply(0x02,in[1])^multiply(0x03,in[2])^in[3];
out[2] = in[0]^in[1]^multiply(0x02,in[2])^multiply(0x03,in[3]);
out[3] = multiply(0x03,in[0])^in[1]^in[2]^multiply(0x02,in[3]);
138
for (int i=0; i<4; i++)
state[i][j]=out[i];
}
}
SubBytes(state);
cout<<"SubBytes ("<<Nr<<") : "; printmatrix (state);
ShiftRows(state);
cout<<"ShiftRows ("<<Nr<<") : "; printmatrix (state);
SetRoundKey(Nr);
cout<<"Round Key ("<<Nr<<") : "; printmatrix(roundkey);
AddRoundKey(state,roundkey);
cout<<"Add Round ("<<Nr<<") : "; printmatrix (state);
}
139
out[0] =
multiply(0x0e,in[0])^multiply(0x0b,in[1])^multiply(0x0d,in[2])^mult
iply(0x09,in[3]);
out[1] =
multiply(0x09,in[0])^multiply(0x0e,in[1])^multiply(0x0b,in[2])^mult
iply(0x0d,in[3]);
out[2] =
multiply(0x0d,in[0])^multiply(0x09,in[1])^multiply(0x0e,in[2])^mult
iply(0x0b,in[3]);
out[3] =
multiply(0x0b,in[0])^multiply(0x0d,in[1])^multiply(0x09,in[2])^mult
iply(0x0e,in[3]);
140
for (int i=0; i<16; i++) {
plaintext[i] = input[i];
}
cout<<"\n";}
count=0;
k = getchar();
while ( k != 0x0a) {
input[count] = k;
++count;
k = getchar(); }
}
for(int i=count;i<32;i++){
input[i]=0;
key[i]=0;}
for (int i=0; i<count; i++){
key[i] = input[i];
}
cout<<"\n"<<"\n";
}
int main ()
{
cout<<"Encryption/Decryption with AES algorithm\n\n";
switch (select){
case '1':
Nk=4; Nb=4; Nr=10; /*gia AES-128*/
break;
case '2':
Nk=6; Nb=4; Nr=12; /*gia AES-192*/
break;
case '3':
Nk=8; Nb=4; Nr=14; /*gia AES-256*/
break;
141
}
Nw=Nb*(Nr+1);
input_text();
input_key();
vec2mat(plaintext,16,state);
vec2mat_key(key,Nk*4,Key);
cout<<"Text in Hex:\n";
printmatrix(state);
cout<<"Key in Hex:\n";
for (int i=0; i<sizeof Key/sizeof Key[0]; ++i)
{ for (int j=0; j<Nk; ++j)
printf("%02x ", Key[i][j]);
cout << '\n';} cout << '\n';
KeyExpansion(Key);
Encryption(state,roundkey);
cout<<"Encrypted Text in Hex\n";
printmatrix (state);
mat2vec(state,4,arr);
cout<<"Encrypted Text\n";
system("pause");
}
142
void checkinput(char *str2,int length){
for (i=0,j=0;i<length;i++){
if (str2[i]=='%'){
h1=switch_hex(str2[i+1]);
h2=switch_hex(str2[i+2]);
ak[j]=((16*h1)+h2);
j++;i=i+2;
count2++;
}
else{
ak[j]=str2[i];
j++;
count3++;}
}
}
143
for (int i=1,j=0; i<(strlen(in)+(strlen(in)/2)); i++){
if (i%3==0)
out[i]='%';
else {
out[i]=in[j];
j++;}
}
}
int main()
{
int ContentLength = 0,test;
char PostString[1024] =
"Type=HEX&key=133457799BBCDFF164777261666C6F66&message=0123456789AB
CDEF&Algorithm=TDEA&Operation=ENCRYPT";
string DataString = "";
string KeyString = "";
string MessageString = "";
string AlgorithmString = "";
string OperationString = "";
string TypeString = "";
enum ALGORITHM {DES, TDEA, AES_128,AES_192,AES_256,
UNKNOWN_ALGORITHM};
ALGORITHM algorithm = DES;
enum OPERATION {ENCRYPT, DECRYPT,FULL,UNKNOWN_OPERATION};
OPERATION operation = ENCRYPT;
enum TYPE {ASCII, HEX, UNKNOWN_TYPE};
TYPE type = ASCII;
144
MessageString = DataString.substr(MessageStart, MessageEnd-
MessageStart);
test=KeyString.copy(charKey2,96,0);
test=MessageString.copy(str2,48,0);
if (TypeString =="ASCII"){
checkstringkey(charKey2,charKey);
key_str=(unsigned char*)charKey;
checkstringstr(str2,str);
mesg_str=(unsigned char*)str;}
addpercent(str2,chartemp);
for (i=0; i<strlen(chartemp); i++)
str2[i]=chartemp[i];
checkstringkey(charKey2,charKey);
key_str=(unsigned char*)charKey;
checkstringstr(str2,str);
mesg_str=(unsigned char*)str;}
if (OperationString == "ENCRYPT")
operant = 'E';
145
else if (OperationString == "DECRYPT")
operant = 'D';
else if (OperationString == "FULL")
operant='A';
if (AlgorithmString == "DES"){
choise='1';
MyDES(choise, operant,charKey,str);
}
else if (AlgorithmString == "TDEA"){
choise='2';
MyDES(choise, operant,charKey,str);
}
else if (AlgorithmString == "AES_128"){
myselect='1';
MyAES(myselect,operant,key_str,mesg_str);
}
else if (AlgorithmString == "AES_192"){
myselect='2';
MyAES(myselect,operant,key_str,mesg_str);
}
else if (AlgorithmString == "AES_256"){
myselect='3';
MyAES(myselect,operant,key_str,mesg_str);
}
else
cout << "No input";
}
146
Παράρτημα Β
Στο σημείο αυτό δίνεται ο κώδικας VHDL για την υλοποίηση του αλγορίθμου. Αρχικά
δίνεται ο κώδικας για τα βασικά τμήματα που καλούνται από τα κύρια κυκλώματα
και έπειτα οι υλοποιήσεις των AES-128, AES_128_192_256.
Βασικά τμήματα
Καταχωρητής
library ieee;
use ieee.std_logic_1164.all;
entity reg_nbits is
generic (n:integer :=32);
port( input_reg : in std_logic_vector(n-1 downto
0);
Clk,load : in std_logic;
output_reg : buffer std_logic_vector(n-1
downto 0));
end reg_nbits;
Πολυπλέκτες
library ieee;
use ieee.std_logic_1164.all;
entity mux_nbits is
generic (n: integer :=32);
port(
L_in,R_in :in std_logic_vector(n-1 downto 0);
En,sel :in std_logic;
mux_out :out std_logic_vector(n-1 downto 0));
end entity;
if En='1' then
if sel='0' then mux_out <=L_in;
147
else mux_out <=R_in;
end if;
else mux_out<=(others =>'0');
end if;
end process;
end;
library ieee;
use ieee.std_logic_1164.all;
entity mux_clk is
generic (n: integer :=32);
port(
L_in,R_in :in std_logic_vector(n-1 downto 0);
En,sel,Clk :in std_logic;
mux_out :out std_logic_vector(n-1 downto 0));
end entity;
library ieee;
use ieee.std_logic_1164.all;
entity mux3in1 is
generic (n: integer :=128);
port(
MC,IMC,last_round :in std_logic_vector(n-1 downto 0);
En :in std_logic;
sel :in std_logic_vector(1 downto 0);
mux_out :out std_logic_vector(n-1 downto 0));
end entity;
148
Μετασχηματισμός SubBytes για ένα byte
library ieee;
use ieee.std_logic_1164.all;
entity SubBytes is
generic (n : integer :=8);
port ( x :in std_logic_vector(n-1 downto 0);
t :out std_logic_vector(n-1 downto 0));
end entity;
begin
q(3) <= (x(7)and(x(5) xor x(4) xor x(1) xor x(0))) xor (x(6)and
(x(5) xor x(4) xor x(2) xor x(1))) xor (x(5) and (x(4) xor x(2) xor
x(1) xor x(0))) xor (x(4)and(x(2)xor x(1))) xor ((x(3)) and(x(2)xor
x(1)))xor(x(2)and x(1));
q(2) <= (x(7)and(x(6) xor x(5) xor x(3) xor x(2) xor x(0)))xor
(x(6)and(x(5) xor x(3) xor x(2) xor x(1) xor x(0)))xor
(x(5)and(x(3) xor x(2)))xor (x(4)and(x(3) xor x(2)xor x(0)))xor
(x(3)and(x(2) xor x(0)))xor((x(2) xor x(1))and x(0));
q(1) <= (x(7)and(x(5) xor x(2) xor x(0) xor '1'))xor (x(6)and(x(5)
xor x(3)))xor (x(5)and(x(4) xor x(3) xor x(2) xor x(0) xor '1'))xor
(x(4)and(x(2) xor '1'))xor (x(3)and(x(2) xor x(0)))xor
(x(2)and(x(1) xor x(0) xor '1'))xor x(1);
q(0) <= (x(7)and(x(6) xor x(4) xor x(0)))xor (x(6)and(x(5) xor x(4)
xor x(3) xor x(1) xor '1'))xor (x(5)and(x(3) xor x(0) xor '1'))xor
(x(4)and(x(3) xor x(1)))xor (x(3)and(x(2) xor x(1) xor x(0) xor
'1'))xor((x(2) xor x(1))and x(0)) xor(x(0) xor x(2));
y(3) <= q(3) xor (q(3)and q(2)and q(1)) xor (q(3)and q(0)) xor
q(2);
y(1) <= q(3) xor (q(3)and q(2)and q(1))xor (q(3)and q(1)and q(0))
xor q(2) xor (q(2)and q(0)) xor q(1);
y(0) <= (q(3)and q(2)and q(1)) xor (q(3)and q(2)and q(0)) xor
(q(3)and q(1)) xor (q(3)and q(1)and q(0)) xor (q(3)and q(0)) xor
q(2) xor (q(2)and q(1))xor (q(2)and q(1)and q(0)) xor q(1) xor
q(0);
t(7) <= (y(3)and(x(7) xor x(6) xor x(4) xor x(0)))xor (y(2)and(x(5)
xor x(4) xor x(3) xor x(0)))xor (y(1)and (x(5) xor x(4) xor x(3)
xor x(2) xor x(1)))xor (y(0)and(x(7) xor x(2) xor x(1)));
149
t(6) <= (y(3)and(x(7) xor x(6) xor x(4)))xor (y(2)and(x(7) xor x(5)
xor x(1)))xor (y(1)and(x(6) xor x(5) xor x(4)))xor (y(0)and(x(6)
xor x(5) xor x(4) xor x(3) xor x(2)))xor '1';
t(5) <= (y(3)and(x(7) xor x(6) xor x(5) xor x(2)))xor (y(2)and(x(7)
xor x(5) xor x(0)))xor (y(1)and(x(4) xor x(3)))xor (y(0)and(x(7)
xor x(6) xor x(5)))xor '1';
t(4) <= (y(3)and(x(6) xor x(5) xor x(2)))xor (y(2)and(x(7) xor x(6)
xor x(5) xor x(3) xor x(2)))xor (y(1)and(x(5) xor x(4) xor x(3) xor
x(2) xor x(1) xor x(0)))xor (y(0)and(x(4) xor x(3) xor x(2) xor
x(0)));
t(3) <= (y(3)and(x(7) xor x(6) xor x(5) xor x(4) xor x(3) xor x(2)
xor x(1)))xor (y(2)and(x(7) xor x(6) xor x(5) xor x(3) xor x(2) xor
x(0)))xor (y(1)and(x(7) xor x(3) xor x(1) xor x(0)))xor
(y(0)and(x(6) xor x(4) xor x(1) xor x(0)));
t(2) <= (y(3)and(x(5) xor x(2) xor x(1) xor x(0)))xor (y(2)and(x(7)
xor x(6) xor x(5) xor x(4) xor x(3) xor x(2) xor x(0)))xor
(y(1)and(x(7) xor x(5) xor x(4)))xor (y(0)and(x(4) xor x(2) xor
x(1) xor x(0)));
t(1) <= (y(3)and(x(6) xor x(4) xor x(3) xor x(1)))xor (y(2)and(x(6)
xor x(5) xor x(3) xor x(1)))xor (y(1)and x(7))xor (y(0)and(x(6) xor
x(3) xor x(2) xor x(0)))xor '1';
t(0) <= (y(3)and(x(7) xor x(3) xor x(2) xor x(1)))xor (y(2)and(x(7)
xor x(4) xor x(0)))xor (y(1)and(x(6) xor x(4) xor x(2) xor
x(0)))xor (y(0)and(x(5) xor x(3) xor x(2) xor x(0)))xor '1';
end architecture;
library ieee;
use ieee.std_logic_1164.all;
entity InvSubBytes is
generic (n : integer :=8);
port ( x :in std_logic_vector(n-1 downto 0);
t :out std_logic_vector(n-1 downto 0));
end entity;
begin
q(3) <=(x(7) and (x(4) xor x(1) xor x(0))) xor (x(6) and (x(4)
xor x(2) xor x(0))) xor (x(5) and (x(4) xor x(3))) xor (x(4) and
(x(2) xor x(1)))xor x(4) xor (x(3) and (x(1) xor x(0))) xor (x(2)
and (x(1)xor x(0)))xor (x(0));
q(2) <=(x(7) and (x(5) xor x(2) xor x(1) xor x(0)))xor x(7)xor
(x(6) and (x(5) xor x(4)))xor x(6) xor (x(4) and (x(2) xor
x(1)))xor x(4)xor (x(3) and x(1))
150
xor (x(1) and (x(0)))xor x(1)xor (x(0)) xor '1';
q(1) <=(x(7) and (x(4) xor x(2) xor x(0) xor x(1)))xor x(7) xor
(x(6) and (x(5) xor x(4) xor x(2) xor x(1)))xor x(6) xor (x(5) and
(x(3) xor x(1)xor x(0)))xor x(5) xor (x(4) and (x(2)))xor x(4)xor
(x(3) and (x(2) xor x(0)))xor (x(2)) xor (x(1)) xor (x(0));
q(0) <=(x(7) and (x(4) xor x(0))) xor (x(6) and (x(5) xor x(4)
xor x(1))) xor (x(5) and x(4)) xor (x(4) and (x(3) xor x(2) xor
x(1))) xor x(4) xor (x(3) and (x(2) xor x(0))) xor x(3) xor (x(1)
and x(0)) xor '1';
y(3) <= q(3) xor (q(3)and q(2)and q(1)) xor (q(3)and q(0)) xor
q(2);
y(1) <= q(3) xor (q(3)and q(2)and q(1))xor (q(3)and q(1)and q(0))
xor q(2) xor (q(2)and q(0)) xor q(1);
y(0) <= (q(3)and q(2)and q(1)) xor (q(3)and q(2)and q(0)) xor
(q(3)and q(1)) xor (q(3)and q(1)and q(0)) xor (q(3)and q(0)) xor
q(2) xor (q(2)and q(1))xor (q(2)and q(1)and q(0)) xor q(1) xor
q(0);
151
t(1)<=(y(3)and(x(7)xor x(6)xor x(2)xor x(1)))
xor(y(2)and(x(7)xor x(6)xor x(3)xor x(2)xor x(1)xor x(0)xor
'1'))
xor(y(1)and(x(5)xor x(4)xor x(3)xor '1'))
xor(y(0)and(x(6)xor x(3) xor x(0)));
end structural;
library ieee;
use ieee.std_logic_1164.all;
entity SubBytes128 is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end entity;
component SubBytes is
generic (n : integer :=8);
port ( x :in std_logic_vector(n-1 downto 0);
t :out std_logic_vector(n-1 downto 0));
end component;
begin
152
g13:SubBytes generic map(n=>8)port map(state_in(31 downto
24),state_out(31 downto 24));
g14:SubBytes generic map(n=>8)port map(state_in(23 downto
16),state_out(23 downto 16));
g15:SubBytes generic map(n=>8)port map(state_in(15 downto
8),state_out(15 downto 8));
g16:SubBytes generic map(n=>8)port map(state_in(7 downto
0),state_out(7 downto 0));
end struc;
library ieee;
use ieee.std_logic_1164.all;
entity InvSubBytes128 is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end entity;
component InvSubBytes is
generic (n : integer :=8);
port ( x :in std_logic_vector(n-1 downto 0);
t :out std_logic_vector(n-1 downto 0));
end component;
begin
153
g14:InvSubBytes generic map(n=>8)port map(state_in(23 downto
16),state_out(23 downto 16));
g15:InvSubBytes generic map(n=>8)port map(state_in(15 downto
8),state_out(15 downto 8));
g16:InvSubBytes generic map(n=>8)port map(state_in(7 downto
0),state_out(7 downto 0));
end struc;
Μετασχηματισμός ShiftRows
library ieee;
use ieee.std_logic_1164.all;
entity ShiftRows is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end entity;
end struc;
Μετασχηματισμός InvShiftRows
library ieee;
use ieee.std_logic_1164.all;
entity InvShiftRows is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end entity;
end struc;
154
Πολλαπλασιασμός XTime
library ieee;
use ieee.std_logic_1164.all;
entity x_time is
end entity;
begin
output<=(input(6)&input(5)&input(4)&(input(3)xor input(7))
&(input(2)xor input(7))
& input(1)
&(input(0)xor input(7))&input(7));
end;
library ieee;
use ieee.std_logic_1164.all;
entity x_time4 is
end entity;
begin
output<=(input(5)&input(4)&(input(3)xor input(7))
&(input(2)xor (input(6)xor input(7)))
&(input(1)xor input(6))
&(input(0)xor input(7))
&(input(6)xor input(7))
&input(6));
end;
library ieee;
use ieee.std_logic_1164.all;
package xtime_pack is
component x_time is
port (input :in std_logic_vector(7 downto 0);
output :out std_logic_vector(7 downto 0));
end component;
component x_time4 is
port (input :in std_logic_vector(7 downto 0);
output :out std_logic_vector(7 downto 0));
end component;
end xtime_pack;
155
Μετασχηματισμός Inv/MixColumns για 32 bits
library ieee;
use ieee.std_logic_1164.all;
use work.xtime_pack.all;
entity MixColumn_Inv32 is
generic(n:integer :=32);
port( state_in :in std_logic_vector(n-1 downto 0);
state_out,inv_state_out :out std_logic_vector(n-1 downto 0));
end entity;
begin
--Xwrizetai se 4 bytes
S3<=state_in(7 downto 0);
S2<=state_in(15 downto 8);
S1<=state_in(23 downto 16);
S0<=state_in(31 downto 24);
--Gia MixColumns
e0:x_time port map(S0 xor S1,x0);
Sout3<=x0 xor S2 xor S3 xor S1;
state_out(31 downto 24)<=Sout3;
--Gia InvMixColumns
d00:x_time4 port map(S0 xor S2,y1);
d01:x_time4 port map(S1 xor S3,y2);
d02:x_time port map(y1 xor y2,invx1);
library ieee;
use ieee.std_logic_1164.all;
use work.xtime_pack.all;
156
entity InvMixColumn128 is
generic(n:integer :=128);
port( state_in :in std_logic_vector(n-1 downto 0);
state_out,inv_state_out :out std_logic_vector(n-1 downto 0));
end entity;
component MixColumn_Inv32 is
generic(n:integer :=32);
port( state_in :in std_logic_vector(n-1 downto 0);
state_out,inv_state_out :out std_logic_vector(n-1 downto 0));
end component;
begin
end struc;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ControlKey is
port(newkey,Clk :in std_logic;
sel,En :out std_logic;
ld :out std_logic_vector(10 downto 0);
Rcon :buffer std_logic_vector(7 downto 0));
end entity;
begin
process (newkey)
begin
if (newkey='1') then
sel<='0';
En<='1';
count<=0;
ld<=(others=>'0');
Rcon<=X"01";
else
if rising_edge(Clk) then
ld(0)<='1';
ld(1)<='1';
157
sel<='1';
count<=count+1;
ld(count+1)<='1';
Rcon<=Rcon+Rcon;
if (count=7) then
Rcon<=X"1b";
elsif (count=8) then
Rcon<=X"36";
elsif (count>8) then
Rcon<=X"00";
end if;
end if;
end if;
end process;
end behavioural;
library ieee;
use ieee.std_logic_1164.all;
package key_pack is
component reg_nbits is
generic (n:integer :=32);
port( input_reg : in std_logic_vector(n-1 downto
0);
Clk,load : in std_logic;
output_reg : buffer std_logic_vector(n-1
downto 0));
end component;
component mux_nbits is
generic (n: integer :=32);
port(
L_in,R_in :in std_logic_vector(n-1 downto 0);
En,sel :in std_logic;
mux_out :out std_logic_vector(n-1 downto 0));
end component;
component SubBytes is
generic (n : integer :=8);
port ( x :in std_logic_vector(n-1 downto 0);
t :out std_logic_vector(n-1 downto 0));
end component;
component ControlKey is
port(newkey,Clk :in std_logic;
sel,En :out std_logic;
ld :out std_logic_vector(10 downto 0);
Rcon :buffer std_logic_vector(7 downto 0));
end component;
end key_pack;
158
Επέκταση κλειδιού
library ieee;
use ieee.std_logic_1164.all;
use work.key_pack.all;
entity KeyExpansion is
generic (n: integer :=128);
port ( key_in :in std_logic_vector(n-1 downto 0);
newkey,Clk :in std_logic;
round :in std_logic_vector(3 downto 0);
key :out std_logic_vector(n-1 downto 0));
end entity;
begin
control:ControlKey port
map(newkey,Clk,mux_sel,mux_En,load_reg,Rcon);
159
reg32_0:reg_nbits generic map(n=>32)port
map(reg_in0,Clk,'1',reg_to_mux0);
reg32_1:reg_nbits generic map(n=>32)port
map(reg_in1,Clk,'1',reg_to_mux1);
reg32_2:reg_nbits generic map(n=>32)port
map(reg_in2,Clk,'1',reg_to_mux2);
reg32_3:reg_nbits generic map(n=>32)port
map(reg_in3,Clk,'1',reg_to_mux3);
process(round,Clk)
begin
if (round="0000") then key<=rkey_0;
elsif (round="0001") then key<=rkey_1;
elsif (round="0010") then key<=rkey_2;
elsif (round="0011") then key<=rkey_3;
elsif (round="0100") then key<=rkey_4;
elsif (round="0101") then key<=rkey_5;
elsif (round="0110") then key<=rkey_6;
elsif (round="0111") then key<=rkey_7;
elsif (round="1000") then key<=rkey_8;
elsif (round="1001") then key<=rkey_9;
elsif (round="1010") then key<=rkey_10;
end if;
end process;
end structural;
160
Μονάδα ελέγχου
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter is
generic (n:integer :=4);
port(Clk,Res,U_D : in std_logic;
Sel,En,stop,key_sel : out std_logic;
count : out std_logic_vector (n-1 downto 0));
end entity;
Sel<='1';
if U_D='1' then
key_sel<=not ene;
161
else key_sel<=U_D;
end if;
En<=ene;
count<=sgn;
end process;
end behavioral;
library ieee;
use ieee.std_logic_1164.all;
package pack_for_all is
component reg_nbits is
generic (n:integer :=32);
port( input_reg : in std_logic_vector(n-1 downto
0);
Clk,load : in std_logic;
output_reg : buffer std_logic_vector(n-1
downto 0));
end component;
component mux_nbits is
generic (n: integer :=32);
port(
L_in,R_in :in std_logic_vector(n-1 downto 0);
En,sel :in std_logic;
mux_out :out std_logic_vector(n-1 downto 0));
end component;
component mux3in1 is
generic (n: integer :=128);
port(
MC,IMC,last_round :in std_logic_vector(n-1 downto 0);
En :in std_logic;
sel :in std_logic_vector(1 downto 0);
mux_out :out std_logic_vector(n-1 downto 0));
end component;
component SubBytes is
generic (n : integer :=8);
port ( x :in std_logic_vector(n-1 downto 0);
t :out std_logic_vector(n-1 downto 0));
end component;
component ControlKey is
port(newkey,Clk :in std_logic;
sel,En :out std_logic;
ld :out std_logic_vector(10 downto 0);
Rcon :buffer std_logic_vector(7 downto 0));
end component;
component x_time is
port (input :in std_logic_vector(7 downto 0);
output :out std_logic_vector(7 downto 0));
end component;
component x_time4 is
162
port (input :in std_logic_vector(7 downto 0);
output :out std_logic_vector(7 downto 0));
end component;
component MixColumn_Inv32 is
generic(n:integer :=32);
port( state_in :in std_logic_vector(n-1 downto
0);
state_out,inv_state_out :out std_logic_vector(n-1
downto 0));
end component;
component InvMixColumn128 is
generic(n:integer :=128);
port( state_in :in std_logic_vector(n-1 downto
0);
state_out,inv_state_out :out std_logic_vector(n-1
downto 0));
end component;
component ShiftRows is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end component;
component InvShiftRows is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end component;
component SubBytes128 is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end component;
component InvSubBytes128 is
generic (n : integer :=128);
port ( state_in :in std_logic_vector(n-1 downto 0);
state_out :out std_logic_vector(n-1 downto 0));
end component;
component KeyExpansion is
generic (n: integer :=128);
port ( key_in :in std_logic_vector(n-1 downto 0);
newkey,Clk :in std_logic;
round :in std_logic_vector(3 downto 0);
key :out std_logic_vector(n-1 downto 0));
end component;
component counter is
generic (n:integer :=4);
port(Clk,Res, U_D : in std_logic;
Sel,En,stop,key_sel : out std_logic;
count : out std_logic_vector (n-1
downto 0));
end component;
163
component mux_clk is
generic (n: integer :=32);
port(
L_in,R_in :in std_logic_vector(n-1 downto 0);
En,sel,Clk :in std_logic;
mux_out :out std_logic_vector(n-1 downto 0));
end component;
end pack_for_all;
AES128
library ieee;
use ieee.std_logic_1164.all;
use work.pack_for_all.all;
entity AES128 is
generic(n:integer :=128);
port( KEY,plaintext :in std_logic_vector(n-1 downto 0);
Clk,Operation,newkey :in std_logic;
Rnd :out std_logic_vector(3 downto 0);
ciphertext :out std_logic_vector(n-1 downto 0));
end entity;
begin
count:counter generic map(n=>4)port
map(Clk,newkey,Operation,SEL,En,stop,key_sel,coun);
Operation_KEY<=roundkey;
164
mux_MC:mux3in1 generic map(n=>128)port
map(st_MC,st_IMC,mux_out1,not stop,En&Operation,mux_out2);
rnd<=coun;
ciphertext<=state;
end arc;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ControlKey is
port(newkey,Clk :in std_logic;
KeySel :in std_logic_vector(1 downto 0);
sel,En :out std_logic;
mux_sel :out std_logic_vector(1 downto 0);
ld :out std_logic_vector(14 downto 0);
Rcon :buffer std_logic_vector(7 downto 0));
end entity;
if KeySel="10" then
mux_sel<="00";
ld(0)<='1';
ld(1)<='1';
sel<='1';
165
count<=count+1;
Rcon<=Rcon+Rcon;
if (count=1) then ld(2)<='1';ld(3)<='1';
elsif (count=2) then ld(2)<='1';
elsif (count=3) then ld(4)<='1'; ld(5)<='1';
elsif (count=4) then ld(6)<='1';
elsif (count=5) then ld(7)<='1'; ld(8)<='1';
elsif (count=6) then ld(9)<='1';
elsif (count=7) then ld(10)<='1'; ld(11)<='1';
elsif (count=8) then ld(12)<='1';
end if;
elsif KeySel="11" then
mux_sel<="10";
ld(0)<='1';
ld(1)<='1';
ld(2)<='1';
sel<='1';
count<=count+1;
library ieee;
use ieee.std_logic_1164.all;
use work.key_pack.all;
entity KeyExpansion is
port(key_in :in std_logic_vector(255 downto 0);
newkey,Clk :in std_logic;
key_sel :in std_logic_vector(1 downto 0);
round :in std_logic_vector(3 downto 0);
166
key :out std_logic_vector(127 downto 0));
end entity;
begin
control:ControlKey port
map(newkey,Clk,key_sel,mux_sel,mux_En,muxSel,load_reg,Rcon);
167
subbytes4:SubBytes generic map(n=>8)port map(mux_output4(7 downto
0),sub_out4); --gia AES 256
subbytes5:SubBytes generic map(n=>8)port map(mux_output4(15 downto
8),sub_out5);
subbytes6:SubBytes generic map(n=>8)port map(mux_output4(23 downto
16),sub_out6);
subbytes7:SubBytes generic map(n=>8)port map(mux_output4(31 downto
24),sub_out7);
168
reg32_delay1:reg_nbits generic map(n=>32)port
map(reg_to_mux1,Clk,'1',delay1);
reg32_d0:reg_nbits generic map(n=>32)port
map(mux_output0,Clk,'1',reg0);
reg32_d1:reg_nbits generic map(n=>32)port
map(mux_output1,Clk,'1',reg1);
reg32_d2:reg_nbits generic map(n=>32)port
map(mux_output2,Clk,'1',reg2);
reg32_d3:reg_nbits generic map(n=>32)port
map(mux_output3,Clk,'1',reg3);
reg32_d4:reg_nbits generic map(n=>32)port
map(mux_output4,Clk,'1',reg4);
reg32_d5:reg_nbits generic map(n=>32)port
map(mux_output5,Clk,'1',reg5);
reg32_d6:reg_nbits generic map(n=>32)port
map(mux_output6,Clk,'1',reg6);
reg32_d7:reg_nbits generic map(n=>32)port
map(mux_output7,Clk,'1',reg7);
process (key_sel,round,Clk)
begin
if (key_sel = "10") then
regin0<= key_in(191 downto 64);
169
regin6<=reg_to_mux5®_to_mux4®_to_mux3®_to_mux2;
regin7<=delay1&delay0®_to_mux5®_to_mux4;
regin8<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin9<=reg_to_mux5®_to_mux4®_to_mux3®_to_mux2;
regin10<=delay1&delay0®_to_mux5®_to_mux4;
regin11<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin12<=reg_to_mux5®_to_mux4®_to_mux3®_to_mux2;
end if;
elsif (key_sel = "11") then
regin0<= key_in(255 downto 128);
regin1<=key_in(127 downto 0);
regin2<=reg_to_mux7®_to_mux6®_to_mux5®_to_mux4;
regin3<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin4<=reg_to_mux7®_to_mux6®_to_mux5®_to_mux4;
regin5<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin6<=reg_in7®_in6®_in5®_in4;
regin7<=reg_in3®_in2®_in1®_in0;
regin8<=reg_to_mux7®_to_mux6®_to_mux5®_to_mux4;
regin9<=reg_in3®_in2®_in1®_in0;
regin10<=reg_to_mux7®_to_mux6®_to_mux5®_to_mux4;
regin11<=reg_in3®_in2®_in1®_in0;
regin12<=reg_to_mux7®_to_mux6®_to_mux5®_to_mux4;
regin13<=reg_in3®_in2®_in1®_in0;
regin14<=reg_to_mux7®_to_mux6®_to_mux5®_to_mux4;
else
regin0<= key_in(127 downto 0);
regin1<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin2<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin3<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin4<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin5<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin6<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin7<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin8<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin9<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
regin10<=reg_to_mux3®_to_mux2®_to_mux1®_to_mux0;
end if;
170
Μονάδα ελέγχου 128
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter_128 is
generic (n:integer :=4);
port(Clk,Res,U_D,Start : in std_logic;
Sel,En,stop,key_sel : out std_logic;
count : out std_logic_vector (n-1 downto 0));
end entity;
sele<='1';
if (sgn >= "1001")then ene<='1';
else ene<='0';
end if;
end if;
171
end if;
end if;
if U_D='1' then
ksel<=not ene;
else ksel<=U_D;
end if;
if Start= '1' then
En<=ene;
count<=sgn;
key_sel<=ksel;
Sel<=sele;
stop<=stp;
else
En<='0';
count<="0000";
key_sel<='0';
Sel<='0';
stop<='0';
end if;
end process;
end behavioral;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter_192 is
generic (n:integer :=4);
port(Clk,Res,U_D,Start : in std_logic;
Sel,En,stop,key_sel : out std_logic;
count : out std_logic_vector (n-1 downto 0));
end entity;
172
end if;
if U_D='1' then
ksel<=not ene;
else ksel<=U_D;
end if;
if Start= '1' then
En<=ene;
count<=sgn;
key_sel<=ksel;
Sel<=sele;
stop<=stp;
else
En<='0';
count<="0000";
key_sel<='0';
Sel<='0';
stop<='0';
end if;
end process;
end behavioral;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter_256 is
generic (n:integer :=4);
port(Clk,Res,U_D,Start : in std_logic;
Sel,En,stop,key_sel : out std_logic;
count : out std_logic_vector (n-1 downto 0));
end entity;
architecture behavioral of counter_256 is
173
signal sgn,temp: std_logic_vector((n-1) downto 0);
signal ene,sele,ksel,stp: std_logic;
begin
process(Clk,Res,U_D,Start)
begin
if rising_edge (Clk) then
if U_D ='0' then
if Res = '1' then sgn <= (others =>
'0');sel<='0';ksel<='0';
elsif (sgn <= "1101")then
sgn <= sgn + 1;
sele<='1';
if (sgn >= "1101")then ene<='1';
else ene<='0';
end if;
if U_D='1' then
ksel<=not ene;
else ksel<=U_D;
end if;
En<=ene;
count<=sgn;
key_sel<=ksel;
Sel<=sele;
stop<=stp;
else
En<='0';
count<="0000";
174
key_sel<='0';
Sel<='0';
stop<='0';
end if;
end process;
end behavioral;
AES_128_192_256
library ieee;
use ieee.std_logic_1164.all;
use work.pack_for_all_128_192_256.all;
entity AES_128_192_256 is
port( plaintext :in std_logic_vector(127 downto 0);
KEY :in std_logic_vector(255 downto 0);
Clk,Operation,newkey :in std_logic;
algorithm :in std_logic_vector(1 downto 0);
rnd :out std_logic_vector(3 downto 0);
ciphertext :out std_logic_vector(127 downto 0));
end entity;
begin
count128:counter_128 generic map(n=>4)port
map(Clk,newkey,Operation, not
algorithm(1),SEL_128,En_128,stop_128,key_sel_128,coun_128);
Operation_KEY<=roundkey;
mux_start:mux_clk generic map(n=>128)port map(plaintext xor
Operation_KEY,state ,not En,SEL,Clk,st);
sbox:SubBytes128 generic map(n=>128)port map(st,st_sbox);
175
isbox:InvSubBytes128 generic map(n=>128)port map(st,ist_sbox);
round_key_creation:KeyExpansion port
map(KEY,newkey,Clk,algorithm,coun,roundkey);
end arc;
176
177