ΠΡΟΛΟΓΟΣ. Θα ήθελα να ευχαριστήσω τον Επίκουρο Καθηγητή κ. Σταύρο Π. Δοκουζγιάννη για τις καίριες παρατηρήσεις του σε όλα τα στάδια της εργασίας.

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "ΠΡΟΛΟΓΟΣ. Θα ήθελα να ευχαριστήσω τον Επίκουρο Καθηγητή κ. Σταύρο Π. Δοκουζγιάννη για τις καίριες παρατηρήσεις του σε όλα τα στάδια της εργασίας."

Transcript

1

2 ΠΡΟΛΟΓΟΣ Η παρούσα εργασία έχει ως αντικείμενο την παρουσίαση των κρυπτογραφικών αλγορίθμων DES και AES καθώς και την υλοποίησή τους σε κύκλωμα FPGA. Ο AES είναι ένας από τους αλγορίθμους που χρησιμοποιούνται σήμερα στο διαδίκτυο και στη δημόσια και προσωπική ασφάλεια δεδομένων. Θεωρείται από τους πιο ασφαλείς αλγορίθμους στον τομέα της κρυπτογραφίας. Ο DES ήταν ο προκάτοχος του AES και σήμερα πλέον δε θεωρείται ασφαλής. Η υλοποίησή τους έγινε στην αναπτυξιακή κάρτα της Xilinx ML402 η οποία περιέχει το Virtex-4 FPGA. Η συγκεκριμένη κάρτα έχει πολλά πρωτόκολλα επικοινωνίας με τον έξω κόσμο (όπως USB, RS232, ps2, VGA out κτλ.. ), όμως για την παρούσα εργασία χρησιμοποιήθηκαν μόνο η οθόνη LCD και η θύρα ps2 για πληκτρολόγιο. Ως γλώσσα περιγραφής χρησιμοποιήθηκε η VHDL και ως πρόγραμμα προσομοίωσης και μετάφρασής της σε κύκλωμα, το ISE τις Xilinx. Θα ήθελα να ευχαριστήσω τον Επίκουρο Καθηγητή κ. Σταύρο Π. Δοκουζγιάννη για τις καίριες παρατηρήσεις του σε όλα τα στάδια της εργασίας. Παπαδόπουλος Σταύρος, Οκτώβριος

3 2 Περιεχόμενα Κεφάλαιο 1 - Βασικές έννοιες τις κρυπτογραφίας Ορολογία Χρήσεις κρυπτογραφικών συστημάτων Κατηγορίες κρυπτογραφικών αλγορίθμων Συμμετρικοί αλγόριθμοι Αλγόριθμοι δημοσίου κλειδιού Κρυπτανάλυση Κεφάλαιο 2 - Μαθηματικό υπόβαθρο Θεωρία αριθμών Το σύνολο των ακεραίων Αριθμητική υπολοίπων (modular) Αφηρημένη άλγεβρα Ομάδες (Groups) Δακτύλιοι (Rings) Σώμα (field) Πολυωνυμικοί δακτύλιοι Σώματα Galois και αναπαράσταση πολυωνύμων Αναπαράσταση ομάδων bytes με πολυώνυμα επί του GF( 2 ) Κεφάλαιο 3 - Κρυπτογραφικός αλγόριθμος DES Ιστορικό του DES Βασικά χαρακτηριστικά του αλγόριθμου DES Ακριβής περιγραφή του DES Η διαδικασία κρυπτογράφησης του DES Η διαδικασία αποκρυπτογράφησης του DES Η συνάρτηση f(r i,k i-1 ) Η διαδικασία επέκτασης κλειδιού KS(i,KEY) Triple DES Κεφάλαιο 4 - Κρυπτογραφικός αλγόριθμος AES... 29

4 4.1 Ιστορικό του AES Βασικά χαρακτηριστικά του AES Συναρτήσεις κρυπτογράφησης του AES Η Συνάρτηση SubBytes() Η συνάρτηση ShiftRows() Η συνάρτηση MixColumns() Η συνάρτηση AddRoundKey() Επέκταση κλειδιού Συνάρτηση αποκρυπτογράφησης του AES Η Συνάρτηση InvSubBytes() Η Συνάρτηση InvShiftRows() Η Συνάρτηση InvMixColumns() Η συνάρτηση AddRoundKey() Παράδειγμα κρυπτογράφησης Κεφάλαιο 5 - Αναπτυξιακή κάρτα Xilinx ML Βασικά χαρακτηριστικά της κάρτας ML Λεπτομερής περιγραφή της κάρτας ML Virtex-4 FPGA DDR SDRAM Διαφορική είσοδος και έξοδος ρολογιού με συνδέσεις SMA Υποδοχές ταλαντωτών Ρύθμιση φωτεινότητας και αντίθεσης LCD Διακόπτες DIP LEDS Κουμπιά χρήστη Κουμπί reset Stereo AC97 audio codec Σειριακή θύρα RS Οθόνη LCD 16 χαρακτήρων επί 2 γραμμές

5 14. IIC 4-Kb EEPROM Έξοδος VGA Είσοδοι PS/2 για ποντίκι και πληκτρολόγιο Σύστημα ACE CompactFlash ZBT σύγχρονη SRAM Linear Flash Chips Xilinx XC97144XL CPLD /100/1000 tri-speed Ethernet PHY Ελεγκτής USB με peripheral και host θύρες Xilinx XCF32P Platform Flash συσκευή αποθήκευσης για διαμόρφωση Θύρα διαμόρφωσης JTAG Ενσωματωμένα τροφοδοτικά AC adapter LED ένδειξης παροχής τάσης INIT LED DONE LED Program Switch Διακόπτες επιλογής διεύθυνσης και τρόπου διαμόρφωσης Θέση για μπαταρία Διακόπτης επιλογής διαμόρφωσης (SW12) Αλυσίδα JTAG Κεφάλαιο 6 - Virtex 4 XC4VSX35-FF FPGA Ρολόγια Γενικά για τα ρολόγια του FPGA Γενικά ρολόγια Τοπικά ρολόγια Digital Clock Managers (DCMs) Γενικά Χαρακτηριστικά Πρότυπα DCMs

6 6.2.3 Σύνδεση του DCM με πόρους ρολογιών Phase Matched Clock Dividers (PMCDs) Γενικά χαρακτηριστικά Πρότυπο PMCD Σύνδεση του PMCD με πόρους ρολογιών Block RAM Γενικά χαρακτηριστικά Πρότυπο RAM Τρόποι λειτουργίας εγγραφής Αποφυγή σύγκρουσης Configurable Logic Blocks (CLBs) Εισαγωγή Περιγραφή των CLBs και slices XtremeDSP Γενικά χαρακτηριστικά Πρότυπο DSP OPMODE Λογική κρατούμενων Κεφάλαιο 7 - Ανάλυση του AES σε γλώσσα VHDL Εισαγωγή Περιγραφή του AES_CORE Σήματα εισόδου εξόδου Mode λειτουργίας Update state Update key Output key and state Κρυπτογράφηση Περιγραφή του lcd_psk_interface Σήματα εισόδου εξόδου

7 7.3.2 Είσοδος από το πληκτρολόγιο Η διαδικασία main:process Ρολόι 2 ms Περιγραφή του TOP Σήματα εισόδου εξόδου Προσομοίωση Κεφάλαιο 8 - Ανάλυση του DES σε γλώσσα VHDL Εισαγωγή Περιγραφή του DES_CORE Update key Κρυπτογράφηση Προσομοίωση του TOP Κεφάλαιο 9 - Υλοποίηση-Ανακεφαλαίωση Ανακεφαλαίωση Υλοποίηση Βιβλιογραφία Προσάρτημα Α - Ο AES σε VHDL Α.1 TOP Α.2 AES_CORE Α.3 lcd_psk_interface Προσάρτημα B - Ο DES σε VHDL B.1 TOP B.2 DES_CORE Προσάρτημα Γ - Η οθόνη LCD

8 Κεφάλαιο 1 Βασικές έννοιες τις κρυπτογραφίας 1.1 Ορολογία Ο όρος κρυπτογραφία (Cryptography) προέρχεται από τις ελληνικές λέξεις κρυπτός και γράφω. Αναφέρεται στον επιστημονικό κλάδο που ασχολείται με τη μελέτη των τρόπων με τους οποίους μπορούμε να αποκρύψουμε πληροφορίες, ώστε να μπορούν να διαβαστούν μόνο από συγκεκριμένους χρήστες. Κρυπτογράφηση είναι η διαδικασία μετατροπής ενός μηνύματος σε ακατάληπτη μορφή μέσω κάποιου αλγορίθμου, ώστε να μπορεί να διαβαστεί μόνο από τους νόμιμους παραλήπτες. Οι νόμιμοι παραλήπτες πρέπει να κάνουν την αντίστροφη διαδικασία, δηλαδή αποκρυπτογράφηση, ώστε να μετατρέψουν το κρυπτογραφημένο μήνυμα (cipher text) πίσω στην αρχική του μορφή (plain text). Ο αλγόριθμος που χρησιμοποιείται στη διαδικασία κρυπτογράφησης ονομάζεται κρυπτογραφικός αλγόριθμος. Αυτός ο αλγόριθμος χρησιμοποιεί επίσης και μια μυστική παράμετρο που ονομάζεται κλειδί. Το κλειδί παίζει σημαντικό ρόλο καθώς καθορίζει την έξοδο του αλγορίθμου, και το μέγεθός του καθορίζει την ανθεκτικότητα του κρυπτογραφικού αλγόριθμου. Κρυπτανάλυση είναι η μελέτη των μεθόδων με τους οποίους μπορεί να αποκρυπτογραφηθεί ένα κρυπτογραφημένο μήνυμα, χωρίς τη γνώση του απαραίτητου κλειδιού. 7

9 1.2 Χρήσεις κρυπτογραφικών συστημάτων Μυστικότητα Η προστασία της πληροφορίας από μη εξουσιοδοτημένη πρόσβαση καθώς επίσης και η απόκρυψη ύπαρξης της πληροφορίας Ακεραιότητα Να μπορεί ο εξουσιοδοτημένος παραλήπτης να βεβαιωθεί ότι η πληροφορία δεν έχει αλλοιωθεί η μεταβληθεί από τρίτα μέρη. Αυθεντικοποίηση Να μπορεί ο παραλήπτης να επιβεβαιώσει την πηγή προέλευσης του μηνύματος ώστε ο εισβολέας να μην μπορεί να παριστάνει κάποιον άλλο. Μη απάρνηση Ο αποστολέας να μην μπορεί να αρνηθεί την αποστολή πληροφορίας. 1.3 Κατηγορίες κρυπτογραφικών αλγορίθμων Συμμετρικοί αλγόριθμοι Είναι οι αλγόριθμοι στους οποίους το κλειδί της αποκρυπτογράφησης μπορεί να υπολογιστεί από το κλειδί της κρυπτογράφησης και αντίστροφα. Στους περισσότερους συμμετρικούς αλγορίθμους τα δυο παραπάνω κλειδιά ταυτίζονται. Πρόβλημα αυτών των αλγορίθμων είναι ότι απαιτούν από τον αποστολέα και τον παραλήπτη να συμφωνήσουν σε ένα κλειδί προτού επικοινωνήσουν με ασφάλεια (πρόβλημα διαμοίρασης κλειδιών). Το κλειδί πρέπει να παραμείνει μυστικό γιατί η γνώση του από τρίτο πρόσωπο του δίνει τη δυνατότητα αποκρυπτογράφησης μηνυμάτων. Η κρυπτογράφηση και αποκρυπτογράφηση αντίστοιχα φαίνονται με τις παρακάτω μαθηματικές σχέσεις: k ( ) = και ( ) E M C D C = M k Όπου Ε ο αλγόριθμος κρυπτογράφησης, D ο αλγόριθμος αποκρυπτογράφησης, M το αρχικό κείμενο, C το κρυπτογραφημένο και Κ το κλειδί. Οι συμμετρικοί αλγόριθμοι χωρίζονται σε δυο κατηγορίες, τους αλγορίθμους ροής (stream ciphers) και τους αλγορίθμους τμήματος(block ciphers). Στους αλγορίθμους ροής τα bits του αρχικού κειμένου συνδυάζονται με κάποια ψευδοτυχαία και περιοδική ακολουθία bits, συνήθως με την πράξη xor (exclusive or). Η ψευδοτυχαία ακολουθία παράγεται από μια γεννήτρια κλειδορροής με διάφορες τεχνικές. 8

10 Αλγόριθμοι ροής Για να είναι ασφαλής ένα αλγόριθμος ροής πρέπει η γεννήτρια κλειδορροής να διαθέτει κάποιες ιδιότητες, δηλαδή πρέπει η ακολουθία να έχει μεγάλη περίοδο επανάληψης έτσι ώστε να μην είναι δυνατόν να υπολογιστεί το ακριβές της μέγεθος. Η ακολουθία να είναι όσο το δυνατόν πιο τυχαία, δηλαδή ίδιο περίπου πλήθος 0 και 1. Πρέπει επίσης να μην χρησιμοποιείται το ίδιο κλειδί δυο φορές. Πλεονέκτημα των αλγορίθμων ροής είναι η μεγάλη ταχύτητα κρυπτογράφησης σε hardware και σε software, και αυτό συμβαίνει γιατί η λειτουργία της κρυπτογράφησης είναι πολύ απλή και επιπλέον είναι δυνατή η υλοποίηση ασφαλών γεννητριών κλειδορροής που λειτουργούν σε μεγάλες ταχύτητες. Ενδιαφέρουσα ιδιότητα των αλγορίθμων ροής είναι ότι δεν πολλαπλασιάζουν τα λάθη μετάδοσης. Δηλαδή αν ένα bit του κρυπτογραφημένου κειμένου μεταδοθεί λάθος τότε μετά την αποκρυπτογράφηση ένα μόνο bit του αρχικού κειμένου θα είναι λάθος. Περά από αυτό όμως δεν παρέχουν προστασία εναντία στην μετατροπή του μηνύματος από τρίτους (ακεραιότητα). Δηλαδή μπορεί ένας υποκλοπέας να αλλάξει ένα bit στο κρυπτογραφημένο κείμενο και να ξέρει ότι έτσι αλλάζει μόνο το αντίστοιχο bit του αρχικού μηνύματος Αλγόριθμοι τμήματος Στους αλγορίθμους τμήματος το αρχικό κείμενο χωρίζεται σε τμήματα (blocks) συγκριμένου μήκους n. Το τελικό τμήμα αν είναι απαραίτητο συμπληρώνεται με μηδενικά ώστε να έχει το ίδιο μήκος n. Αυτή η διαδικασία ονομάζεται padding. Κάθε τμήμα αποτελεί, διαδοχικά, είσοδο στον κρυπτογραφικό αλγόριθμο. Για το κάθε τμήμα ο αλγόριθμος παράγει ένα τμήμα ίδιου μεγέθους n, που αποτελεί μέρος του κρυπτογραφημένου κειμένου. 9

11 Το μήκος n των τμημάτων πρέπει να είναι αρκετά μεγάλο ώστε να προλαμβάνονται οι επιθέσεις λεξικού. Διαφορετικά, για μικρό n, ένας κρυπταναλυτής έχοντας ένα ζευγάρι τμημάτων του αρχικού και του αντίστοιχου κρυπτογραφημένου κειμένου μπορεί να κατασκευάσει ένα λεξικό αντιστοιχιών των τμημάτων (blocks) του αρχικού και κρυπτογραφημένου κειμένου, για ένα κλειδί (άγνωστο), οπότε κάποιο κείμενο που παράγεται από το ίδιο κλειδί μπορεί να αποκρυπτογραφηθεί απλά, ψάχνοντας για κάθε τμήμα (block) του αρχικού κειμένου το αντίστοιχό του στο λεξικό. Μειονέκτημα των αλγορίθμων τμήματος είναι ότι επηρεάζονται από τα σφάλματα διάδοσης και είναι πιο αργοί από τους αλγορίθμους ροής. Επίσης κάθε τμήμα κρυπτογραφείται ανεξάρτητα, δηλαδή η κρυπτογράφηση ενός τμήματος δεν επηρεάζεται από την κρυπτογράφηση των υπολοίπων Αλγόριθμοι δημοσίου κλειδιού Οι αλγόριθμοι δημοσίου κλειδιού (ή ασύμμετροι κρυπτογραφικοί αλγόριθμοι) έχουν σχεδιαστεί έτσι ώστε το κλειδί που χρησιμοποιείται στην κρυπτογράφηση να είναι διαφορετικό από αυτό της αποκρυπτογράφησης. Επιπλέον το κλειδί αποκρυπτογράφησης δεν μπορεί να υπολογιστεί (τουλάχιστον μέσα σε ένα εύλογο χρονικό διάστημα) από το κλειδί τις κρυπτογράφησης. Όπως υποδεικνύει και το όνομα τους, το κλειδί τις κρυπτογράφησης είναι δημόσιο, γνωστό σε όλους, και το κλειδί τις αποκρυπτογράφησης ιδιωτικό, γνωστό μόνο σε έναν. Έτσι μπορεί οποιοσδήποτε να κρυπτογραφεί μηνύματα, που αποκρυπτογραφούνται μόνο από αυτόν που έχει το αντίστοιχο ιδιωτικό κλειδί. Η κρυπτογράφηση και αποκρυπτογράφηση αντίστοιχα φαίνονται με τις παρακάτω μαθηματικές σχέσεις: k public ( ) = και k private ( ) E M C D C M = Μπορούν τα δυο κλειδιά να χρησιμοποιηθούν και αντίστροφα, δηλαδή το ιδιωτικό κλειδί για κρυπτογράφηση και το δημόσιο για αποκρυπτογράφηση. Αυτή τους η ιδιότητα χρησιμεύει στις ψηφιακές υπογραφές. Οι αλγόριθμοι δημόσιου κλειδιού λύνουν το πρόβλημα διαμοίρασης κλειδιών που αντιμετωπίζουν οι συμμετρικοί αλγόριθμοι, αλλά για να επιτύχουν το ίδιο επίπεδο ασφάλειας 10

12 είναι πολύ πιο αργοί στην εκτέλεσή τους. Γι αυτό συνήθως χρησιμοποιούνται για ανταλλαγή συμμετρικών κλειδιών και στη συνέχεια η επικοινωνία γίνεται με συμμετρική κρυπτογραφία. 1.4 Κρυπτανάλυση Σκοπός της κρυπτανάλυσης είναι να βρει κάποια αδυναμία στον κρυπτογραφικό αλγόριθμο ώστε να ανακαλύψει το κλειδί ή το αρχικό κείμενο, διαδικασία γνωστή ως επίθεση. Γενικά στην κρυπτογραφία το κλειδί και το αρχικό κείμενο κρατιούνται μυστικά από εισβολείς, αλλά θεωρείται ότι οι εισβολείς έχουν πλήρη πρόσβαση στην επικοινωνία μεταξύ αποστολέα και παραλήπτη. Επιπλέον θεωρείται ότι ο κρυπτογραφικός αλγόριθμος είναι γνωστός. Σύμφωνα με την αρχή του Kerckhoff, «μόνο η μυστικότητα του κλειδιού παρέχει ασφάλεια» ή σύμφωνα με το απόφθεγμα του Shannon, «ο εχθρός γνωρίζει το σύστημα». Τα γενικά είδη επίθεσης είναι: Επίθεση στο κρυπτογραφημένο κείμενο Ο κρυπταναλυτής έχει πρόσβαση σε αρκετά κρυπτογραφημένα μηνύματα και προσπαθεί να βρει το αρχικό κείμενο όσων περισσότερων μπορεί ή ακόμα καλύτερα να βρει το κλειδί. Επίθεση γνωστού αρχικού κειμένου Με κάποιον τρόπο ο κρυπταναλυτής έχει πρόσβαση εκτός από τα κρυπτογραφημένα μηνύματα και στα αντίστοιχα αρχικά κείμενα, και σκοπός του είναι να βρει το κλειδί. Επίθεση επιλεγμένου αρχικού κείμενου Ο κρυπταναλυτής δεν έχει μόνο πρόσβαση στο αρχικό και κρυπτογραφημένο κείμενο, αλλά έχει πρόσβαση και στο σύστημα, διαλέγοντας έτσι το αρχικό κείμενο που θα κρυπτογραφηθεί. Έτσι του δίνεται η επιλογή να διαλέξει κατάλληλο αρχικό κείμενο, το οποίο θα του δώσει περισσότερες πληροφορίες για το κλειδί σε σχέση με κάποιο τυχαίο. Επίθεση επιλεγμένου-προσαρμόσιμου αρχικού κειμένου Είναι μια ειδική περίπτωση τις προηγούμενης επίθεσης. Ο κρυπταναλυτής αντί να επιλέξει από την αρχή ποια αρχικά κείμενα θα κρυπτογραφηθούν, επιλέγει μια μικρή ομάδα κειμένων και στη συνέχεια κάθε επόμενη ομάδα εξαρτάται από το αποτέλεσμα της κρυπτογράφησης της προηγούμενης. 11

13 Επίθεση επιλεγμένου κρυπτογραφημένου κειμένου Ο κρυπταναλυτής διαλέγει το κρυπτογραφημένο κείμενο και έχει πρόσβαση στο αποτέλεσμα της αποκρυπτογράφησης. Αυτή η επίθεση εφαρμόζεται κυρίως στους αλγορίθμους δημοσίου κλειδιού. Επίθεση σχετιζόμενων κλειδιών Ο κρυπταναλυτής έχει πρόσβαση σε αρχικά κείμενα και κρυπτογραφημένα που έχουν προκύψει από την εφαρμογή διαφορετικών κλειδιών, άγνωστων αλλά με γνωστή σχέση μεταξύ τους. Η επιτυχία μιας επίθεσης μπορεί να κατηγοριοποιηθεί ως εξής: Ολικό σπάσιμο (total break). Ο κρυπταναλυτής βρίσκει το κλειδί. Γενικό πόρισμα (global deduction). Ο κρυπταναλυτής βρίσκει έναν αλγόριθμο ισοδύναμο με τον αλγόριθμο αποκρυπτογράφησης, χωρίς να ξέρει το κλειδί. Τοπικό πόρισμα (local deduction). Ο κρυπταναλυτής βρίσκει το απλό κείμενο ενός τμήματος του κρυπτογραφημένου. Πληροφοριακό πόρισμα (information deduction). Ο κρυπταναλυτής βρίσκει κάποιες πληροφορίες για το κλειδί ή για το αρχικό κείμενο. Η επίθεση μπορεί επίσης να κατηγοριοποιηθεί σε σχέση με την πολυπλοκότητά της. Δηλαδή: Υπολογιστική πολυπλοκότητα - ο χρόνος που χρειάζεται για να ολοκληρωθεί μια επίθεση, ή απλά ο αριθμός των πράξεων. Πολυπλοκότητα δεδομένων - η ποσότητα δεδομένων απαραίτητων για την επίθεση. Απαιτήσεις μνήμης - η ποσότητα μνήμης που χρειάζεται για μια επίθεση. Γενικά οι επιθέσεις προσπαθούν να έχουν όσο το δυνατόν μικρότερη πολυπλοκότητα. Μερικές επιθέσεις ανταλλάσσουν ποσότητες πολυπλοκότητας, πχ μπορεί να κερδίζουν ταχύτητα χάνοντας ποσότητες μνήμης. 12

14 Κεφάλαιο 2 Μαθηματικό υπόβαθρο 2.1 Θεωρία αριθμών Το σύνολο των ακεραίων Οι αριθμοί { -2,-1,0,1,2 } απαρτίζουν το σύνολο ακεραίων αριθμών. Το σύνολο *= -{0}, είναι όλοι οι ακέραιοι εκτός από το μηδέν. Έστω δυο αριθμοί α, β є. Λέμε ότι το α διαιρεί το β, ή το α είναι παράγοντας του β, ή το α είναι διαιρέτης του β, όταν υπάρχει c є ώστε β = αc. Έστω δυο ακέραιοι α, β, με α є και β є *, τότε υπάρχουν μοναδικοί αριθμοί q є και r є *, με r<β, ώστε α = qβ + r. To q είναι το πηλίκο της διαίρεσης και το r το υπόλοιπο. Ένας ακέραιος c ονομάζεται κοινός διαιρέτης δυο ακεραίων α και β όταν: «ο c διαιρεί τον α» και «ο c διαιρεί τον β». Ο μέγιστος κοινός διαιρέτης (ΜΚΔ ή gcd) είναι ο μεγαλύτερος από τους κοινούς διαιρέτες. Ένας ακέραιος α>1 ονομάζεται πρώτος όταν οι μόνοι θετικοί διαιρέτες του είναι το 1 και το α. Και σύμφωνα με το θεμελιώδες θεώρημα της αριθμητικής κάθε αριθμός μπορεί να αναλυθεί σε γινόμενο πρώτων αριθμών. Δυο ακέραιοι α, β ονομάζονται σχετικώς πρώτοι όταν ο μέγιστος κοινός διαιρέτης τους είναι το Αριθμητική υπολοίπων (modular) Έστω δυο ακέραιοι αριθμοί a, b. O a ονομάζεται ισοδύναμος στο b modulo n, όταν ο n διαιρεί τον αριθμό (a-b), με αλλάλόγια όταν ο a και b διαιρούμενοι με το n έχουν το ίδιο a b mod n, και έχει τις εξής ιδιότητες: υπόλοιπο. Αυτή η ισοδυναμία γράφεται ως ( ) a a( mod n) ( mod ) ( mod ) a b n b a n 13

15 ( mod ) ( mod ) a b n a c n b c n ( mod ) ( ) ( mod ) ( )( mod ) ( ) a a1 n a+ b a1+ b1 n b b1 mod n ab ( a1b 1) mod n Οι ακέραιοι modulo n, συμβολίζονται ως є n και είναι το σύνολο {0,1,2.,n-1}. Οι πράξεις πρόσθεση, αφαίρεση και πολλαπλασιασμός στο n, εκτελούνται με modulo n. Πχ στο 10 ={1,2,,9} το άθροισμα 5+8=3,δηλαδή 5+8=13 3 (mod 10). Έστω α n, ως αντίστροφος του α, ορίζεται ένας ακέραιος κ n, τέτοιος ώστε ακ 1 (mod n), αν ο κ υπάρχει, τότε είναι μοναδικός, και συμβολίζεται ως Έστω τώρα δυο ακέραιοι α,b n. Η πράξη της διαίρεσης του α με το b στο n ορίζεται ως ο πολλαπλασιασμός του α με το 1 b στο n. 1 a. 2.2 Αφηρημένη άλγεβρα Ομάδες (Groups) Γενικά πράξη επί ενός συνόλου S είναι μια απεικόνιση από το S x S στο S. Μια ομάδα (G,*) αποτελείται από ένα σύνολο G και μια πράξη * στο G, για την οποία πράξη ισχύουν οι εξής ιδιότητες: ( ) ( ) a* b* c = a* b * c abc,, G (προσεταιριστική ιδιότητα) e G : e* a = a* e= a a G (ουδέτερο στοιχείο) = = (αντίστροφο στοιχείο) a G, a G: a* a a * a e Αν επιπλέον ισχύει η επόμενη ιδιότητα τότε η ομάδα G ονομάζεται αβελιανή ομάδα (Abelian Group) a* b= b* a ab, G (αντιμεταθετική ιδιότητα) Πχ το σύνολο των ακεραίων εφοδιασμένο με την πράξη + (πρόσθεση) μας κάνουν την αβελιανή ομάδα (,+), με ουδέτερο στοιχείο το μηδέν και αντίστροφο ενός αριθμού α το α. Μια ομάδα G είναι πεπερασμένη όταν ο αριθμός των στοιχείων της είναι πεπερασμένος. 14

16 2.2.2 Δακτύλιοι (Rings) Δακτύλιος (,+, ), είναι ένα σύνολο R εφοδιασμένο με τις πράξεις, + (πρόσθεση) και (πολλαπλασιασμός), οι οποίες πράξεις ικανοποιούν τις παρακάτω ιδιότητες: (,+) είναι αβελιανή ομάδα με ουδέτερο στοιχείο το μηδέν. ( ) ( ),, a b c = a b c abc R (προσεταιριστική ιδιότητα της πράξης ) Το 1 είναι το ουδέτερο στοιχείο τις πράξης. ( ) ( ) ( ),, a b+ c = a b + a c abc R (επιμεριστική ιδιότητα) Αν επιπλέον ισχύει η αντιμεταθετική ιδιότητα στην πράξη, δηλαδή a b= b a, τότε ο δακτύλιος είναι αντιμεταθετικός. Πχ τα (,+, ) και ( n,+, ) είναι αντιμεταθετικοί δακτύλιοι. Ένα στοιχείο α ενός δακτυλίου R λέγεται αντιστρέψιμο αν υπάρχει στοιχείο β ώστε α β= Σώμα (field) Σώμα είναι ένα σύνολο F {0} εφοδιασμένο με τις πράξεις, + (πρόσθεση) και (πολλαπλασιασμός), για το οποίο ισχύουν οι εξής ιδιότητες: Το (F,+, ) είναι ένας αντιμεταθετικός δακτύλιος. Όλα τα μη μηδενικά στοιχειά του F είναι αντιστρέψιμα. Η χαρακτηριστική ενός σώματος είναι 0 όταν 1 0για κάθε m 1. Αλλιώς η χαρακτηριστική του σώματος είναι το ελάχιστο θετικό m για το οποίο 1= 0. m i= 1 Τάξη μια ομάδας/δακτυλίου/σώματος είναι ο αριθμός των στοιχείων που ανήκουν στην εν λόγω δομή (δεδομένου ότι είναι πεπερασμένα). Πχ το σύνολο των ακεραίων με πράξεις πρόσθεση και πολλαπλασιασμό δεν είναι σώμα γιατί δεν έχουν όλα τα στοιχεία αντίστροφο ως προς τον πολλαπλασιασμό. Ενώ το σύνολο των πραγματικών με πράξεις πρόσθεση και πολλαπλασιασμό είναι σώμα. Το σύνολο n με πράξεις πρόσθεση και πολλαπλασιασμό ως προς modulo n, είναι σώμα μόνο όταν το n είναι πρώτος αριθμός. Αν ισχύει αυτό τότε το n είναι η χαρακτηριστική του σώματος. m i= Πολυωνυμικοί δακτύλιοι Μπορούμε να θεωρήσουμε ένα πολυώνυμο της μορφής: 15

17 n f( x) = ax ax+ a n 1 0 Όπου τα ai R, με R ένας αντιμεταθετικός δακτύλιος. Όλα τα πολυώνυμα της παραπάνω μορφής συμβολίζονται ως R[x]. Οι πράξεις της πρόσθεσης και του πολλαπλασιασμού των πολυωνύμων γίνονται όπως σε όλα τα πολυώνυμα, αλλά οι πράξεις των συντελεστών μεταξύ τους γίνονται στο δακτύλιο. Πχ έστω το 2 [x] και τα πολυώνυμα 3 f( x) = x + x+ 1 και 2 gx ( ) x x = + τότε: 3 2 f( x) + gx ( ) = x+ x+ 1 (η πράξη της πρόσθεσης στο 2 είναι το XOR) f( xgx ) ( ) = x + x + x + x (Επιμεριστική και μετά XOR τους συντελεστές των ίδιων δυνάμεων) Ένα πολυώνυμο f( x) Fx [ ] με βαθμό τουλάχιστον 1, ονομάζεται ανάγωγο (irreducible) αν δεν μπορεί να γραφτεί ως γινόμενο δυο πολυωνύμων στο F[x] με θετικούς βαθμούς. Έστω g(x),h(x) Fx [ ], με h(x) 0, τότε η διαίρεση του g(x) με το h(x) παράγει μοναδικά πολυώνυμα q(x) και r(x) Fx [ ] τέτοια ώστε: g(x) = q(x)h(x) + r(x) Όπου βαθμός του r(x) είναι μικρότερος από τον βαθμό του h(x). Το q(x) είναι το πηλίκο και το r(x) το υπόλοιπο της διαίρεσης. Σε περίπτωση που το υπόλοιπο r(x)=0 τότε λέμε ότι το h(x) διαιρεί το g(x). Δύο πολυώνυμα g(x), h(x) Fx [ ] ονομάζονται ισοδύναμα ως προς modulo f(x), αν διαιρούμενα με το πολυώνυμο f(x) αφήνουν το ίδιο υπόλοιπο. Αυτό γράφεται g(x) h(x) (mod f(x) ). Ισχύουν οι παρακάτω ιδιότητες ( το f(x) είναι ένα ανάγωγο πολυώνυμο στο Fx): [ ] ( ) gx ( ) gx ( ) mo d f( x) ( ) ( ) gx ( ) hx ( ) mo d f( x) hx ( ) gx ( ) mo d f( x) ( ) ( ) gx ( ) hx ( ) mo d f( x) gx ( ) sx ( ) mo d f( x) hx ( ) sx ( ) mo d f( x) ( ) ( ) ( ) ( )( ) ( )( ) gx ( ) g( x) mo d f( x) gx ( ) + hx ( ) g( x) + h( x) mo d f( x) hx ( ) h1( x) mo d f( x) gxhx ( ) ( ) g1( xh ) 1( x) mo d f( x) Σύμφωνα με τα παραπάνω μπορεί το σύνολο Fx [ ] να χωριστεί σε κλάσεις ισοδυναμίας. Κλάση ισοδυναμίας ενός πολυωνύμου gx ( ) Fx [ ], είναι το σύνολο των πολυωνύμων στο Fx [ ] που είναι ισοδύναμα με το gx ( )mo d f( x. ) Όπως είπαμε g(x) = q(x)f(x) + r(x), δηλαδή όλα τα πολυώνυμα της ίδιας κλάσης ισοδυναμίας αφήνουν το ίδιο υπόλοιπο r(x). Και έτσι το 16

18 πολυώνυμο r(x) χρησιμοποιείται ως αντιπρόσωπος της κλάσης ισοδυναμίας που περιέχει το g(x) Σώματα Galois και αναπαράσταση πολυωνύμων Τα σώματα Galois είναι σώματα που περιέχουν πεπερασμένο αριθμό στοιχείων. Τάξη του πεδίου Galois είναι ο αριθμός των στοιχείων του. Αν ένα σώμα F είναι σώμα Galois τότε περιέχει γράφεται GF( GF( Το GF( m p στοιχεία, όπου p είναι ένας πρώτος αριθμός και το m 1. Το πεδίο αυτό m p ). Η χαρακτηριστική του είναι το p και η τάξη του το m p ) περιέχει ως υποσύνολο το p. m p. Επιπλέον το m p ) μπορεί να αναπαρασταθεί με πολυώνυμα ως εξής: Έστω f(x) p ανάγωγο πολυώνυμο βαθμού m, και τα πολυώνυμα που ανήκουν στο GF( m p ) έχουν σταθερές που ανήκουν στο p και βαθμό μικρότερο του m. Τότε οι πράξεις μεταξύ συντελεστών εκτελούνται στο p και στο τελικό πολυώνυμο εκτελείται η πράξη modulo f(x). Σημείωση: ο πολλαπλασιασμός modulo μεταξύ πολυωνύμων συμβολίζεται με, ενώ με συμβολίζεται η πράξη της πρόσθεσης στο 2 δηλαδή το XOR. Επίσης μέσα σε αγκύλες συμβολίζεται το δεκαεξαδικό σύστημα (πχ {5Α}). Πχ στο GF( 2 8 ) έστω ανάγωγο πολυώνυμο το: mx x x x x ( ) = Πρόσθεση: ( 1) ( 1) x + x + x + x+ x + x+ = x + x + x + x (δηλαδή x XOR x=0 και 1 XOR 1 =0) Πολλαπλασιασμός: ( x + x + x + x+ 1) ( x + x+ 1) = ( ) ( ) ( ) x x x x x x x x x x x x x x x x x x x x x x x mod( ) = mod( ) = + x + 1 Επιπλέον τα πολυώνυμα του GF( 2 8 ) μπορούν να αναπαρασταθούν ως bytes και αντίστροφα. Δηλαδή το byte bbbbbbbb , αναπαριστά το πολυώνυμο bx + bx + bx + bx + bx + bx + bx+ b. Πχ το πολυώνυμο το byte x x x x αναπαριστά Πολλαπλασιασμός με x στο GF( 2 8 ) : 17

19 ( ) ( ) ( ) bx x= bx + bx + bx + bx + bx + bx + bx+ b x= bx bx bx bx bx bx bx bx mod mx ( ) Αν το b 7 = 0 τότε δεν χρειάζεται modulo, όμως αν b 7 = 1 τότε το modulo επιτυγχάνεται με την πράξη XOR μεταξύ bx ( ) [ ] bx ( ) x= bx ( ) x mx ( ) xκαι m(x). Δηλαδή: Σε ένα byte αυτό αντιστοιχεί με μετατόπιση κατά αριστερά και εκτέλεση της πράξης XOR με το {1b} (δεκαεξαδικό). Αυτή η διαδικασία συμβολίζεται ως xtime(). Πολλαπλασιασμός με μεγαλύτερες δυνάμεις του x μπορεί να υλοποιηθεί με επαναλαμβανόμενες χρήσεις του xtime(). Πχ {57} {13} = { fe} γιατί: {57} {02} = xtime({57}) = { ae} ( ) {57} {04} = xtime xtime({57}) = xtime({ ae}) = {47} ( ( )) {57} {08} = xtime xtime xtime({57}) = {8 e} ( ( ( ))) {57} {10} = xtime xtime xtime xtime({57}) = {07} Άρα, ( ) {57} {13} = {57} {01} {02} {10} = {57} { ae} {07} = { fe} Αναπαράσταση ομάδων bytes με πολυώνυμα επί του GF( 2 8 ) Στον AES εμφανίζονται διανύσματα από 4 bytes τα οποία αναπαρίστανται επί ενός πολυώνυμου 3 ου βαθμού ως εξής: a( x) = ax + ax + ax+ a με ai GF 8 (2 ) Δηλαδή τα a i είναι bytes, και οι πράξεις μεταξύ τους γίνονται στο GF( 2 8 ) όπως έχουν οριστεί παραπάνω. Έστω ένα δεύτερο πολυώνυμο b( x) = bx + bx + bx+ b Πρόσθεση:

20 3 2 ( ) ( ) ( ) ( ) bx ( ) + ax ( ) = a b x + a b x + a b x+ a b Ο πολλαπλασιασμός επιτυγχάνεται σε δυο βήματα. Πρώτα βρίσκουμε το πολυώνυμο: cx ( ) = ax ( ) bx ( ) = cx + cx + cx + cx + cx + cx+ c Όπου c = a b c = a b a b c = a b a b a b c = a b a b a b a b c = a b a b a b c = a b a b c = a b Στο δεύτερο βήμα, επειδή το πολυώνυμο c(x) δεν αναπαριστά ένα διάνυσμα 4 ων byte, πρέπει να εκτελέσουμε την πράξη c(x)modulo(ένα πολυώνυμο βαθμού 4). Στον αλγόριθμο AES το πολυώνυμο αυτό είναι το 4 x + 1. Το αποτέλεσμα προκύπτει: ( ) 4 ax ( ) bx ( ) = ax ( ) bx ( ) mo d x( + 1) = d( x) = dx + dx + dx+ d Όπου ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) d = a b a b a b a b d = a b a b a b a b d = a b a b a b a b d = a b a b a b a b Όταν το a(x) είναι ένα σταθερό πολυώνυμο (όπως και είναι στον AES) τότε έχουμε απλά: d0 a0 a3 a2 a1 b0 d 1 a1 a0 a3 a 2 b 1 = d 2 a2 a1 a0 a 3 b 2 d a a a a b

21 Επειδή το πολυώνυμο 4 x + 1 δεν είναι ανάγωγο στο GF( 8 2 ), ο πολλαπλασιασμός των παραπάνω πολυωνύμων δεν είναι απαραίτητα αντιστρέψιμος. Όμως στον AES το σταθερό πολυώνυμο α(x) έχει οριστεί έτσι ώστε να έχει αντίστροφο α 1 (x). Είναι δηλαδή: ax x x x 3 2 ( ) = {03} + {01} + {01} + {02} a ( x) = {0 bx } + {0 dx } + {09} x+ {0 e} 20

22 Κεφάλαιο 3 Κρυπτογραφικός αλγόριθμος DES 3.1 Ιστορικό του DES Ο DES επιλέχτηκε από την National Bureau of Standards (σήμερα λέγεται NIST, National Institute of Standards and Technology) το 1976 ως πρότυπος κρυπτογραφικός αλγόριθμος των ΗΠΑ. Ο DES δεν είναι σήμερα ασφαλής αλγόριθμος, καθώς το 1999 κατάφεραν να τον σπάσουν σε 22 ώρες και 15 λεπτά. Μια μορφή του αλγορίθμου περισσότερο ασφαλής ήταν ο Triple DES. Τελικά το 2000 αντικαταστάθηκε από τον AES. 3.2 Βασικά χαρακτηριστικά του αλγόριθμου DES Σχήμα

23 Ο αλγόριθμος DES είναι ένας αλγόριθμος τμήματος 64-bit, με μέγεθος κλειδιού 64 bit (το χρήσιμο μέρος του κλειδιού είναι 56 bit). Από αυτό το κλειδί μέσω της διαδικασίας επέκτασης κλειδιού KS(i,KEY), δημιουργούνται 16 υποκλειδιά Κ 1.Κ 16. Το αρχικό block περνάει από έναν πίνακα αντιμεταθέσεων IP στην αρχή, μετά σε μια πολύπλοκη διαδικασία, και τέλος περνάει από τον πίνακα αντιμεταθέσεων IP -1. Η πολύπλοκη διαδικασία είναι η εξής: Το block 64-bit χωρίζεται σε 2 block των 32 bit, το αριστερό L 0, και το δεξί R 0. Μετά το R i και το κλειδί γύρου Κ i-1 μέσω μια συνάρτησης f(r i,k i-1 ) γίνεται το L i+1 και το L i γίνεται το R i+1, για i=0 15 δηλαδή 16 φορές. Ο αλγόριθμος DES φαίνεται συνοπτικά στο σχήμα 3.1. Από εδώ και πέρα θα χρησιμοποιείται ο εξής συμβολισμός: Αν έχουμε δυο block L,R, μπορούμε να σχηματίσουμε το block LR, το οποίο είναι απλά το block με τα bits του L ακολουθούμενα από τα bits του R. 3.3 Ακριβής περιγραφή του DES Η διαδικασία κρυπτογράφησης του DES Τα 64 bits του block περνούν από ένα πινάκα αντιμεταθέσεων IP ο οποίος είναι ο παρακάτω Ο πίνακας IP δείχνει την σειρά των bits εξόδου, δηλαδή το πρώτο bit του block εξόδου είναι το 58 ο bit του block εισόδου, το δεύτερο το 50 ο και το τελευταίο το 7 ο. Ο πινάκας IP -1 είναι ο παρακάτω και χρησιμοποιείται με τον ίδιο τρόπο. 22

24 Το block 64-bit χωρίζεται σε δυο block 32 bit L και R. Τα 16 κλειδιά γύρου, Κ 1.Κ 16, υπολογίζονται από τη διαδικασία επέκτασης κλειδιού KS(i,KEY), και έχουν μέγεθος 48 bits το καθένα. Στον κάθε γύρο γίνεται το εξής: R i+ 1 Li + 1 = Ri για 0 i 15 = Li f ( Ri, Ki+ 1) { Ki = KS( i, KEY )} για 1 i 16 Όπου είναι η πράξη XOR Η διαδικασία αποκρυπτογράφησης του DES Η διαδικασία αποκρυπτογράφησης είναι σχεδόν ίδια με τη διαδικασία κρυπτογράφησης. Η μόνη διαφορά είναι ότι τα κλειδιά εφαρμόζονται με την αντίθετη φορά από ότι στην κρυπτογράφηση. Όλα τα άλλα είναι ίδια, ακόμα και οι πινάκες. Δηλαδή στον πρώτο γύρο αντί για το K 1, εφαρμόζεται το Κ 16 κτλ Η συνάρτηση f(r i,k i-1 ) Παρακάτω φαίνεται σχηματικά ο τρόπος λειτουργίας της f(r i,k i-1 ). Ο πινάκας επιλογής E δέχεται ως είσοδο ένα block 32 bit και παράγει ένα block 48 bits. 23

25 Δηλαδή το πρώτο bit εξόδου είναι το 32 ο bit εισόδου, το δεύτερο είναι το 1 ο bit εισόδου. Και το τελευταίο είναι το 1 ο bit εισόδου. Μετά εκτελείται η πράξη XOR μεταξύ του κλειδιού γύρου Κ και του εκτεταμένου block R. Το αποτέλεσμα 48 bits χωρίζεται με την σειρά bits, σε 8 ομάδες των 6 bits, και αυτές οι ομάδες γίνονται είσοδος για τις συναρτήσεις επιλογής S 1,S 2,.,S 8. Οι συναρτήσεις S 1,S 2,.,S 8, δέχονται η κάθε μια είσοδο των 6 bits, και παράγουν έξοδο των 4 bits. Το αποτέλεσμα της κάθε μιας εξαρτάται από τον πίνακά της. Για την S 1 έχουμε Έστω B το block 6 bits. Το S1(B) είναι το εξής: Το πρώτο και το τελευταίο bit σχηματίζουν έναν αριθμό από το 0 ως το 3, έστω i. Τα 4 μεσαία bits που περισσεύουν σχηματίζουν έναν αριθμό από το 0 ως το 15, έστω j. Βλέπουμε στον πίνακα την i γραμμή j στήλη ποιο στοιχείο περιέχει και αυτό είναι το S1(B). Πχ έστω B= Τότε i=01 2 =1 10 και j= = Άρα 1 η γραμμή και 13 η στήλη είναι το στοιχείο S1(B)=5. Ο πίνακας P είναι ένας πίνακας αντιμεταθέσεων. Δέχεται είσοδο των 32 bit και αντιμεταθέτει τα bit ώστε να παράγει έξοδο 32 bits. 24

26 Η έξοδος P(L), έχει ως πρώτο bit το 16 ο bit του L, ως δεύτερο το 7 ο bit του L,.. και ως τελευταίο το 25 ο bit του L. Οι υπόλοιποι πινάκες S i είναι οι εξής: 25

27 3.3.4 Η διαδικασία επέκτασης κλειδιού KS(i,KEY) Η διαδικασία επέκτασης κλειδιού KS(i,KEY), δέχεται ως είσοδο το κλειδί KEY μήκους 56 bits και παράγει 16 κλειδιά K 1,K 2,,K 16 μήκους 48 bits το κάθε ένα. Η συνοπτική διαδικασία φαίνεται στο παρακάτω σχήμα. 26

28 Καταρχήν το κλειδί μέσω του πίνακα PC-1 χωρίζεται σε δυο μέρη το C 0 και το D 0, μήκους 28 bits το καθένα. Ο πίνακας PC-1 φαίνεται παρακάτω. Χωρίζεται σε δυο μέρη, το πάνω μισό και το κάτω μισό. Το πάνω μισό καθορίζει τα bits του C 0 και το κάτω τα bits του D 0, ως εξής: το πρώτο bit του C 0 είναι το 57 ο bit του κλειδιού KEY, το δεύτερο το 49 ο bit του κλειδιού... και το τελευταίο bit του C 0 είναι το 36 ο bit του κλειδιού, αντίστοιχα το πρώτο bit του D 0 είναι το 63 ο bit του κλειδιού και το τελευταίο το 4 ο bit του κλειδιού KEY. 27

29 Τα C n, D n υπολογίζονται από τα C n-1,d n-1, για n=1,2 16, με κάποιο αριθμό αριστερών ολισθήσεων ανάλογα με το n. Τα πρώτα bit πηγαίνουν στην τελευταία θέση, δηλαδή τα bit 1001 μετά από μια αριστερή ολίσθηση γίνονται n Θέσεις ολίσθησης Πχ τα C 3,D 3 (n=3) υπολογίζονται από τα C 2,D 2 κάνοντας δυο αριστερές ολισθήσεις των bits. Από τα C n,d n μέσω του πινάκα PC-2 προκύπτει το K n.ο πίνακας PC-2 φαίνεται παρακάτω. Έτσι το πρώτο bit του K n είναι το 14 ο bit του C n D n, το δεύτερο το 17 ο bit.και το τελευταίο (48 ο bit) είναι το 32 ο bit του C n D n. 3.4 Triple DES Ο αλγόριθμος Triple DES είναι μια πιο ασφαλής μορφή του DES. Χρειάζεται τρία κλειδιά Κ1,Κ2,Κ3. Για την κρυπτογράφηση, κάνουμε πρώτα κρυπτογράφηση DES με το κλειδί K1, μετά ό,τι προκύπτει αποκρυπτογράφηση DES με το κλειδί K2 και τέλος κρυπτογράφηση DES με το κλειδί K3. Για την αποκρυπτογράφηση κάνουμε το αντίθετο, πρώτα αποκρυπτογράφηση DES με το κλειδί K3, μετά ό,τι προκύπτει κρυπτογράφηση DES με το κλειδί K2 και τέλος αποκρυπτογράφηση DES με το κλειδί K1. Κρυπτογράφηση Triple DES Αποκρυπτογράφηση Triple DES 28

30 Κεφάλαιο 4 Ο κρυπτογραφικός αλγόριθμος AES 4.1 Ιστορικό του AES Στις 2 Ιανουαρίου 1997, το Εθνικό Ινστιτούτο Προτύπων & Τεχνολογίας των ΗΠΑ (National Institute of Standards and Technology, NIST), ανακοίνωσε ότι ήθελε να ορίσει το διάδοχο του DES, ο οποίος θα ονομαζόταν AES. Έτσι προκήρυξε διεθνή διαγωνισμό, όπου έλαβαν μέρος 15 διαγωνιζόμενοι. Ο αλγόριθμος θα έπρεπε να είναι αλγόριθμος τμήματος, με τμήμα των 128 bits, να υποστηρίζει κλειδιά 128, 192, 256 bits, και να είναι σχετικά απλή η υλοποίηση του σε λογισμικό και υλικό. Οι 15 αλγόριθμοι που αναπτύχθηκαν από διαφορές χώρες ήταν οι εξής: CAST-256, CRYPTON, DEAL, DFC, E2, FROG, HPC, LOKI97, MAGENTA, MARS, RC6, Rijndael, SAFER+, Serpent, and Twofish. Το NIST διεξήγαγε 2 συνέδρια αξιολόγησης, το πρώτο τον Αύγουστο του 1998, στο οποίο απορρίφτηκαν 5 αλγόριθμοι, και το δεύτερο τον Μάρτιο του 1999, στο οποίο απορρίφτηκαν άλλοι 5. Έτσι οι τελικοί διαγωνιζόμενοι ήταν οι εξής 5: MARS, RC6, Rijndael, Serpent, και Twofish. Τελικά στις 2 Οκτωβρίου 2000 ανακοινώθηκε ότι ο νικητής είναι ο αλγόριθμος Rijndael. 4.2 Βασικά χαρακτηριστικά του AES Ο AES είναι ένας επαναληπτικός αλγόριθμος τμήματος. Στον AES το μέγεθος του τμήματος (block) είναι 128 bits και αναπαριστάται ως ένας πινάκας 4x4 bytes (=16 bytes=128 bits), δηλαδή από N b =4 λέξεις (στήλες) των 32 bit. Το μήκος του κλειδιού μπορεί να είναι 128, 198 ή 256 bits, δηλαδή N k =4, 6 ή 8 λέξεις (στήλες) των 32 bit. Ο αριθμός των γύρων (επαναλήψεων) του AES εξαρτάται από το μέγεθος του κλειδιού, δηλαδή: 29

31 Μέγεθος κλειδιού (Ν κ λέξεις των 32 bit) Αριθμός γύρων (Ν r ) Μέγεθος τμήματος (Ν b λέξεις των 32 bit) AES AES AES Η διαδικασία κρυπτογράφησης φαίνεται συνοπτικά στην παρακάτω εικόνα 30

32 4.3 Συναρτήσεις κρυπτογράφησης του AES Ο AES για την διαδικασία κρυπτογράφησης, χρησιμοποιεί 4 κρυπτογραφικές συναρτήσεις οι οποίες εφαρμόζονται σε κάθε γύρο, με μια σειρά, στο διάνυσμα κατάστασης. Το διάνυσμα κατάστασης είναι το ενδιάμεσο κρυπτοκείμενο που προκύπτει από την εφαρμογή κάθε συνάρτησης. Η γενική δομή του αλγορίθμου κρυπτογράφησης φαίνεται παρακάτω σε ψευδοκώδικα: Όπως φαίνεται όλοι οι γύροι είναι ίδιοι, εκτός από τον τελευταίο στον οποίο δεν περιέχεται η συνάρτηση MixColumns(). Η κατάσταση στην αρχή ορίζεται ως ο πινάκας 4x4 bytes (=1 τμήμα=16 bytes) του αρχικού κειμένου, και σταδιακά αλλάζει όπου στο τέλος γίνεται ένα τμήμα του κρυπτογραφημένου κειμένου. Ο αλγόριθμος χρησιμοποιεί διαφορετικό κλειδί σε κάθε γύρο, το οποίο ονομάζεται κλειδί γύρου, και υπολογίζεται από το αρχικό κλειδί μέσω της διαδικασίας επέκτασης κλειδιού, συνολικά θέλουμε N r +1 κλειδιά Η Συνάρτηση SubBytes() Η συνάρτηση SubBytes() είναι μια μη γραμμική αντικατάσταση byte, και ενεργεί ανεξάρτητα στο κάθε byte του διανύσματος κατάστασης. Έστω bbbbbbbb το byte εισόδου, τότε το i bit του byte ' b εξόδου είναι b = b b b b b c ' i i ( i+ 4)mod8 ( i+ 5)mod8 ( i+ 6)mod8 ( i+ 7)mod8 i Όπου 0 i < 8και c i το i bit του byte c = {63} (16) = { } (2) Όλα τα παραπάνω φαίνονται και σε μορφή πινάκα: 31

33 b b = ' 0 0 ' b b1 1 ' b b 2 2 ' b b 3 3 ' b b 4 4 ' b b 5 5 ' b b 6 6 ' b b 7 7 Η επίδραση του SubBytes στην κατάσταση φαίνεται παρακάτω: Για τον εύκολο υπολογισμό της SubBytes υπάρχει πίνακας σε δεκαεξαδική μορφή ο οποίος φαίνεται παρακάτω και χρησιμοποιείται ως εξής: έστω είσοδος το byte {5a} τότε x=5 και y=a άρα έχουμε έξοδο {be} 32

34 4.3.2 Η συνάρτηση ShiftRows() Όπως είπαμε το διάνυσμα κατάστασης είναι ένα πίνακας 4x4 bytes. Η συνάρτηση ShiftRows() ενεργεί επί κάθε γραμμής ξεχωριστά. Είναι ουσιαστικά μια ολίσθηση των bytes κατά κάποια byte αριστερά ως εξής: Γραμμή πίνακα Θέσεις ολίσθησης Αν S είναι ο πίνακας κατάστασης στην είσοδο και S ο πίνακας κατάστασης στην έξοδο τότε: Η συνάρτηση MixColumns() Η συνάρτηση MixColumns() ενεργεί ανεξάρτητα σε κάθε γραμμή του πίνακα κατάστασης. 8 Οι γραμμές θεωρούνται πολυώνυμα επί του GF(2 ) και πολλαπλασιάζονται modulo 4 ( 1) ax ( ) = 03 x x x+ 02 x + με το σταθερό πολυώνυμο { } { } { } { } Όπως περιγράφηκε στο κεφάλαιο 2 των μαθηματικών, έχουμε: s'( x) = ax ( ) sx ( ) s' 0, c s0, c s' s =, 0 c<n = 4 1, c 1, c s' 2, c s 2, c s' 3, c s3, c Όπου c είναι ο αριθμός της αντίστοιχης στήλης. Το ίδιο φαίνεται και σχηματικά παρακάτω: b 33

35 4.3.4 Η συνάρτηση AddRoundKey() Η συνάρτηση AddRoundKey() είναι απλά η εκτέλεση της πράξης XOR μεταξύ της κατάστασης και του κλειδιού γύρου. 4.4 Επέκταση κλειδιού Η διαδικασία επέκτασης κλειδιού, δέχεται ως είσοδο το αρχικό κλειδί και παράγει (N r +1) κλειδιά, συνολικού μήκους N b (N r +1) λέξεων (N b λέξεις το ένα). Η κάθε λέξη συμβολίζεται ως w i όπου 0 i< N b (N r +1). Στο σχήμα 4.1 φαίνεται ο ψευδοκώδικας της διαδικασίας επέκτασης κλειδιού. Η συνάρτηση SubWord() δέχεται στη είσοδο μια λέξη (N b =4 bytes) και αντικαθιστά τα bytes της λέξης εφαρμόζοντας το S-box όπως και στην συνάρτηση SubBytes() (κεφάλαιο 4.3.1) Η συνάρτηση RotWord() παίρνει μια λέξη [α 0,α 1,α 2,α 3 ] ως είσοδο και δίνει στην έξοδο τη λέξη [α 1,α 2,α 3, α 0 ]. Τέλος η σταθερά Rcon(i) περιέχει την λέξη [x i-1,{00},{00},{00}], όπου x i-1 είναι δυνάμεις του x (πχ x 0 ={00}, x 1 ={02}, x 2 ={04}, x 3 ={08}.). 34

36 Σχήμα 4.1 Όπως φαίνεται και παραπάνω, οι πρώτες N k λέξεις του επεκταμένου κλειδιού είναι το αρχικό κλειδί. Κάθε επομένη λέξη w[i] είναι το αποτέλεσμα XOR μεταξύ της προηγούμενης λέξης w[i-1] και της λέξης N k θέσεις πριν w[i- N k ]. Για θέσεις που το i είναι πολλαπλάσιο του N k, εφαρμόζεται μια μετατροπή στην λέξη w[i-1] πριν την πράξη XOR με τη σταθερά γύρου Rcon(i), αυτήν την φορά. Αυτή η μετατροπή αποτελείται από μια κυκλική αναδιάταξη των bytes (RotWord()), ακολουθούμενη από αντικατάσταση των bytes μέσω της SubWord(). Σημαντικό είναι ότι στην περίπτωση που το αρχικό κλειδί είναι 256-bit (N k =8) υπάρχει μια διαφοροποίηση σε σχέση με τα κλειδιά μεγέθους 128 και 192 bit. Στον αλγόριθμο αυτό φαίνεται στο πρώτο else if (Nk>6 AND i modnk=4). Αν N k =8 και το i-4 είναι πολλαπλάσιο του N k τότε η συνάρτηση SubWord() εφαρμόζεται στη λέξη w[i-1] πριν από την πράξη XOR με τη λέξη w[i- N k ]. 4.5 Συνάρτηση αποκρυπτογράφησης του AES Ο κώδικας κρυπτογράφησης μπορεί να αντιστραφεί και να τρέξει αντίστροφα ώστε να κάνουμε αποκρυπτογράφηση. Για να γίνει αυτό πρέπει να αντιστραφούν και οι συναρτήσεις κρυπτογράφησης, έτσι έχουμε τις συναρτήσεις αποκρυπτογράφησης, InvShiftRows(), 35

37 InvSubBytes(), InvMixColumns() και AddRoundKey(). Ο αλγόριθμος αποκρυπτο- γράφησης φαίνεται παρακάτω: Η Συνάρτηση InvSubBytes() Η συνάρτηση InvSubBytes() είναι η αντίστροφη της SubBytes(), και σε αυτήν το αντίστροφο S-box σε κάθε byte της κατάστασης. Το αντίστροφο S box είναι Η Συνάρτηση InvShiftRows() Όπως είπαμε το διάνυσμα κατάστασης είναι ένα πίνακας 4x4 bytes. Η συνάρτηση InvShiftRows() ενεργεί επί κάθε γραμμής ξεχωριστά. Είναι ουσιαστικά μια ολίσθηση των bytes κατά κάποια byte δεξιά ως εξής (αντίθετα από την ShiftRows()). 36

38 Γραμμή πίνακα Θέσεις ολίσθησης Αν S είναι ο πίνακας κατάστασης στην είσοδο και S ο πίνακας κατάστασης στην έξοδο τότε: Η Συνάρτηση InvMixColumns() Η συνάρτηση InvMixColumns() είναι η αντίστροφη της InvMixColumns(). Ενεργεί ανεξάρτητα σε κάθε γραμμή του πίνακα κατάστασης. Οι γραμμές θεωρούνται πολυώνυμα επί του GF 8 (2 ) και πολλαπλασιάζονται modulo { } { } { } { } a ( x) = 0b x + 0d x + 09 x+ 0e 3, c 3, c 4 ( x + 1) Όπως περιγράφηκε στο κεφάλαιο των μαθηματικών, έχουμε: 1 s'( x) = a ( x) sx ( ) s' 0, c 0e 0b 0d 09 s0, c s' 1, c 09 0e 0b 0d s 1, c =, 0 c<nb = 4 s' 2, c 0d 09 0e 0b s 2, c s' 0b 0d 09 0e s με το σταθερό πολυώνυμο Όπου c είναι ο αριθμός της αντίστοιχης στήλης. Το ίδιο φαίνεται και σχηματικά παρακάτω: 37

39 4.5.4 Η συνάρτηση AddRoundKey() Η συνάρτηση AddRoundKey() που περιγράφεται στο 4.3.4, ταυτίζεται με την αντίστροφη της, εξαιτίας τις πράξης XOR. 4.6 Παράδειγμα επέκτασης κλειδιού Έστω το κλειδί μεγέθους 128 bit (N k =4): Κατευθείαν έχουμε w 0 =2b7e1516 w 1 =28aed2a6 w 2 =abf71588 w 3 =09cf4f3c για i=4, επειδή imodnk=0, έχουμε RotWord(w 3 )=cf4f3c09 SubWord( RotWord(w 3 ) )= 8a84eb01 Η σταθερά γύρου Rcon[i/N k ]= Rcon[1]= Αρα w[4]= SubWord( RotWord(w 3 ) ) XOR Rcon[i/N k ]=a0fafe17 Για i=5 w[5]=w[i-n k ] XOR w[i-1]=w[1] XOR w[4]= (28aed2a6) XOR (a0fafe17)=88542cb1 κτλ 4.7 Παράδειγμα κρυπτογράφησης Για το ίδιο κλειδί με το παράδειγμα 5.6 και για block: Το αρχικό διάνυσμα κατάστασης είναι: Στην αρχή γίνεται XOR με το κλειδί του πρώτου γύρου. Το διάνυσμα κατάστασης γίνεται 38

40 Πρώτος γύρος: Μετά από το SubBytes() Μετα από το ShiftRows() Μετά από το MixColumns() Και τέλος XOR με το κλειδί γύρου. Το νέο διάνυσμα κατάστασης είναι: Οι υπόλοιποι γύροι εκτελούνται ανάλογα. 39

41 Και τέλος έχουμε το κρυπτογραφημένο διάνυσμα κατάστασης: 40

42 Κεφάλαιο 5 Αναπτυξιακή κάρτα Xilinx ML Βασικά χαρακτηριστικά της κάρτας ML402 Σε αυτό το κεφάλαιο θα αναλυθεί η αναπτυξιακή κάρτα Xilinx ML402. Θα αναλυθούν τα εξαρτήματά της και τα βασικά τους χαρακτηριστικά. Η κάρτα ML402 περιέχει: Virtex 4 FPGA : XC4VSX35-FF MB DDR SDRAM, με διασύνδεση 32-bit, με μέγιστο ρυθμό μεταφοράς δεδομένων στο 266 MHz Μια διαφορική (differential) είσοδο ρολογιού και μια διαφορική έξοδο ρολογιού με συνδέσεις SMA Έναν ενσωματωμένο ταλαντωτή ρολογιού στα 100 MHz και μια ακόμα είσοδο 3,3V για ταλαντωτή ρολογιού Διακόπτες DIP γενικής χρήσης, LEDs και κουμπιά Κεφαλές επέκτασης (Expansion Headers) με 32 I/O απλού άκρου (single-ended), 16 διαφορικά ζευγάρια ικανά για LVDS, 14 επιπλέον Ι/Ο διαμοιρασμένα με κουμπιά και LEDS, ικανότητα επέκτασης αλυσίδας JTAG, και επέκταση IIC διαύλου Stereo AC97 audio codec με line-in, line-out, ακουστικά 50-mW και microphone-in Σειριακή θύρα RS-232 Οθόνη LCD 16 χαρακτήρων επί 2 γραμμές Μια 4-Kb IIC EEPROM Έξοδος VGA: 140 MHz / 24-bit video DAC Εισόδους PS/2 για ποντίκι και πληκτρολόγιο Σύστημα ACE CompactFlash ελεγκτή διαμόρφωσης (configuration) με Type I/II CompactFlash connector 41

43 ZBT σύγχρονη SRAM: 9 Mb σε 32-bit δίαυλο και 4 bit ισοτιμίας (parity) Intel StrataFlash (ή κάποια συμβατή) linear flash chips (8MB) 10/100/1000 tri-speed Ethernet PHY transceiver USB interface chip (Cypress CY7C67300) με peripheral και host θύρες Xilinx XC97144XL CPLD για να επιτρέπουν στα linear flash chips να χρησιμοποιηθούν για διαμόρφωση του FPGA Xilinx XCF32P Platform Flash συσκευή αποθήκευσης για διαμόρφωση Θύρα διαμόρφωσης JTAG για χρήση με καλώδιο Parallel Cable III ή Parallel Cable IV Ενσωματωμένα τροφοδοτικά για όλες τις απαραίτητες τάσεις 3A AC adapter LED ένδειξης παροχής ρεύματος Μπλοκ διάγραμμα κάρτας ML402 42

44 5.2 Λεπτομερής περιγραφή της κάρτας ML402 Παρακάτω φαίνεται η κάρτα ML402 Όψη από μπροστά: Όψη από πίσω: 43

45 1.Virtex-4 FPGA Η κάρτα περιέχει το XC4VSX35-FF FPGA και υποστηρίζει επιλογές διαμόρφωσης: JTAG, Master Serial, Slave Serial, Master SelectMAP και Slave SelectMAP. Το FPGA έχει 11 τράπεζες τάσης από τις οποίες μόνο οι πρώτες 10 χρησιμοποιούνται. 2.DDR SDRAM Η κάρτα περιέχει 64 MB DDR SDRAM χρησιμοποιώντας δυο τσιπ Infineon HYB25D256160BT-7 (ή συμβατά). Το κάθε τσιπ έχει δίαυλο 16-bit και συνολικά έχουμε δίαυλο δεδομένων 32-bit στα 266 MHz. Όλα τα σήματα τερματίζονται με αντιστάσεις 47Ω σε 1,24V VTT τάση αναφοράς. Η κάρτα μπορεί να υποστηρίξει μέχρι 256MB σύνολο DDR SDRAM. Επίσης υπάρχει ένα επιπλέον pin διεύθυνσης για υποστήριξη μέχρι και 1-GΒ DDR τσιπ. Το σήμα ρολογιού της DDR παράγεται από το FPGA σαν ένα διαφορικό ζευγάρι και οδηγεί και τα δυο τσιπ. Επιπλέον το σήμα αυτό επιστρέφει στο FPGA έτσι ώστε να επιτρέπεται η διαμόρφωση του από τα Virtex-4 DCMs. Το DDR Loop Signal είναι ένα σήμα που παράγεται από το FPGA και επιστρέφει σε αυτό με καθυστέρηση που ισούται με το άθροισμα των καθυστερήσεων του ρολογιού του DDR και των σημάτων DQS. Το loop signal χρησιμοποιείται σε οδηγούς μνήμης υψηλής ταχύτητας, για την αντίθεση της φυσικής καθυστέρησης της διαδρομής μεταξύ FPGA και DDR. 3.Διαφορική είσοδος και έξοδος ρολογιού με συνδέσεις SMA Σήματα ρολογιού υψηλής ακρίβειας μπορούν να λειτουργήσουν ως είσοδοι του FPGA μέσω τις χρήσης διαφορικών εισόδων (50Ω SMA connectors). Οι διαφορικές είσοδοι συνδέονται 44

46 απευθείας στα pins του γενικού ρολογιού του FPGA. Το FPGA μπορεί να ρυθμιστεί να έχει αντίσταση τέλους γραμμής 100Ω. Επίσης η διαφορική έξοδος ρολογιού μπορεί να χρησιμοποιηθεί για να οδηγήσει μια εξωτερική συσκευή. Ο παρακάτω πινάκας δείχνει τα pin των διαφορικών συνδέσεων SMA 4.Υποδοχές ταλαντωτών Η κάρτα ML402 έχει δυο υποδοχές ταλαντωτών,για χρήση ταλαντωτών τύπου LVTTL. Ένας ταλαντωτής 100 MHz είναι ήδη εγκατεστημένος στην υποδοχή SYSCLK. Οι υποδοχές δέχονται half-sized ταλαντωτές με τροφοδοσία στα 3,3V. Τα αντίστοιχα pins φαίνονται παρακάτω: 5.Ρύθμιση φωτεινότητας και αντίθεσης LCD Αυτό επιτυγχάνεται με την αλλαγή αντίστασης του ποτενσιόμετρου. 6.Διακόπτες DIP Υπάρχουν οχτώ διακόπτες DIP (active-high) γενικής χρήσης και συνδέονται στα pins του user I/O του FPGA. 45

47 7.LEDS Υπάρχουν συνολικά 11 active-high LEDS που ελέγχονται από το FPGA Τέσσερα πράσινα LEDs γενικής χρήσης διατεταγμένα σε σειρά Πέντε πράσινα LEDs διατεταγμένα σε σχήμα σταυρού όπως και τα κουμπιά κάτω δεξιά Δυο κόκκινα LEDs για σφάλματα όπως σφάλμα δαυλού, αλλά και για οποιοδήποτε άλλο σφάλμα 8.Κουμπιά χρήστη Πέντε κουμπιά (active-high) είναι διατεταγμένα σε σχήμα σταυρού, και είναι γενικής χρήσης. 9.Κουμπί reset To κουμπί reset (active-low) έχει σκοπό να χρησιμοποιηθεί ως κουμπί reset από το χρηστή ή το σύστημα. Όμως αυτό το κουμπί συνδέεται απλά σε ένα I/O pin του FPGA και έτσι μπορεί να χρησιμοποιηθεί και για οποιοδήποτε άλλο σκοπό. 46

48 10.Κεφαλές επέκτασης (Expansion Headers) Η κάρτα περιέχει κεφαλές 0,1 ίντσας για εύκολη επέκταση ή προσαρμογή της για διάφορες εφαρμογές. Υπάρχουν απλές και διαφορικές κεφαλές, γείωση 2,5V/3.3V/5V παροχές, αλυσίδα JTAG και ICC δίαυλος. Διαφορικές κεφαλές Η θύρα (header) J5 περιέχει 16 ζευγάρια διαφορικού σήματος που συνδέονται στο I/O pins του FPGA. Κατά συνέπεια μπορούν να χρησιμοποιηθούν και σαν απλές κεφαλές. Όλα τα διαφορικά σήματα οδηγούνται μέσω αντιστάσεων 100Ω. Η τάση αναφοράς V CCIO των σημάτων μπορεί να ρυθμιστεί από 2,5V ως 3.3V με τη χρήση του jumper J16. Απλές κεφαλές Η θύρα (header ) J6 περιέχει 32 απλές κεφαλές που συνδέονται στα pins I/O του FPGA. Έτσι έχουμε μεταφορά σημάτων υψηλής ταχύτητας. Η τάση αναφοράς V CCIO των σημάτων μπορεί να ρυθμιστεί από 2,5V ως 3.3V με τη χρήση του jumper J16. 47

49 Άλλες κεφαλές Εκτός από τις προηγούμενες κεφαλές υπάρχουν επιπλέον 14 κεφαλές επέκτασης, για κουμπιά και LEDs γενικής χρήσης, συνδεδεμένα στη θύρα J3. Αυτό αποτρέπει τη σύνδεση επιπλέον I/O συσκευών (ή καρτών επέκτασης) σε περίπτωση που δε χρησιμοποιούνται τα κουμπιά και τα LEDs. Η θύρα επέκτασης επιτρέπει στην αλυσίδα JTAG να επεκταθεί στην κάρτα επέκτασης θέτοντας τον jumper J26 ανάλογα.ο δίαυλος IIC της κάρτας ML402 επεκτείνετε στην θύρα επέκτασης και επιτρέπει έτσι επιπλέον συσκευές να επικοινωνούν μέσω αυτού του διαύλου. Και τέλος κεφαλές παροχής τάσης προσφέρουν γείωση, 2.5V,3.3V και 5V. 48

50 11.Stereo AC97 audio codec Η κάρτα ML402 έχει ενσωματωμένο έναν AC97 audio codec. To τσιπ της National Semiconductor LM4550 Audio Codec υποστηρίζει stereo ήχο 16-bit στα 48 KHz. Η συχνότητα εγγραφής και εκτέλεσης μπορούν να είναι διαφορετικές. Επίσης παρέχονται ξεχωριστές θύρες microphone, line in, line out, headphone. Όλες είναι stereo εκτός από το microphone. To headphone τροφοδοτείται από έναν εσωτερικό ενισχυτή 50 mw. 49

51 12.Σειριακή θύρα RS232 Η κάρτα ML402 περιέχει μια αρσενική DB-9 σειριακή θύρα RS232 οργανωμένη ως host (DCE) και επιτρέπει την επικοινωνία του FPGA με άλλες συσκευές. Η θύρα λειτουργεί μέχρι και Bd. Και ένα τσιπ διασύνδεσης μετατρέπει τα σήματα FPGA σε σήματα RS232. To FPGA συνδέεται μόνο στα pin Tx και Rx, επομένως τα υπόλοιπα σήματα δε χρησιμοποιούνται. 13.Οθόνη LCD 16 χαρακτήρων επί 2 γραμμές Η κάρτα ML402 έχει μια οθόνη LCD (Lumex LCM-S01602DTR/M) για προβολή κειμένου. Το ποτενσιόμετρο R1 προσαρμόζει την αντίθεση της οθόνης. 14. IIC 4-Kb EEPROM Μια ICC EEPROM (Microchip Technology 34LC04B-I/ST) είναι διαθέσιμη στην κάρτα ML402 για την αποθήκευση σταθερών πληροφοριών, πχ διεύθυνση MAC. Επίσης υπάρχει προστασία εγγραφής πάνω στην κάρτα. Ο δίαυλος χρησιμοποίει σήματα των 2,5V στα 400KHz. Επιπλέον παρέχονται pull-up resistors. 15.Έξοδος VGA Η θύρα εξόδου VGA δουλεύει στα 140 MHz, με δίαυλο επικοινωνίας με το FPGA 24-bit, και υποστηρίζει οθόνες βίντεο Analog Devices ADV7125KST Είσοδοι PS/2 για ποντίκι και πληκτρολόγιο Η κάρτα ML402 έχει δυο θύρες PS/2, μια για ποντίκι (J17) και μια για πληκτρολόγιο (J18). Τρανζίστορ είναι υπεύθυνα για τη μετατροπή των σημάτων 2,5V του FPGA σε σήματα των 5V των θυρών PS/2 και αντίστροφα. Η τροφοδότηση των θυρών γίνεται απευθείας από την κεντρική τροφοδοσία 5V της κάρτας. 50

52 17.Σύστημα ACE CompactFlash Το σύστημα ACE CompactFlash επιτρέπει σε κάρτες CompactFlash τύπου Ι ή ΙΙ να προγραμματίσουν το FPGA μέσω της θύρας JTAG. Ο ελεγκτής συστήματος ACE επιτρέπει μέχρι και οχτώ εικόνες διαμόρφωσης του FPGA σε μια κάρτα CompactFlash. Οι διακόπτες διεύθυνσης επιτρέπουν στο χρήστη να διαλέξει ποια από τις οχτώ θα χρησιμοποιήσει. Τα LEDs λάθους και κατάστασης του συστήματος ACE λειτουργούν ως εξής: Αναβόσβημα του κόκκινου LED λάθους σημαίνει ότι δεν έχει εισαχθεί κάρτα CompactFlash Σταθερό κόκκινο LED λάθους σημαίνει ότι συνέβη λάθος κατά τη διαμόρφωση του FPGA Αναβόσβημα του πράσινου LED κατάστασης σημαίνει ότι γίνεται η διαμόρφωση του FPGA Σταθερό πράσινου LED κατάστασης σημαίνει επιτυχή διαμόρφωση Κάθε φορά που εισέρχεται μια κάρτα CompactFlash, ξεκινά η διαδικασία διαμόρφωσης. Πατώντας το κουμπί reset του συστήματος ACE επαναπρογραμματίζεται το FPGA. Επίσης το σύστημα ACE υποστηρίζει και την κατάσταση failsafe. Δηλαδή σε περίπτωση που αποτύχει μια διαμόρφωση, αυτόματα επανεκκινεί το σύστημα σε μια επιλεγμένη εικόνα διαμόρφωσης. Η θύρα MPU του συστήματος ACE συνδέεται στο FPGA. Αυτό επιτρέπει στο FPGA να αναδιαμορφώσει το σύστημα ή να έχει πρόσβαση στην κάρτα σαν μνήμη FAT. Ο δίαυλος δεδομένων της θύρας MPU είναι κοινός με αυτόν της θύρας USB. Για διαμόρφωση του FPGA μέσω του συστήματος ACE, ο διακόπτης επιλογής διαμόρφωσης (SW12) πρέπει να είναι στη θέση SYS ACE. 18.ZBT σύγχρονη SRAM Η ZBT σύγχρονη SRAM (Cypress CY7C1354B ή συμβατή) προσφέρει μια εξωτερική μνήμη υψηλής ταχύτητας στο FPGA. Η μνήμη είναι οργανωμένη σε 256Κ x 36 bits (9Mb 1.1MB ). Επίσης ο δίαυλος δεδομένων είναι 32-bit με υποστήριξη 4-bit ισοτιμίας. Οι SRAM και FLASH έχουν κοινό δίαυλο δεδομένων. 19.Linear Flash Chips Δυο Linear Flash των 32Mb (Micron MT28F320J3RG-11 ET) είναι εγκατεστημένες στην κάρτα ML402 προσφέροντας σύνολο 8MB μνήμης FLASH. Τα τσιπς είναι Intel StrataFlash (ή κάποια συμβατά). Κάθε τσιπ έχει δίαυλο 16 bit και μαζί έχουν δίαυλο 32 bit (κοινό με SRAM). Και μέσω του CPLD η μνήμη FLASH μπορεί επίσης να χρησιμοποιηθεί για τη διαμόρφωση του FPGA. 51

53 20.Xilinx XC97144XL CPLD Αυτό το τσιπ συνδέει τη μνήμη FLASH με τα σήματα διαμόρφωσης του FPGA και επιτρέπει τη διαμόρφωση του FPGA μέσω αυτής της μνήμης FLASH. Το CPLD υποστηρίζει επιλογές διαμόρφωσης master, slave σε serial ή parallel (Select MAP). Για να γίνει η διαμόρφωση μέσω της μνήμης FLASH πρέπει ο διακόπτης επιλογής διαμόρφωσης (SW12) να είναι στη θέση CPLD Flash /100/1000 tri-speed Ethernet PHY Η κάρτα ML402 περιέχει τη συσκευή Marvell Alaska PHY που λειτουργεί στα 10/100/1000 Mb/s. Η κάρτα υποστηρίζει επικοινωνία με το FPGA μέσω των τρόπων MII, GMII και RGMII. Το PHY συνδέεται στον Halo HFJ11-1G01E RJ-45 connector. Ένας κρύσταλλος 25 MHz είναι το σήμα ρολογιού του PHY. Οι προεπιλογές (μετά από εκκίνηση ή reset της κάρτας) του PHY φαίνονται στον παρακάτω πινάκα, και μπορούν να αλλάξουν μέσω προγράμματος. 22.Ελεγκτής USB με peripheral και host θύρες Ο ελεγκτής USB Cypress CY7C67300 που είναι ενσωματωμένος στην κάρτα ML402 προσφέρει σύνδεση USB, και λειτουργεί με τους τρόπους host και peripheral. Ο ελεγκτής έχει δυο μηχανές σειριακής διασύνδεσης (serial interface engines, SIE) που μπορούν να χρησιμοποιηθούν ανεξάρτητα. Η SIE1 είναι συνδεδεμένη στη θύρα USB host 1 (J19) και στη θύρα USB peripheral 1 (J2), ενώ η SIE2 είναι συνδεδεμένη μόνο στη θύρα USB peripheral 2. Ο ελεγκτής USB έχει έναν εσωτερικό επεξεργαστή για να μπορεί να επεξεργάζεται εντολές USB. Το Firmware του επεξεργαστή αποθηκεύεται στη δική του IIC EEROM (U17) ή φορτώνει από υπολογιστή μέσω της σύνδεσης peripheral. 23.Xilinx XCF32P Platform Flash συσκευή αποθήκευσης για διαμόρφωση Η Xilinx XCF32P Platform Flash συσκευή αποθήκευσης είναι μια εύκολη λύση για διαμόρφωση του FPGA. Μπορεί να αποθηκεύσει μέχρι δυο εικόνες διαμόρφωσης, οι οποίες μπορούν να επιλεχτούν από τους διακόπτες επιλογής διεύθυνσης διαμόρφωσης. Για να γίνει χρήση αυτής της μνήμης πρέπει ο διακόπτης επιλογής διαμόρφωσης(sw12) να είναι στη θέση Plat Flash. Υποστηρίζει επίσης επιλογές διαμόρφωσης master, slave, σε serial ή parallel. 52

54 24.Θύρα διαμόρφωσης JTAG Η θύρα διαμόρφωσης JTAG επιτρέπει προγραμματισμό και αποσφαλμάτωση του FPGA. Υποστηρίζει καλώδια Parallel Cable III ή Parallel Cable IV. Τέλος η αλυσίδα JTAG μπορεί να επεκταθεί και σε μια κάρτα επέκτασης θέτοντας ανάλογα τον jumper J Ενσωματωμένα τροφοδοτικά Τα τροφοδοτικά παράγουν τάσεις 1,2V, 1.25V, 1.8V, 2.5V και 3.3V. Οι τάσεις 1.2V, 2.5V και 3.3V οδηγούνται από διακοπτικούς ρυθμιστές τάσης. Όταν αυτοί οι διακόπτες έχουν κανονική τάση τότε το PWR Good LED ανάβει. Το παρακάτω διάγραμμα δείχνει την αρχιτεκτονική και τη μέγιστη τάση κάθε παροχής. Η κάρτα ML402 έχει συνήθως παροχή ισχύος στα 15W τα οποία είναι αρκετά για τις περισσότερες εφαρμογές. 26.AC adapter Η κάρτα ML402 έχει έναν AC adapter 15W Ο συνδετήρας (connector) είναι 2.1mm x 5.5mm barrel type plug (center positive). Σε περίπτωση που για κάποιες εφαρμογές δε φτάνουν τα 15W μπορεί να χρησιμοποιηθεί μεγαλύτερος adapter. Αλλάσε αυτήν την περίπτωση πρέπει η ρύθμιση φορτίου του να είναι μικρότερη του 10%. 27.LED ένδειξης παροχής τάσης Το PWR Good LED ανάβει όταν οι τάσεις 1.2V,2.5V και 3.3V είναι στα κανονικά τους επίπεδα. Όταν είναι κλειστό, αναβοσβήνει ή ανάβει αμυδρά σημαίνει ότι κάτι στις τάσεις είναι λάθος. 28.INIT LED Ανάβει στη αρχή για να δείξει ότι το FPGA έχει ανάψει κανονικά. 29.DONE LED Δείχνει την κατάσταση του pin DONE του FPGA. Πρέπει να ανάβει όταν το FPGA έχει διαμορφωθεί επιτυχώς. 53

55 30.Program Switch Αυτός ο διακόπτης όταν πατηθεί γειώνει το pin Prog του FPGA και έτσι το FPGA σβήνει τη διαμόρφωσή του. 31.Διακόπτες επιλογής διεύθυνσης και τρόπου διαμόρφωσης Οι 3 αριστεροί διακόπτες επιλέγουν μια από τις οχτώ διευθύνσεις μνήμης για διαμόρφωση. Έτσι μπορούν το σύστημα ACE ή ο CPLD να επιλέξουν μια από τις εικόνες διαμόρφωσης. Οι 3 δεξιοί επιλέγουν τον τρόπο διαμόρφωσης όπως φαίνεται παρακάτω στον πινάκα. 32.Θέση για μπαταρία Μια θέση για μπαταρία είναι ενσωματωμένη στη κάρτα ML402. Αυτή η θέση συνδέεται στο pin VBATT του FPGA. Παίρνει μια μπαταρία λίθου 12-mm (σχήμα νομίσματος) 3V, όπως πχ Panasonic BR Διακόπτης επιλογής διαμόρφωσης (SW12) Αυτός ο διακόπτης επιλέγει ανάμεσα στα: Σύστημα ACE, Xilinx XCF32P Platform Flash, CPLD/ Linear Flash, για την διαμόρφωση του FPGA. Η θύρα PC4 επιτρέπει στο GTAG να προγραμματίσει το FPGA ανεξάρτητα από την ένδειξη του παραπάνω διακόπτη. 5.3 Αλυσίδα JTAG Τα FPGA, Platform Flash και CPLD μπορούν όλα να προγραμματιστούν μέσω της θύρας JTAG. Παρακάτω βλέπουμε την αλυσίδα JTAG. Η αλυσίδα ξεκινά από τη θύρα PC4 και συνεχίζει στο σύστημα ACE, Platform Flash μνήμη, FPGA, CPLD και ίσως κάρτα επέκτασης. Ο jumper J26 καθορίζει το αν θα υπάρχει ή όχι κάρτα επέκτασης. Η αλυσίδα JTAG χρησιμοποιείται για τον προγραμματισμό και την αποσφαλμάτωση του FPGA καθώς επίσης και για τον προγραμματισμό της Platform Flash μνήμης και του CPLD. Μέσω της θύρας PC4 μπορεί ο υπολογιστής να κάνει τις παραπάνω διαδικασίες. 54

56 Κεφάλαιο 6 Virtex 4 XC4VSX35-FF FPGA 6.1 Ρολόγια Γενικά για τα ρολόγια του FPGA Στην κάρτα ML402 χρησιμοποιείται το XC4VSX35-FF FPGA. Για το χρονισμό του χωρίζεται σε 12 περιοχές (1 περιοχή = 16 CLBs). Συνολικά υπάρχουν 32 γενικά δίκτυα ρολογιών εκ των οποίων οιαδήποτε 8 μπορούν να χρησιμοποιηθούν σε μια περιοχή. Τα γενικά ρολόγια οδηγούνται από buffers, οι όποιοι χρησιμοποιούνται ως κυκλώματα ενεργοποίησης ή ως πολυπλέκτες (επιλέγοντας ανάμεσα σε δυο εισόδους ρολογιών). Συχνά τα γενικά ρολόγια δέχονται εισόδους από τους Digital Clock Managers (DCM) για να εξαλείφουν τις καθυστερήσεις μετάδοσης ή για το συγχρονισμό δυο ρολογιών. Κάθε περιοχή έχει δυο εισόδους ρολογιών, που λειτουργούν η κάθε μια είτε διαφορικά είτε απλά. Μπορούν επίσης οι ίδιες είσοδοι να οδηγήσουν πόρους στην πάνω και στην κάτω περιοχή. Ο buffer εισόδου της περιοχής μπορεί να διαιρεί το ρολόι εισόδου με έναν ακέραιο από 1 ως Γενικά ρολόγια Τα γενικά ρολόγια είναι ένα δίκτυο διασύνδεσης σχεδιασμένο ώστε να φτάνει σε όλες τις εισόδους ρολογιών των περιοχών του FPGA. Υπάρχουν 16 (pins) γενικών ρολογιών και μπορούν να χρησιμοποιηθούν είτε διαφορικά είτε απλά, για είσοδο η για έξοδο Buffers γενικών ρολογιών Υπάρχουν 32 buffers γενικών ρολογιών χωρισμένοι, μισοί στο πάνω μέρος του FPGA και μισοί στο κάτω. Μια είσοδος συνδεδεμένη στη θετική πλευρά του pin διαφορικής εισόδου 55

57 μπορεί να συνδεθεί σε οποιονδήποτε buffer του ιδίου μισού. Για απλή είσοδο, η σύνδεση γίνεται στη θετική πλευρά του pin και η αρνητική δεν μπορεί να χρησιμοποιηθεί σαν επιπλέον απλή είσοδος (μπορεί να χρησιμοποιηθεί όμως για user I/O). Είσοδοι στους buffers μπορεί να είναι (δεδομένου ότι βρίσκονται στο ίδιο μισό) είσοδοι γενικών ρολογιών, digital clock managers (DCM), phase Matched Clock Divider (PMCD), έξοδοι άλλων buffers, rocket IO Multi Gigabit Transceivers ή γενική διασύνδεση. Όλοι οι buffers γενικών ρολογιών μπορούν να οδηγήσουν πόρους στις περιοχές του FPGA, αλλά μέχρι 8 διαφορικά ρολόγια ανά περιοχή. Επιπλέον οι buffers μπορούν να χρησιμοποιηθούν για να πολυπλέξουν 2 εισόδους (2:1 multiplexer) Είδη γενικών buffer BUFGCTRL Είναι ο βασικός buffer, όλοι οι άλλοι προκύπτουν από αυτόν. Έχει 6 σήματα έλεγχου S0,S1,CE1,CE2,IGNORE1,IGNORE2, τα οποία ελέγχουν τις 2 εισόδους I1,I2. Επιλέγει ανάμεσα σε 2 ρολόγια, και η προεπιλογή για την ενεργοποίηση των σημάτων γίνεται κατά την κάθοδο των παλμών. Το σήμα IGNORE0 δίνει εντολή στον buffer να αγνοήσει το I0, ενώ το IGNORE1 το I1. Για την επιλογή μιας εισόδου πρέπει τα σήματα του αντίστοιχου ζευγαριού ( S0 και CE0 ή S1 και CE1 ) να βρίσκονται στο λογικό ένα. BUFG 56

58 Είναι απλά ένα buffer με μια είσοδο και μια έξοδο. Προκύπτει από τον BUFGCTRL αγνοώντας το την I1 (IGNORE1=1) και επιλέγοντας την άλλη είσοδο (S0=1 και CE0=1). BUFGMUX και BUFGMUX_1 O BUFGMUX είναι ένας buffer με δυο εισόδους, μια έξοδο και ένα σήμα S επιλογής. Το σήμα καθορίζει ποια από τις δυο θα είναι η έξοδος. Μπορεί να προκύψει από τον BUFGCTRL θέτοντας τα S1=1, S0=1 και χρησιμοποιώντας το σήμα επιλογής S για να θέσουμε τα CE1=S και CE0=not(S). Ως γραμμή επιλογής χρησιμοποιείται η CE, κάτι το όποιο μπορεί να προκαλέσει (glitch) απότομη μεταβολή τάσης εξόδου (σε αντίθεση με τον BUFGMUX_VIRTEX4 buffer). Ο BUFGMUX_1 είναι ίδιος με τον BUFGMUX απλά έχει αντίστροφη λογική στον τρόπο αλλαγής τον σημάτων από το I1 I0 και αντίστροφα. BUFGMUX_VIRTEX4 Ο BUFGMUX_VIRTEX4 είναι ίδιος με τον BUFGMUX, δηλαδή πάλι δυο είσοδοι και ένα σήμα επιλογής. Η διάφορα είναι στην αντιστοιχία του με τον βασικό buffer BUFGCTRL, δηλαδή στο ότι η επιλογή του σήματος γίνεται μέσω των S1 και S2 (CE0=CE1=1). Με αυτόν τον τρόπο αποφεύγονται οι απότομες μεταβολές της τάσης (glitch). 57

59 Γενικά δίκτυα Το FPGA το διατρέχουν δίκτυα τα οποία διαμοιράζουν τα σήματα ρολογιού. Είναι σχεδιασμένα για χαμηλή κατανάλωση ενέργειας και μικρή παραμόρφωση. Και έτσι κάθε κλάδος που δε χρησιμοποιείται αποκόπτεται από το κύκλωμα. Όλοι οι γενικοί buffers και τα γενικά δίκτυα υλοποιούνται διαφορικά. Αυτό βοηθά στο να υπάρχουν καλύτεροι κύκλοι εργασιών (duty cycles) και καλύτερη απόρριψη του θορύβου Τοπικά ρολόγια Περιοχές Το XC4VSX35-FF FPGA έχει 12 περιοχές. Κάθε περιοχή αποτελείται από 16 CLB και μπορεί να έχει μέχρι 8 γενικά ρολόγια (οποιαδήποτε από τα 32). Στο παρακάτω σχήμα βλέπουμε τη διάταξη των περιοχών στο FPGA. Σε κάθε περιοχή υπάρχουν δυο I/O pins που μπορούν να χρησιμοποιηθούν και σαν είσοδοι ρολογιών. Σε αυτά τα pins έχουν απενεργοποιηθεί οι LVDS οδηγοί εξόδου για να μειωθεί η χωρητικότητα εισόδου. Το ίδιο έχει γίνει και στις εισόδους γενικών ρολογιών. 58

60 Είδη τοπικών buffer Ι/Ο Clock Buffer BUFIO Είναι ένας απλός buffer μιας εισόδου - μιας εξόδου και κατά συνέπεια υπάρχει μια διαφορά φάσης από την είσοδο στην έξοδο. Μπορεί να οδηγήσει τους BUFR στην ίδια περιοχή, αλλά δεν μπορεί να οδηγήσει λογικούς πόρους (CLB, block RAM.). Μπορεί επίσης να οδηγήσει τα δίκτυα ρολογιών της περιοχής του καθώς και 2 γειτονικών περιοχών (2 δίκτυα ανά περιοχή). Regional Clock Buffer - BUFR Ο buffer αυτός μπορεί να οδηγήσει τα τοπικά δίκτυα ρολογιών σε μια περιοχή (2 δίκτυα ανά περιοχή), καθώς επίσης και τα δίκτυα άλλων 2 γειτονικών περιοχών. Σε αντίθεση με τον BUFIO μπορεί να οδηγήσει λογικούς πόρους (CLB, block RAM ) στην ίδια και στις γειτονικές περιοχές. Μπορεί επίσης να διαιρέσει τη συχνότητα του ρολογιού εισόδου με έναν ακέραιο από 1 ως 8. Υπάρχουν 2 BUFR ανά περιοχή, ένα για κάθε δίκτυο. Ι είσοδος, Ο έξοδος, CE clock enable, CLR ασύγχρονο καθάρισμα για τη διαίρεση και έξοδος χαμηλή Τοπικά δίκτυα Υπάρχουν δυο τοπικά δίκτυα ανά περιοχή. Έχουν σχεδιαστεί για χαμηλή κατανάλωση ενέργειας (όπως και τα γενικά δίκτυα), δηλαδή αν ένας κλάδος δε χρησιμοποιείται αποκόπτεται από το κύκλωμα. Οδηγούνται από τους BUFR buffers, και κάθε buffer μπορεί να οδηγήσει δίκτυα της περιοχής του και δυο γειτονικών, όπως φαίνεται και στο σχήμα. 59

61 6.2 Digital Clock Managers (DCMs) Γενικά Χαρακτηριστικά Στο εν λόγω virtex 4 FPGA υπάρχουν 8 DCMs, 3 στο κάτω μέρος και 5 στο πάνω. Οι DCMs προσφέρουν τα εξής χαρακτηριστικά διαχείρισης ρολογιών: Ρύθμιση ρολογιού Ο DCM μπορεί μέσω ενός DLL (delay locked loop) να εξαλείψει την καθυστέρηση μετάδοσης του ρολογιού, ρυθμίζοντας την έξοδο του DCM σε σχέση με την είσοδο. O DCM περιέχει buffers και λογική ελέγχου. Το ρολόι εισόδου οδηγεί μια αλυσίδα από στοιχεία καθυστέρησης, και έτσι η έξοδος κάθε στοιχείου απεικονίζει το αρχικό σήμα σε κάποια διαφορετική καθυστέρηση κάθε φορά. Η λογική ελέγχου περιέχει έναν ανιχνευτή φάσης και έναν επιλογέα γραμμής καθυστέρησης. Ο ελεγκτής φάσης ελέγχει το σήμα ρολογιού στην είσοδο (CLKIN) με ένα σήμα ανάδρασης (CLKFB) και οδηγεί τη γραμμή επιλογής καθυστέρησης (δηλαδή την καθυστέρηση του σήματος εξόδου), έτσι ώστε είσοδος και ανάδραση να συμπίπτουν. Σύνθεση συχνότητας Διαφορετικές έξοδοι προσφέρουν διπλασιασμένη συχνότητα (CLK2X και CLK2X180) από αυτήν του σήματος εισόδου. Μια άλλη έξοδος, η CLKDV, προσφέρει συχνότητα διαιρεμένη με κάποιον αριθμό. Οι έξοδοι CLKFX και CLKFX180, προσφέρουν συχνότητα εξόδου που προκύπτει και από διαίρεση και από πολλαπλασιασμό (το ποιός ακριβώς θα είναι ο πολλαπλασιαστής (Μ) και ποιός ο διαιρέτης (D) καθορίζεται από το χρήστη). 60

62 Ολίσθηση φάσης Ο DCM παρέχει μια βασική (coarse) και μια καλή (fine-grained) ολίσθηση φάσης. Η βασική χρησιμοποίει διαφορές φάσης 90, 180, 270 μοίρες από το CKL0 για να φτιάξει τα CLK90, CLK180, CLK270. Η διαφορά φάσης 180 από τα CKL2X και CLKFX φτιάχνει τα CLK2X180 και CLKFX180. Υπάρχουν επίσης 4 τρόποι καλής ολίσθησης: fixed, variable-positive, variable-center και direct. Στην fixed η ολίσθηση γίνεται κατά ένα πολλαπλάσιο της συχνότητας διαιρεμένης με το 256. Με τις variable-positive και variable-center η ολίσθηση μπορεί να γίνει δυναμικά και επαναλαμβανόμενα, μπροστά ή πίσω κατά το 1/256 της περιόδου εισόδου. Με την direct η ολίσθηση μπορεί να γίνει δυναμικά και επαναλαμβανόμενα, μπροστά ή πίσω κατά την τιμή του DCM_TAM. Δυναμικός καθορισμός παραμέτρων Όλες οι παράμετροι που χρειάζονται για να καθοριστούν όλες οι παραπάνω λειτουργίες, μπορούν να ρυθμιστούν δυναμικά, μέσω των εισόδων DADDR[6:0], DI[15:0], DWE, DEN, DCLK και των εξόδων DO[15:0], DRDY. Στο παρακάτω σχήμα φαίνεται οι θέσεις των DCMs καθώς και των υπόλοιπων πόρων τις κεντρικής στήλης. Βλέπουμε τους DCMs στο πάνω μέρος (5 DCMs) και τους DCMs στο κάτω μέρος (3 DCMs) Πρότυπα DCMs Υπάρχουν 3 είδη αναπαράστασης των DCMs, το καθένα αναπαριστά τον DCM με μεγαλύτερη λεπτομέρεια: DCM_BASE, DCM_PS, DCM_ADV. 61

63 Με διακεκομμένες γραμμές στην είσοδο (αριστερά) απεικονίζονται τα σήματα ελέγχου και δεδομένων εισόδου, και με διακεκομμένες γραμμές στην έξοδο (δεξιά) απεικονίζονται τα σήματα κατάστασης και δεδομένων εξόδου. Όπως ήδη είπαμε, το CLKIN είναι η είσοδος ρολογιού και το CLKFB είναι το σήμα ανάδρασης ρολογιού για εξάλειψη της καθυστέρησης μετάδοσης. Τα CLK0, CLK90, CLK180, CLK270 είναι το σήμα CLKIN μετατοπισμένο κατά φάση 0,90,180,270 μοίρες ανάλογα. To CLK2X προσφέρει σήμα διπλάσιας συχνότητας από αυτό του σήματος εισόδου και το CLK2X180 μετατοπίζει το CLK2X κατά 180 μοίρες. Το CLKFX προσφέρει την αρχική συχνότητα πολλαπλασιασμένη με ένα κλάσμα (=M/D) και το CLKFX180 μετατοπίζει το σήμα CLKFX κατά 180 μοίρες. Και το CLKDV προσφέρει την αρχική συχνότητα διαιρεμένη με κάποιον αριθμό. Το σήμα εισόδου PSCLK (phase shift clock input) παρέχει την πηγή ρολογιού για την ολίσθηση συχνότητας. Μπορεί να είναι έξοδος των IBUF (Input buffer), IBUFG(Global clock input buffer), BUFGCTRL ή ένα εσωτερικό ρολόι. Το σήμα εισόδου DCLK (dynamic reconfiguration clock input) παρέχει την πηγή ρολογιού του κυκλώματος δυναμικού καθορισμού παραμέτρων του DCM. Μπορεί να είναι έξοδος των IBUF (Input buffer), IBUFG(Global clock input buffer), BUFGCTRL ή ένα εσωτερικό ρολόι. Το σήμα εισόδου RST (reset input) επανεκκινεί τον DCM. Είναι ενεργό στην υψηλή κατάσταση και όταν ενεργοποιηθεί όλες οι έξοδοι του DCM πέφτουν στην χαμηλή κατάσταση για όσο χρειαστεί. Το σήμα εισόδου PSINCDEC (phase shift increment/decrement input) καθορίζει αν η ολίσθηση φάσης θα είναι θετική ή αρνητική για τους τρόπους λειτουργίας,variable-positive, variable-center και direct. Το σήμα εισόδου PSEN (phase shift enable input) ενεργοποιεί τη διαδικασία ολίσθησης φάσης. 62

64 Ο δίαυλος εισόδου DI[15:0] (Dynamic Reconfiguration data input) είναι ο δίαυλος μέσω του οποίου εισάγονται δεδομένα για τη ρύθμιση των παραμέτρων του DCM. Όταν δε χρησιμοποιείται, τα bits του πρέπει να είναι 0. Ο δίαυλος εισόδου DADDR[6:0] (Dynamic Reconfiguration Address Input) είναι ο δίαυλος διεύθυνσης που χρησιμοποιείται για τη ρύθμιση των παραμέτρων του DCM. Όταν δε χρησιμοποιείται, τα bits του πρέπει να είναι 0. Το σήμα εισόδου DWE (Dynamic Reconfiguration write enable) δίνει δικαίωμα εγγραφής των δεδομένων DI στην διεύθυνση DADDR. Όταν δε χρησιμοποιείται, πρέπει να είναι 0. Το σήμα εισόδου DEN (Dynamic Reconfiguration enable input) ενεργοποιεί τη δυναμική ρύθμιση των παραμέτρων του DCM.. Όταν δεν χρησιμοποιείται, πρέπει να είναι 0. Το σήμα εξόδου LOCKED όταν είναι σε υψηλή κατάσταση σημαίνει πως οι έξοδοι είναι αυτές που έπρεπε να είναι. Μετά από ένα reset αυτό το σήμα κάνει αρκετούς κύκλους μηχανής για να ενεργοποιηθεί. Το σήμα εξόδου PSDONE (phase shift done output) όταν ενεργοποιηθεί σημαίνει πως ολοκληρώθηκε μια ολίσθηση φάσης. Ενεργοποιείται για 1 κύκλο του PSCLK και σημαίνει επίσης ότι μπορεί να ξεκινήσει νέα ολίσθηση. Ο δίαυλος εξόδου DO[15:0] (Dynamic Reconfiguration data output) παρέχει δεδομένα σχετικά με τις παραμέτρους που έχουν καθοριστεί. Συγκεκριμένα DO[0]=phase shift overflow, DO[1]=CLKIN stopped,, DO[2]=CLKFX stopped, DO[3]=CLKFB stopped, και D[15:0] δε χρησιμοποιούνται. To σήμα εξόδου DRDY (Dynamic Reconfiguration Ready output) δηλώνει ότι έχει ολοκληρωθεί ο καθορισμός των παραμέτρων και είναι ουσιαστικά η απάντηση στο σήμα DEN Σύνδεση του DCM με πόρους ρολογιών Όπως είπαμε το εν λόγω FPGA έχει 16 εισόδους ρολογιών, οι οποίες συνδέονται στους buffers IBUFG, 16 buffers στο πάνω μέρος και 16 buffers στο κάτω (32 δίκτυα γενικών ρολογιών). Κάθε τέτοιος buffer στο πάνω ή στο κάτω μισό μπορεί να συνδεθεί σε οποιαδήποτε είσοδο DCM (CKLIN, CLKFB, PSCLK ή DCLK) τοποθετημένου στο ίδιο μισό. Κάθε έξοδος DCM, μπορεί να οδηγήσει κάθε BUFGCTRL buffer στο ίδιο μισό της συσκευής. Και αντίστοιχα κάθε BUFGCTRL buffer μπορεί να οδηγήσει κάθε είσοδο DCM, όμως με τον περιορισμό 8 γενικά δίκτυα ρολογιών ανά περιοχή. Τέλος μπορούν να συνδεθούν ο DCM με τον PMCD και αντίστροφα. 63

65 6.3 Phase Matched Clock Dividers (PMCDs) Γενικά χαρακτηριστικά Στο XC4VSX35-FF FPGA υπάρχουν 4 PMCDs, 2 στο πάνω μισό και 2 στο κάτω. Οι PCMDs προσφέρουν τα εξής χαρακτηριστικά διαχείρισης ρολογιών: Διαίρεση συχνότητας Οι PMCDs παράγουν μέχρι και 4 εκδόσεις του αρχικού σήματος, διαιρώντας τη συχνότητά του. Έχουν τις εξής εξόδους: διαίρεση με το 1 (CLKA1), διαίρεση με το 2 (CLKA1D2), διαίρεση με το 4 (CLKA1D4) και διαίρεση με το 8 (CLKA1D8). Οι έξοδοι αυτές είναι ευθυγραμμισμένες μεταξύ τους ως προς την άνοδό τους (αλλά όχι με την είσοδο CLKA). Ίδια καθυστέρηση ρολογιού Ο PMCD έχει 3 επιπλέον εισόδους (CLKB,CLKC και CLKD) και τις 3 αντίστοιχες εξόδους τους (CLKB1, CLKC1 και CLKD1). Μεταξύ της εισόδου CLKA και της εξόδου της CLKA1 υπάρχει μια καθυστέρηση Τ. Αυτή η ίδια καθυστέρηση διατηρείται και μεταξύ των άλλων τριών εισόδων και εξόδων. Δηλαδή η έξοδος CLKB1 είναι μια καθυστερημένη κατά Τ, έκδοση του σήματος CLKB κτλ. Οι PMCDs είναι τοποθετημένοι στην κεντρική στήλη της συσκευής. Μοιρασμένοι 2 στο πάνω μισό και 2 στο κάτω. 64

66 6.3.2 Πρότυπο PMCD Παρακάτω φαίνεται το πρότυπο PMCD. Με διακεκομμένες γραμμές φαίνονται τα σήματα έλεγχου. Τα περισσότερα σήματα έχουν ήδη επεξηγηθεί. Το σήμα RST είναι ένα σήμα έλεγχου, το όποιο αν ενεργοποιηθεί, όλες οι έξοδοι πέφτουν στο μηδέν. Ενώ απενεργοποιώντας το, οι έξοδοι ξεκινούν τη λειτουργία τους (μετά από κάποιο χρονικό διάστημα). Το σήμα έλεγχου REL ενεργοποιεί τις εξόδους CLKA1D2, CLKA1D4 και CLKA1D Σύνδεση του PMCD με πόρους ρολογιών Το PMCD μπορεί να πάρει τις εισόδους ρολογιού του (CLKA, CLKB, CLKC και CLKD) από οποιονδήποτε IBUFG buffer στο ίδιο μισό τις συσκευής. Επίσης μπορεί να πάρει τις εισόδους του από οποιονδήποτε BUFGCTRL, με τον περιορισμό ότι πρέπει να χρησιμοποιεί μέχρι 8 δίκτυα ανά περιοχή. Μπορεί επίσης και να οδηγεί οποιαδήποτε BUFGCTRL στο ίδιο μισό. Οι PMCD που βρίσκονται στο ίδιο μισό έχουν μια τοπική σύνδεση, η έξοδος CLKA1D8 κάθε PMCD συνδέεται στην είσοδο CLKA του άλλου. Έτσι μπορούν να δημιουργήσουν ακόμα μικρότερες συχνότητες. 65

67 Τέλος κάθε έξοδος ρολογιού του DCM μπορεί να οδηγήσει οποιοδήποτε PMCD στο ίδιο μισό. Μπορεί ακόμα να οδηγήσει τα PMCDs παράλληλα. 6.4 Block RAM Γενικά χαρακτηριστικά Στο XC4VSX35-FF Virtex-4 FPGA υπάρχουν 192 block RAM μεγέθους 18Kbits (Max 3456 Kbits). Μπορούν να γράφουν και να διαβάζουν ταυτόχρονα μέσω δυο συμμετρικών ανεξάρτητων θυρών. Κάθε θύρα μπορεί να οριστεί ως 16Kx1, 8Kx2 ως 512x36, και πάλι ανεξάρτητα. Κατά τη διαδικασία εγγραφής, η θύρα εξόδου δεδομένων μπορεί να περιέχει ή τα δεδομένα που γράφονται ή τα δεδομένα που σβήνονται (λόγω εγγραφής καινούργιων δεδομένων) ή να μην αλλάξει. Βελτιώσεις του Virtex-4 σε σχέση με την απλή block RAM Ο χρήστης μπορεί να χρησιμοποιήσει έναν καταχωρητή εξόδου, που βρίσκεται μέσα στη RAM. Έτσι επιτυγχάνονται μεγαλύτερες συχνότητες ρολογιού, με την προσθήκη όμως ενός κύκλου καθυστέρησης. Δυο γειτονικές RAM μπορούν να συνδυαστούν και να δημιουργήσουν μια 32Kx1 μνήμη χωρίς εξωτερική λογική ή απώλεια ταχύτητας. Κάθε RAM μπορεί να χρησιμοποιηθεί ως μνήμη FIFO 4Κ βάθους και πλάτους 4 bits ή 2Κx9 ή 1Kx18 ή 512x36. Οι θύρες εξόδου είναι κλειδωμένες και δεν αλλάζουν μέχρι να πραγματοποιηθεί μια διαδικασία διαβάσματος ή εγγραφής. Κάθε θύρα έχει το δικό της ανεξάρτητο ρολόι. Η διαδικασία εγγραφής ή διαβάσματος απαιτεί 1 κύκλο ρολογιού. 66

68 6.4.2 Πρότυπο RAM Κάθε θύρα είναι ανεξάρτητη από την άλλη, ενώ και οι δυο θύρες έχουν πρόσβαση σε όλη τη RAM. Το σήμα CLK (Clock) είναι το σήμα ρολογιού, στο όποιο μπορεί να ρυθμιστεί η πολικότητά του, δηλαδή ενεργοποίηση στην άνοδο ή στην κάθοδο. (προεπιλογή η άνοδος) Το σήμα EN (Enable). Όταν το σήμα αυτό είναι ανενεργό η θύρα κρατάει το σήμα εξόδου σταθερό και δεν μπορεί να γράψει στην μνήμη. Η πολικότητα μπορεί να ρυθμιστεί. (προεπιλογή η υψηλή κατάσταση) Το σήμα WE (Write Enable). Για να γραφτούν τα δεδομένα εισόδου στη μνήμη πρέπει τα σήματα WE και EN να είναι ενεργά για κάποιο χρονικό διάστημα πριν την ενεργοποίηση του ρολογιού. Μόνο όταν είναι ανενεργό μπορεί να πραγματοποιηθεί διαδικασία διαβάσματος. Η πολικότητα μπορεί να ρυθμιστεί. (προεπιλογή η υψηλή κατάσταση) Το σήμα REGCE (Register Enable) ελέγχει το αν θα χρησιμοποιηθεί ο καταχωρητής εξόδου. Η πολικότητα μπορεί να ρυθμιστεί. (προεπιλογή η υψηλή κατάσταση) Όταν το σήμα SSR (Set/Reset) είναι ενεργό και επίσης είναι ενεργό και το σήμα EN τότε η θύρα εξόδου παίρνει μια συγκεκριμένη τιμή που ορίζεται από την μεταβλητή SRVAL. Αυτή η λειτουργία δεν επηρεάζει τα δεδομένα της μνήμης RAM και δεν είναι διαθέσιμη όταν χρησιμοποιούνται οι καταχωρητές εξόδου. Η πολικότητα μπορεί να ρυθμιστεί. (προεπιλογή η υψηλή κατάσταση) 67

69 Το σήμα ADDR (Address Bus) καθορίζει τη διεύθυνση διαβάσματος ή εγγραφής. Ανάλογα με το μέγεθος σήματος εισόδου δεδομένων έχουμε και άλλο μέγεθος σήματος διευθύνσεων. Όταν ενώνουμε δυο RAM τότε το σήμα δεδομένων είναι 1 bit, και το σήμα διευθύνσεων 15 bits. Τα σήματα DI και DIP (Data In Buses). Το σήμα DI παρέχει τα καινούργια δεδομένα που θα γραφτούν στη RAM και το DIP είναι το σήμα ισοτιμίας (parity) για επαλήθευση του σήματος DI. Το μέγεθός τους καθορίζεται από τον παραπάνω πίνακα. Τα σήματα DO και DOP (Data Out Buses). Το σήμα DO παρέχει τα δεδομένα εξόδου και το σήμα DOP είναι το σήμα ισοτιμίας εξόδου προς επαλήθευση του σήματος DΟ. Το μέγεθός τους είναι ίδιο με τα σήματα εισόδου DI και DIP αντίστοιχα. Το σήμα CASCADEIN (Cascade) χρησιμοποιείται στη σύνδεση δυο RAM για τη δημιουργία μνήμης 32Kx1. Και χρησιμοποιείται στη RAM που βρίσκεται στο πάνω μέρος της διάταξης, για να συνδεθεί με το σήμα CASCADEOUT (Cascade) της RAM που βρίσκεται στο κάτω μέρος της διάταξης. Όταν δε χρειάζεται να ενώσουμε δυο RAM τα σήματα CASCADE δεν είναι ανάγκη να συνδεθούν πουθενά. Τα αχρησιμοποίητα pins πρέπει να συνδέονται στην υψηλή κατάσταση Τρόποι λειτουργίας εγγραφής Υπάρχουν 3 τρόποι λειτουργίας εγγραφής στην μνήμη RAM: WRITE_FIRST, READ_FIRST, και NO_CHANGE, και ορίζονται ξεχωριστά για κάθε θύρα. Η προεπιλογή είναι WRITE_FIRST. Στην λειτουργία WRITE_FIRST τα δεδομένα γράφονται στη μνήμη και παράλληλα μεταβιβάζονται στη θύρα δεδομένων εξόδου. Στη λειτουργία READ_FIRST τα δεδομένα που είναι ήδη αποθηκευμένα στη διεύθυνση εγγραφής μεταβιβάζονται στη θύρα δεδομένων εξόδου και μετά γράφονται τα καινούργια δεδομένα στη διεύθυνση εγγραφής. Και τέλος η λειτουργία NO_CHANGE στην οποία η θύρα εξόδου δεν αλλάζει κατά τη διαδικασία εγγραφής και περιέχει τα τελευταία δεδομένα που διαβάστηκαν. 68

70 6.4.4 Αποφυγή σύγκρουσης Επειδή η μνήμη RAM έχει δυο ανεξάρτητες εισόδους που έχουν πρόσβαση σε όλη τη μνήμη, όταν επιχειρούν να χρησιμοποιήσουν το ίδιο μέρος μνήμης, ο χρήστης πρέπει να τηρεί κάποιους περιορισμούς. Έχουμε δυο περιπτώσεις, μια είναι οι δυο είσοδοι να έχουν το ίδιο ρολόι, και μια διαφορετικό ρολόι. Διαφορετικό ρολόι Δεν υπάρχουν περιορισμοί όταν και οι δυο θύρες διαβάζουν δεδομένα. Όταν η μια θύρα γράφει δεδομένα η άλλη δεν πρέπει να πραγματοποιείι λειτουργία εγγραφής ή διαβάσματος που να ξεκινά σε ένα συγκεκριμένο χρονικό παράθυρο του ρολογιού της θύρας που επιχειρεί την εγγραφή. Αν δεν τηρηθεί ο παραπάνω περιορισμός, σε περίπτωση διαβάσματος, τα δεδομένα στην έξοδο θα είναι λάθος και σε περίπτωση εγγραφής τα δεδομένα που θα αποθηκευτούν θα είναι λάθος. Ίδιο ρολόι Δεν υπάρχουν περιορισμοί όταν και οι δυο θύρες διαβάζουν δεδομένα. Όταν η μια θύρα γράφει, η άλλη δεν πρέπει να γράψει στην ίδια θέση εκτός αν γράψει τα ίδια δεδομένα. Όταν μια θύρα γράφει, η άλλη μπορεί να διαβάσει δεδομένα από την ίδια θέση μόνο όταν ο τρόπος λειτουργίας είναι READ_FIRST. Και η έξοδος θα περιέχει τα προηγούμενα δεδομένα. Σε οποιονδήποτε άλλο τρόπο λειτουργίας τα δεδομένα εξόδου είναι λάθος. 6.5 Configurable Logic Blocks (CLBs) Εισαγωγή Τα προγραμματιζόμενα λογικά μπλοκ (CLBs) είναι η κυρία πηγήγια την υλοποίηση ακολουθιακών και συνδυαστικών κυκλωμάτων. Κάθε CLB συνδέεται σε έναν πινάκα διακοπτών και μέσω αυτού στο γενικό πινάκα σύνδεσης. Ένα CLB χωρίζεται σε 4 κομμάτια(slices), τα οποία ανά δυο οργανώνονται σε στήλες. Η αριστερή στήλη ονομάζεται SLICEM και η δεξιά SLICEL. Κάθε στήλη έχει τη δική της γραμμή μεταφοράς, αλλά μόνο η SLICEM έχει και τη δική της γραμμή shift. 69

71 6.5.2 Περιγραφή των CLBs και slices Σε κάθε κομμάτι (slice) υπάρχουν δυο look-up tables, 2 flip-flops, πολυπλέκτες, λογική κρατούμενων και αριθμητικές πύλες. Επιπλέον τα κομμάτια του SLICEM έχουν τη δυνατότητα να χρησιμοποιηθούν ως διανεμημένη μνήμη RAM και Shift registers των 16 bit. Σε ένα CLB έχουμε: Slices LUTs Flip-Flops MULT Arithmetic & Carry Chains Διανεμημένη RAM (μόνο SLICEM) Shift registers(μόνο SLICEM) bits 64 bits Στο XC4VSX35-FF Virtex-4 FPGA υπάρχουν συνολικά: CLBs Γραμμές x στήλες Αριθμός slices Αριθμός LUTS Μέγιστη διανεμημένη RAM ή Shift registers Αριθμός Flip- Flops 96 x 40 15,360 30, ,720 Παρακάτω βλέπουμε τα διαγράμματα των slices των SLICEM και SLICEL: 70

72 71

73 Οι LUTs έχουν 4 εισόδους-1εξοδο και υπάρχουν 2 LUTs ανά slice (F και G). Επιπλέον υπάρχουν και οι πολυπλέκτες MUXF5 και MUXFX. Ο MUXFX μπορεί να ονομάζεται MUXF6, MUXF7 ή MUXF8 ανάλογα με τη θέση του slice στο CLB. Αυτοί οι πολυπλέκτες είναι δυο εισόδων και μιας εξόδου και μπορούν να συνδυαστούν για να πολυπλέξουν από 2 μέχρι και τις 8 εξόδους των LUTs. Παράδειγμα 8:1 multiplexer είναι το παρακάτω: 72

74 Εδώ ο MUXF6 συνδυάζει τις εξόδους των δυο MUXF5 και παράγει την έξοδο OUT_F6. Συνολικά έχουμε 18 εισόδους. Η πολικότητα των Flip-Flop μπορεί να ρυθμιστεί είτε ως ακμής ανόδου είτε ως επιπέδου. Η είσοδός τους οδηγείται από την έξοδο των LUT ή από την είσοδο του slice. Έχουν τα σήματα ελέγχου clock(clk), clock enable(ce) και set/reset(sr), τα οποία έχουν ανεξάρτητες πολικότητες. Οι LUTs στο SLICEM μπορούν να ρυθμιστούν ως 16x1 bit σύγχρονη μνήμη RAM. Σε όλο το CLB μπορούμε να έχουμε 16x4 bit, RAM μονής εισόδου 32x2 bit, RAM μονής εισόδου 64x1 bit, RAM μονής εισόδου 16x2 bit, RAM διπλής εισόδου Επιπλέον οι LUTs και στο SLICEM και στο SLICEL μπορούν να ρυθμιστούν ως 16x1 bit ROM. Και πάλι μπορούμε να έχουμε 16x1 (1 LUT), 32x1 (2 LUT),64x1 (4 LUT),128x1 (8 LUT) και 256x1 (16 LUT από 2 CLB). 73

75 Τέλος οι LUTs στο SLICEM μπορούν να ρυθμιστούν ως 16-bit καταχωρητές μετατόπισης (Shift registers). Έτσι ένας LUT μπορεί να καθυστερήσει σειριακά δεδομένα από 1 έως 16 κύκλους ρολογιού. Συνδυάζοντας όλους τους LUTs στο CLB (4 από το SLICEM) μπορούμε να έχουμε καθυστέρηση μέχρι και 64 κύκλους ρολογιού. Επίσης μπορούν να συνδυαστούν LUTs από διαφορετικά CLBs. Μέσα στα CLB υπάρχει ενσωματωμένη λογική κρατούμενων (carry logic). Υπάρχουν δυο ξεχωριστές αλυσίδες κρατούμενων μια για το SLICEM και μια για το SLICEL, και διατρέχουν το CLB από κάτω προς τα πάνω. Οι γραμμές μεταφοράς κρατούμενου και πολυπλέκτη (MUXCY) μπορούν να χρησιμοποιηθούν για να συνδυαστούν LUTs και να υλοποιηθούν μεγάλες λογικές συναρτήσεις. Επίσης οι πύλες XOR επιτρέπουν την υλοποίηση ενός αθροιστή 2 bit μέσα σε ένα slice. Αυτά φαίνονται παρακάτω: 74

76 6.6 XtremeDSP Γενικά χαρακτηριστικά Τα DSP48 slices βοηθούν στην υλοποίηση DSP εφαρμογών. Το κάθε slice αποτελείται από ένα πολλαπλασιαστή 18x18 bit συμπληρώματος του δυο, ακολουθούμενο από έναν αθροιστή/συσσωρευτή/αφαιρέτη τριών εισόδων, 48 bit συμπληρώματος του δυο. Το αποτέλεσμα του πολλαπλασιαστή είναι 36 bits και επεκτείνεται προσημασμένα στα 48 bits ώστε να μπει ως είσοδος στον αθροιστή, και ο αθροιστής έχει ως έξοδο έναν αριθμό 48 bits συμπληρώματος του δυο. Τα DSP48 slices μπορούν να συνδυαστούν μεταξύ τους κτίζοντας έτσι μεγαλύτερα DSP που δέχονται μεγαλύτερες εισόδους. Τα DSP slices οργανώνονται σε στήλες. Η συσκευή XC4VSX35 έχει 192 DSP48 σε 4 στήλες Πρότυπο DSP48 Τα σήματα Α[18] και Β[18] είναι οι δυο είσοδοι στον πολλαπλασιαστή. Ανάλογα με το OPMODE, μπορούν επίσης να σχηματίσουν έναν μεγαλύτερο αριθμό Α:B για την είσοδο του 75

77 αθροιστή (A=most significant word, B=least significant word). To C[48] είναι η είσοδος C του αθροιστή. Το OPMODE[7], ανάλογα με την τιμή του, ελέγχει τους πολυπλέκτες X,Y,Z (εξηγείται παρακάτω) και αλλάζει έτσι τον τρόπο λειτουργίας και το αποτέλεσμα στην έξοδο του DSP48 slice. Όταν το σήμα SUBTRACT[1] είναι στο 0 ο αθροιστής κάνει πρόσθεση, ενώ όταν είναι στο 1 αφαίρεση. Το σήμα CARRYIN[1] είναι το σήμα κρατούμενου, και το σήμα CARRYINSEL[2] ελέγχει ποιο σήμα θα επιλεγεί ως σήμα κρατούμενου (00 σημαίνει το CARRYIN). To σήμα CECTRL[1] είναι ένα σήμα clock enable που ενεργοποιεί τους καταχωρητές OPMODEREG και CARRYINSELREG που βρίσκονται στην είσοδο των αντίστοιχων σημάτων OPMODE και CARRYINSEL. Το σήμα CECINSUB[1] είναι ένα σήμα clock enable που ενεργοποιεί τον καταχωρητή SUBTRACTREG που βρίσκεται στη είσοδο του σήματος SUBTRACT. Τo σήμα RSTCTRL[1] είναι το σήμα reset και στους 3 καταχωρητές, όπως φαίνεται και στο σχήμα: Τα σήματα CEA, CEB, CEC, CEM, CEP είναι όλα σήματα clock enable για την ενεργοποίηση των αντίστοιχων καταχωρητών. Οι είσοδοι A και Β μπορούν να έχουν από 0 ως 2 καταχωρητές και τα σήματα C, M και P από 0 έως 1 καταχωρητή. Όπου Α και Β οι είσοδοι του πολλαπλασιαστή, C η τρίτη είσοδος του αθροιστή, M είναι η έξοδος του πολλαπλασιαστή, και P η έξοδος του αθροιστή. Τα σήματα RSTA, RSTB, RSTC, RSTM, RSTP είναι τα σήματα reset των αντίστοιχων καταχωρητών. Οι εν λόγω καταχωρητές φαίνονται παρακάτω: 76

78 77

79 Το σήμα PCIN[48] είναι η είσοδος Z του αθροιστή από ένα προηγούμενο DSP slice. H BCOUT[18] πάει ως είσοδος στο σήμα BCIN[18] του επόμενου DSP slice. H PCOUT[48] πάει ως είσοδος στο PCIN[48] του επόμενου DSP. Και το σήμα P[48] είναι η έξοδος από το DSP slice. Τέλος τα σήματα CECARRYIN[1] και RSTCARRYIN[1] είναι αντίστοιχα με τα σήματα clock enable και reset ενός καταχωρητή στη λογική κρατούμενου (το κύκλωμα που επιλέγει το CIN-carry input του αθροιστή) OPMODE Όπως φαίνεται και από το παραπάνω σχήμα, ανάλογα με την τιμή του OPMODE, αλλάζουν οι είσοδοι του αθροιστή. Η τιμή του OPMODE ελέγχει τους πολυπλέκτες X,Y και Ζ. 78

80 Όπου Shift είναι μια διαδικασία στρογγυλοποίησης. Η γενική μορφή του P=Z ± (X + Y + CIN) (μόνο όταν χρησιμοποιείται η έξοδος του πολλαπλασιαστή χρησιμοποιούνται τα δυο σήματα X και Y ως ένα AxB). Έτσι πχ στην περίπτωση xxx το P=Z ± (AxB + CIN). Στην περίπτωση xxx το P=Z ± (A:B + C + CIN) Λογική κρατούμενων Η τιμή CIN εξαρτάται από τις τιμές OPMODE και CARRYINSEL. 79

81 Οι αντιστοιχίες τιμών OPMODE, CARRYINSEL με το CIN φαίνονται παρακάτω: 80

82 Κεφάλαιο 7 Ανάλυση του AES σε γλώσσα VHDL 7.1 Εισαγωγή Σε αυτό το κεφάλαιο θα δοθεί ένα μέρος του AES και η ανάλυση του σε γλώσσα VHDL. Ο συνολικός αλγόριθμος βρίσκεται στο ΠΡΟΣΑΡΤΗΜΑ Α. Ο αλγόριθμος που θα περιγραφεί υλοποιεί τον AES με μέγεθος κλειδιού 128 bits μόνο. Η γλώσσα VHDL είναι γλώσσα περιγραφής κυκλωματικής διάταξης, έτσι για να υλοποιηθεί σε αυτήν ένας ακολουθιακός αλγόριθμος χρησιμοποιήθηκε μηχανή καταστάσεων η οποία ελέγχεται από την μεταβλητή counter. Η γλώσσα VHDL έχει ως βασικό συστατικό περιγραφής κυκλωμάτων την έννοια των entities, ένα entity είναι ένα μέρος του κυκλώματος το οποίο σχεδιάζεται ξεχωριστά και έπειτα διασυνδέεται με άλλα entities. Η αρχική μορφή του αλγορίθμου AES ήταν η παρακάτω (όπου κάθε κουτάκι είναι ένα entity εκτός των Keyboard και LCD): 81

83 Κάθε γραμμή αναπαριστά ένα δίαυλο επικοινωνίας που περιέχει τα απαραίτητα σήματα κάθε φορά. Η λογική είναι ότι το πληκτρολόγιο δίνει δεδομένα ή εντολές στο entity lcd_psk_interface και αυτή με τη σειρά της παρουσιάζει δεδομένα στην οθόνη LCD και στον controller. O controller ελέγχει τη διαδικασία κρυπτογράφησης και αποκρυπτογράφησης δίνοντας εντολές στα entities Add_round_key, Shift_rows, Mix_Columns και Sub_Bytes να εκτελεστούν με την σωστή σειρά και να αλλάξουν το καθένα με την σειρά του τα περιεχόμενα της μνήμης State_RAM (πίνακας κατάστασης). Ο Controller επίσης ανανεώνει τον πίνακα κατάστασης και το κλειδί όποτε αυτό ζητηθεί από τον χρήστη. Για λόγους δυσκολίας στη μετάφραση τις παραπάνω διάταξης μέσω του προγράμματος ISE της Xilinx, η διάταξη μετατράπηκε στην εξής μορφή: Όπως βλεπουμε το κατω μερος του κυκλωματος περιγραφηκε σε ένα μονο entity, έχοντας συνολικά ένα κύκλωμα αποτελούμενο από δυο μόνο entities το lcd_psk_interface και τον AES_CORE. 7.2 Περιγραφή του AES_CORE Σήματα εισόδου εξόδου Η entity AES_CORE έχει ως εισόδους και εξόδους τα σήματα enable, clock, data_in, data_out, ready και mode. entity AES_CORE is Port ( enable : in STD_LOGIC; clock : in STD_LOGIC; data_in : in STD_LOGIC_VECTOR (127 downto 0); data_out : out STD_LOGIC_VECTOR (127 downto 0):=(others=>'0'); 82

84 ready : out STD_LOGIC; mode : in STD_LOGIC_VECTOR (2 downto 0)); end AES_CORE; Το σήμα enable είναι αυτό που ενεργοποιεί τον AES_CORE σε κάποιο mode λειτουργίας. Το σήμα clock είναι ένα σήμα που παράγεται από την πλακέτα ML402 και είναι 100 MHz (10 ns/cycle), το οποίο λόγω προβλημάτων που πρόεκυψαν, διαιρείται εσωτερικά στον AES_CORE και έτσι ο AES_CORE τρέχει στα 25 MHz (40 ns/cycle). Τα σήματα data_in και data_out χρησιμοποιούνται για είσοδο και έξοδο του πίνακα κατάστασης και του κλειδιού. Τέλος το σήμα ready ενεργοποιείται όταν ολοκληρωθεί το mode λειτουργίας που ζητήθηκε από το χρήστη Mode λειτουργίας case counter is when 0 => if(mode(2 downto 0)="000") then counter<=1; elsif(mode(2 downto 0)="001") then counter<=2; elsif(mode(2 downto 0)="010") then counter<=6; elsif(mode(2 downto 0)="011") then counter<=7; elsif(mode(2 downto 0)="100") then counter<=8; elsif(mode(2 downto 0)="101") then counter<=30; else counter<=50000; --update state --update key --output state --output key --encrypt --decrypt Όταν το σήμα mode = 000 τότε το περιεχόμενο του σήματος data_in αντιγράφεται στην εσωτερική μεταβλητή state,όταν το σήμα mode = 001 το περιεχόμενο του σήματος data_in αντιγράφεται στην εσωτερική μεταβλητή key η οποία είναι ουσιαστικά ένας πίνακας 44 ων θέσεων στοιχείων των 32 bits και στη συνέχεα εκτελείται η διαδικασία επέκτασης κλειδιού. Οι πρώτες 4 θέσεις είναι το κλειδί που δίνει ο χρήστης και οι υπόλοιπες αποτελούνται από τα κλειδιά που προκύπτουν από την επέκταση του κλειδιού. Όταν το σήμα mode = 010 τότε το περιεχόμενο τις μεταβλητής state αντιγράφεται στο σήμα data_out και όταν mode = 011 τότε τα 4 πρώτα στοιχεία τις μεταβλητής key αντιγράφονται στο σήμα data_out. Τέλος τα mode 100 και 101 αντιστοιχούν στην διαδικασία κρυπτογράφησης και αποκρυπτογράφησης αντίστοιχα Update state when 1=> --update state state(127 downto 0):=data_in(127 downto 0); 83

85 counter<=50000; η εντολή counter<=50000; η οποία παρουσιάζεται συχνά μέσα στον κώδικα οδηγεί την κατάσταση στην εντολή when others=> ready<='1'; Update key when 2=> --update key key(0)(31 downto 0):=data_in(127 downto 96); key(1)(31 downto 0):=data_in(95 downto 64); key(2)(31 downto 0):=data_in(63 downto 32); key(3)(31 downto 0):=data_in(31 downto 0); when 3=> subword(31 downto24):=subbox(conv_integer(key(counter2+3)(23 ηηηηη downto 20)),CONV_INTEGER(key(counter2+3)(19 downto 16)) ); subword(23 downto 16):=SUBBOX(CONV_INTEGER(key(counter2+3)(15 ηηηη downto 12)),CONV_INTEGER(key(counter2+3)(11 downto 8))); subword(15 downto 8):=SUBBOX(CONV_INTEGER(key(counter2+3)(7 downto 4)),CONV_INTEGER(key(counter2+3)(3 downto 0))); subword(7 downto 0):=SUBBOX(CONV_INTEGER(key(counter2+3)(31 downto 28)),CONV_INTEGER(key(counter2+3)(27 downto 24))); case counter2 is when 0=> subword2 :=x" "; when 4=> subword2 :=x" "; when 8=> subword2 :=x" "; when 12=> subword2 :=x" "; when 16=> subword2 :=x" "; when 20=> subword2 :=x" "; when 24=> subword2 :=x" "; when 28=> subword2 :=x" "; when 32=> subword2 :=x"1b000000"; when 36=> subword2 :=x" "; when others =>null; end case; when 4=> key(counter2+4):=key(counter2) xor subword xor subword2; when 5=> key(counter2+5):=key(counter2+4) xor key(counter2+1); ηη key(counter2+6):=key(counter2+4) xor key(counter2+1) xor mmmmmmmmmmmmmmmmmmmmmmmmm key(counter2+2); 84

86 key(counter2+7):=key(counter2+4) xor key(counter2+1) xor mmmmmmmmmmmmmmmmmmmmmmmm key(counter2+2) xor key(counter2+3); if (counter2=36) then counter<=50000; else counter<=3; counter2<=counter2+4; Όταν ο counter είναι 2, τα τέσσερα πρώτα στοιχεία του πίνακα key αντιστοιχούν στο κλειδί του χρήστη και στην συνέχεια για counter από 3 έως 5 εκτελείται η επέκταση του κλειδιού για 10 γύρους (με την βοήθεια του counter2 και μέσω του έλεγχου του στο case when 5). Συνολικά έχουμε χρόνο εκτέλεσης της εντολής: 1+3*10=31 γύρους=>40ns*31=1240ns Output key and state when 6=> --output state data_out(127 downto 0)<=state(127 downto 0); counter<=50000; when 7=> --output key data_out(127 downto 96)<=key(0)(31 downto 0); data_out(95 downto 64)<=key(1)(31 downto 0); data_out(63 downto 32)<=key(2)(31 downto 0); data_out(31 downto 0)<=key(3)(31 downto 0); counter<=50000; Κρυπτογράφηση Ως παράδειγμα θα δοθούν μόνο 2 συναρτήσεις, η Add_round_key και η Shift_rows. when 10=> -- Shift_rows tempbyte1<=state(119 downto 112); tempbyte2<=state(111 downto 104); tempbyte3<=state(103 downto 96); tempbyte4<=state(79 downto 72); tempbyte5<=state(55 downto 48); tempbyte6<=state(39 downto 32); when 11=> state(119 downto 112):=state(87 downto 80); state(111 downto 104):=state(47 downto 40); state(103 downto 96):=state(7 downto 0); state(79 downto 72):=state(15 downto 8); state(55 downto 48):=state(23 downto 16); state(39 downto 32):=state(71 downto 64); when 12=> state(23 downto 16):=tempbyte1; state(47 downto 40):=tempbyte2; state(71 downto 64):=tempbyte3; 85

87 state(15 downto 8):=tempbyte4; state(87 downto 80):=tempbyte5; state(7 downto 0):=tempbyte6; Στη Shift_rows η μετακίνηση των γραμμών γίνεται μέσω τις βοήθειας των tempbyte1-6 όπως φαίνεται και στον πίνακα κατάστασης που παρουσιάζεται παρακάτω: Όπου t1-6 αντιστοιχούν στις μεταβλητές tempbyte1-6. when 17=> --Add_round_key state(127 downto 96):=state(127 downto 96) xor key(counter2)(31 gggggggggggggggggggdownto 0); state(95 downto 64):=state(95 downto 64) xor key(counter2+1)(31 gggggggggggggggggggdownto 0); state(63 downto 32):=state(63 downto 32) xor key(counter2+2)(31 gggggggggggggggggggdownto 0); state(31 downto 0):=state(31 downto 0) xor key(counter2+3)(31 gggggggggggggggggggdownto 0); Στην Add_round_key το κλειδί γύρου προστίθεται στον πίνακα κατάστασης. Συνολικά έχουμε χρόνο εκτέλεσης της εντολής: 78 γύρους=>40ns*78=3120ns. Ο συνολικός αλγόριθμος βρίσκεται στο ΠΡΟΣΑΡΤΗΜΑ Α. 7.3 Περιγραφή του lcd_psk_interface Σήματα εισόδου εξόδου entity lcd_psk is Port ( clk: in STD_LOGIC; rw : out STD_LOGIC; rs:out STD_LOGIC; e:out STD_LOGIC; led1:out STD_LOGIC:='0'; led2:out STD_LOGIC:='1'; psclk:in STD_LOGIC; psdata:in STD_LOGIC; 86

88 aes_core_enable : out STD_LOGIC; aes_core_data_in : out STD_LOGIC_VECTOR (127 downto 0); aes_core_data_out : in STD_LOGIC_VECTOR (127 downto 0); aes_core_ready : in STD_LOGIC; aes_core_mode : out STD_LOGIC_VECTOR (2 downto 0); db : out STD_LOGIC_VECTOR (3 downto 0)); end lcd_psk; Το σήμα clk είναι το σήμα της πλακέτας ML402 με συχνότητα 100 MHz. Τα σήματα aes_core_enable,aes_core_data_in, aes_core_data_out, aes_core_ready, aes_core_mode είναι τα σήματα επικοινωνίας με τον AES_CORE. Τα led1,led2 είναι δυο led της πλακέτας, τα οποία δείχνουν αν ο χρήστης επιθυμεί να εισάγει κείμενο (led2) ή κλειδί (led1). Τα σήματα rw,rs,e,db είναι τα σήματα επικοινωνίας με την οθόνη LCD, ενώ τα psclk, psdata είναι τα σήματα εισόδου από το πληκτρολόγιο Είσοδος από το πληκτρολόγιο process (psclock) begin if (psclock'event and psclock='0') then case counter3 is when 0=> counter_reset<='1'; counter3<=counter3+1; counter4<=counter4+1; enable_main <=0; when 1=> data2(0)<=psdata; counter3<=counter3+1; when 2=> data2(1)<=psdata; counter3<=counter3+1; when 3=> data2(2)<=psdata; counter3<=counter3+1; when 4=> data2(3)<=psdata; counter3<=counter3+1; when 5=> data2(4)<=psdata; counter3<=counter3+1; when 6=> data2(5)<=psdata; counter3<=counter3+1; when 7=> data2(6)<=psdata; counter3<=counter3+1; when 8=> 87

89 data2(7)<=psdata; counter3<=counter3+1; when 9=> counter3<=counter3+1; when 10=> if(counter4=3) then enable_main <=1; counter_reset<='0'; counter4<=0; counter3<=0; when others => end case ; end process; Όταν πατηθεί ένα πλήκτρο το πληκτρολόγιο στέλνει μέσω του psdata 3 byte. Το πρώτο byte αντιστοιχεί στον κωδικό του πλήκτρου που πατήθηκε, το δεύτερο byte είναι το F0 και τέλος ξαναστέλνεται ο κωδικός του byte που πατήθηκε. Όπως φαίνεται από τον παραπάνω κώδικα αγνοούνται τα 2 πρώτα bytes (μέσω του counter4) και το τρίτο στέλνεται στην κύρια διαδικασία main:process (η οποία ενεργοποιείται μέσω του σήματος enable_main). Η λογική αποστολής κάθε byte φαίνεται παρακάτω: Η πτώση του σήματος psclock δηλώνει ότι το σήμα psdata είναι έγκυρο. Η αποστολή του byte γίνεται ουσιαστικά με 11 bits. Ένα bit αρχής 0, μετά 8 bits με τον κωδικό του πλήκτρου, ένα bit ισοτιμίας και ένα bit τέλους 1. Για αυτόν το λόγο ο counter3 έχει εύρος από 0 έως 10, με ουσιαστικά δεδομένα από 1 έως 8. Οι κωδικοί του πληκτρολογίου φαίνονται παρακάτω: 88

90 7.3.3 Η διαδικασία main:process main:process (clk2ms) begin if(counter_reset='1') then if(counter=0) then counter<=0; counter5<=0; aes_core_enable<='0'; else counter<=18; counter5<=0; aes_core_enable<='0'; elsif(clk2ms'event and clk2ms='0') then if (enable_main =1) then case counter is --reset the screen when 18 => case data2(7 downto 0) is when x"45" => --0 data(7 downto 0) <=x"30"; actual_data2(3 downto 0)<="0000"; when x"16" => --1 data(7 downto 0) <=x"31"; actual_data2(3 downto 0)<="0001"; when x"1e" => --2 data(7 downto 0) <=x"32"; actual_data2(3 downto 0)<="0010"; when x"76" => --ESC button 89

91 counter<=200; when x"66" => --Backspace button counter<=300; when x"05" => --F1 = reset1 button counter<=500; when x"06" => --F2 = reset1 button counter<=600; when x"2c" => --T = Text mode mode<='0'; led2<='1'; led1<='0'; counter<=5000; when x"42" => --K = Key mode mode<='1'; led2<='0'; led1<='1'; counter<=5000; when x"5a" => --Enter counter<=800; when x"1a" => --Z=encrypt counter<=900; when x"22"=> --X=decrypt counter<=1200; when x"41" => --< = show text counter<=1000; when x"49" => --> = show key counter<=1010; when others=> counter<=5000; --case others end case; when 19 => --print data to LCD screen --etc Όταν πατηθεί ένα πλήκτρο ενεργοποιείται το σήμα enable_main το οποίο ενεργοποιεί τη διαδικασία main:process. Την πρώτη φορά που τρέχει η main:process αρχικοποιείται η οθόνη LCD. Έπειτα ανάλογα με το ποιο πλήκτρο πατήθηκε εκτελείται το ανάλογο μέρος της μηχανής κατάστασης (το ανάλογο εύρος counter). Τα πλήκτρο 0,1 F εκτυπώνουν στη οθόνη τον αντίστοιχο χαρακτήρα και αποθηκεύουν τα δεδομένα. Τα πλήκτρο F1,F2 χρησιμοποιούνται για την αρχικοποίηση της οθόνης, το ESC καθαρίζει την οθόνη, το πλήκτρο enter ενημερώνει το κλειδί αν έχει πατηθεί τελευταίο το πλήκτρο Κ ή το κείμενο αν έχει πατηθεί τελευταίο το πλήκτρο Τ. Το Ζ κάνει κρυπτογράφηση και το Χ αποκρυπτογράφηση ενώ τα <,> εμφανίζουν στην οθόνη το κείμενο και κλειδί αντίστοιχα Ρολόι 2 ms process (clk) begin 90

92 if(clk'event and clk='0') then if (counter2= ) then counter2<=0; clk2ms<=not clk2ms; else counter2<=counter2+1; end process; Η οθόνη έχει κάποιες χρονικές προδιαγραφές. Η βασικότερη είναι ο χρόνος εκτέλεσης μιας εντολής. Ενώ οι περισσότερες εκτελούνται σε 37μs, υπάρχει μια που τρέχει σε 1,57ms, έτσι για λόγους γενικότητας χρησιμοποιήθηκε ρολόι 2ms. 7.4 Περιγραφή του TOP Σήματα εισόδου εξόδου Η entity TOP το μόνο που κάνει είναι να περιέχει τις δυο παραπάνω entities AES_CORE και lcd_psk_interface, και να εξηγεί τον τρόπο που συνδέονται μεταξύ τους. Επίσης ορίζονται οι είσοδοι και έξοδοι του FPGA με τον έξω κόσμο, σε αυτήν την περίπτωση οθόνη, πληκτρολόγιο, δυο LED και clock: entity TOP is port( clk: in STD_LOGIC; rw : out STD_LOGIC; rs:out STD_LOGIC; e:out STD_LOGIC; led1:out STD_LOGIC:='0'; led2:out STD_LOGIC:='1'; psclk:in STD_LOGIC; psdata:in STD_LOGIC; db : out STD_LOGIC_VECTOR (3 downto 0)); end TOP; Προσομοίωση Ο κώδικας που βρίσκεται στο τέλος του TOP σε σχόλια χρησιμεύει μόνο για την προσομοίωση του AES_CORE: -- clock_process :process -- begin -- clock <= '0'; -- wait for clock_period/2; -- clock <= '1'; -- wait for clock_period/2; -- end process; 91

93 -- --stim_proc: process -- begin wait for clock_period*10; -- enable<='0'; -- wait for 100 ns; -- data_in<=x"3243f6a8885a308d313198a2e "; -- mode<="000"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 100 ns; -- data_in<=x"2b7e151628aed2a6abf cf4f3c"; -- mode<="001"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 100 ns; -- mode<="100"; -- enable<='1'; -- wait until ready<='1'; -- wait; --end process; Με clock_period= 40ns εισάγουμε το κείμενο "3243f6a8885a308d313198a2e " και το κλειδί "2b7e151628aed2a6abf cf4f3c". Μετά θέτοντας το mode= 100 ζητάμε από τον AES_CORE να κάνει κρυπτογράφηση. Στο παρακάτω σχήμα φαίνεται το αποτέλεσμα της προσομοίωσης. data_out= D02DC09FBDC A0B32 το οποίο είναι το αποτέλεσμα της κρυπτογράφησης. 92

94 Κεφάλαιο 8 Ανάλυση του DES σε γλώσσα VHDL 8.1 Εισαγωγή Σε αυτό το κεφάλαιο θα δοθεί ένα μέρος της περιγραφής του DES και η ανάλυση του σε γλώσσα VHDL. Ο συνολικός αλγόριθμος βρίσκεται στο ΠΡΟΣΑΡΤΗΜΑ Β. Μεγάλο μέρος του κώδικα είναι ίδιο μεταξύ των AES_CORE και DES_CORE. Τα σήματα εισόδου εξόδου είναι ίδια, τα mode λειτουργίας είναι ίδια, ο τρόπος ενημέρωσης της μεταβλητής state είναι ίδιος, το lcd_psk_interface είναι σχεδόν ίδιο (αλλαγές μόνο των μεγεθών κάποιων σημάτων και τρόπου ενημέρωσης της οθόνης). Για αυτόν το λόγο σε αυτό το κεφαλαίο θα γραφτούν μόνο τα σημεία στα οποία το DES_CORE είναι διαφορετικός και αυτά είναι: ο τρόπος επέκτασης κλειδιού και η διαδικασία κρυπτογράφησης και αποκρυπτογράφησης. Η γλώσσα VHDL είναι γλώσσα περιγραφής κυκλωματικής διάταξης, έτσι για να υλοποιηθεί σε αυτήν ένας ακολουθιακός αλγόριθμος χρησιμοποιήθηκε μηχανή καταστάσεων η οποία ελέγχεται από την μεταβλητή counter. Η γλώσσα VHDL έχει ως βασικό συστατικό περιγραφής κυκλωμάτων την έννοια των entities, ένα entity είναι ένα μέρος του κυκλώματος το οποίο σχεδιάζεται ξεχωριστά και έπειτα διασυνδέεται με άλλα entities. Η αρχική μορφή του αλγορίθμου DES ήταν η παρακάτω (όπου κάθε κουτάκι είναι ένα entity εκτός των Keyboard και LCD): Κάθε γραμμή αναπαριστά ένα δίαυλο επικοινωνίας που περιέχει τα απαραίτητα σήματα κάθε φορά. O controller ελέγχει την διαδικασία κρυπτογράφησης και αποκρυπτογράφησης δίνοντας εντολές στις ανάλογες entities να εκτελεστούν με την ανάλογη σειρά. 93

95 Για λόγους δυσκολίας στη μετάφραση της παραπάνω διάταξης μέσω του προγράμματος ISE της Xilinx, η διάταξη μετατράπηκε στην εξής μορφή: Όπως βλέπουμε το κατω μερος του κυκλωματος περιγράφηκε σε ένα μονο entity, έχοντας συνολικά ένα κύκλωμα αποτελούμενο από δυο μόνο entities το lcd_psk_interface και τον DES_CORE. Μορφή ίδια με αυτήν του αλγορίθμου AES. 8.2 Περιγραφή του DES_CORE Update key when 2=> --update key key(0 to 63):=data_in(0 to 63); counter<=counter + 1; when 3=> cn:=key(56)& key(48)& key(40)& key(32)& key(24)& key(16)& key(8) ω & key(0)& key(57)& key(49)& key(41)& key(33)& key(25)& key(17) & β key(9)& key(1)& key(58)& key(50)& key(42)& key(34)& key(26) & β β key(18)& key(10)& key(2)& key(59)& key(51)& key(43)& key(35); dn:=key(62)& key(54)& key(46)& key(38)& key(30)& key(22)& key(14) β & key(6)& key(61)& key(53)& key(45)& key(37)& key(29)& key(21) & ψ key(13)& key(5)& key(60)& key(52)& key(44)& key(36)& key(28) & ψ ψ key(20)& key(12)& key(4)& key(27)& key(19)& key(11)& key(3); counter<=counter + 1; when 4=> if(counter2=0 or counter2=1 or counter2=8 or counter2=15 ) then cn:= cn(1 to 27) & cn(0); dn:= dn(1 to 27) & dn(0); else cn:= cn(2 to 27) & cn(0)& cn(1); dn:= dn(2 to 27) & dn(0)& dn(1); counter<=counter + 1; 94

96 when 5=> key_data(counter2):=cn(13) & cn (16) & cn(10) & cn (23) & cn(0) & η cn (4) & cn(2) & cn (27) & cn(14) & cn (5) & cn(20) η & cn (9) & cn(22) & cn (18) & cn(11) & cn (3) & η η cn(25) & cn (7) & cn(15) & cn (6) & cn(26) & cn (19) η & cn(12) & cn(1) & dn(12) & dn(23) & dn(2) & dn(8) & dn(18) & dn(26) η & dn(1) & dn(11) & dn(22) & dn(16) & dn(4) & dn(19) η & dn(15) & dn(20) & dn(10) & dn(27) & dn(5) & dn(24) η & dn(17) & dn(13) & dn(21) & dn(7) & dn(0) & dn(3) ; counter<=counter + 1; when 6=> if (counter2=15) then counter<= 50000; else counter<=4; counter2<=counter2+1; Όπως αναλύθηκε στο κεφάλαιο 3 στο case 3 εκτελείται ο πίνακας PC1 και έπειτα στο case 4 ανάλογα με τον γύρο γίνονται μια ή δυο αριστερές ολισθήσεις, τέλος στο case 5 υπολογίζεται το κλειδί κάθε γύρου. Συνολικά έχουμε χρόνο εκτέλεσης της εντολής: 2+16*3=50 γύρους=>40ns*50=2000ns Κρυπτογράφηση when 9=> --encrypt --εκτέλεση του πίνακα IP στο state when 10=> --E table --function_f temp3:=(state(63) & state(32) & state(33) & state(34) & n n state(35) & state(36) & state(35) & state(36) & n n n state(37) & state(38) & state(39) & state(40) & n n state(39) & state(40) & state(41) & state(42) & n n state(43) & state(44) & state(43) & state(44) & state(45) & state(46) & state(47) & n n n state(48) & state(47) & state(48) & state(49) & n n n state(50) & state(51) & state(52) & state(51) & n n n n state(52) & state(53) & state(54) & state(55)& n n nn n nnnnnnnnnnnnnnnn state(56) & state(55) & state(56) & state(57)& nnnnnnnnnnnnnnnnnnn state(58) & state(59) & state(60) & state(59)& nnnnnnnnnnnnnnnnnnn state(60) & state(61) & state(62) & state(63) & state(32)) xor key_data(counter2); when 11=> voith1<= temp3(42)& temp3(47); voith2<= temp3(36)& temp3(41); voith3<= temp3(30)& temp3(35); voith4<= temp3(24)& temp3(29); 95

97 voith5<= temp3(18)& temp3(23); voith6<= temp3(12)& temp3(17); voith7<= temp3(6)& temp3(11); voith8<= temp3(0)& temp3(5); counter<= counter+1; when 12=> --s1 s8 tables temp4(28 to 31)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks8(conv_integer(voith1), CONV_INTEGER(temp3(43 to 46))), 4); temp4(24 to 27)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks7(conv_integer(voith2), CONV_INTEGER(temp3(37 to 40))), 4); temp4(20 to 23)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks6( CONV_INTEGER(voith3), CONV_INTEGER(temp3(31 to 34))), 4); temp4(16 to 19)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks5( CONV_INTEGER(voith4), CONV_INTEGER(temp3(25 to 28))), 4); temp4(12 to 15)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks4( CONV_INTEGER(voith5), CONV_INTEGER(temp3(19 to 22))), 4); temp4(8 to 11)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks3( CONV_INTEGER(voith6), CONV_INTEGER(temp3(13 to 16))), 4); temp4(4 to 7)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks2( CONV_INTEGER(voith7), CONV_INTEGER(temp3(7 to 10))), 4); temp4(0 to 3)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks1( CONV_INTEGER(voith8), CONV_INTEGER(temp3(1 to 4))), 4); when 13=> --P table temp4<=temp4(15) & temp4(6) & temp4(19) & temp4(20) & yyyyyyyyyyyyyyyytemp4(28) & temp4(11) & temp4(27) & temp4(16) & temp4(0) & yyyyyyyyyyyyyyyytemp4(14) & temp4(22) & temp4(25) & temp4(4) & temp4(17) & yyyyyyyyyyyyyyyytemp4(30) & temp4(9) & temp4(1) & temp4(7) & temp4(23) & yyyyyyyyyyyyyyyytemp4(13) & temp4(31) & temp4(26) & temp4(2) & temp4(8) & yyyyyyyyyyyyyyyytemp4(18) & temp4(12) & temp4(29) & temp4(5) & temp4(21) & yyyyyyyyyyyyyyyytemp4(10) & temp4(3) & temp4(24); when 14 => -- temp είναι η έξοδος του function_f temp<=temp4 xor state(0 to 31); temp2<=state(32 to 63); counter<=1+counter; when 15 => -- αλλαγή δεξιού και αριστερού μέρους του state if (counter2=15) then state(0 to 31):=temp; counter<=1+counter; else state(0 to 31):=temp2; state(32 to 63):=temp; counter<=10; counter2<=1+counter2; when 16=> --εκτέλεση του πίνακα IP -1 στο state Από το κεφάλαιο 3 για την συνάρτηση f έχουμε ότι τo case 10 είναι το εξής μέρος τις function_f: 96

98 To case 11 και 12 είναι: Το case 13: To case 14 και 15 εκτελούν την αλλαγή μεταξύ του αριστερού ( state(0 to 31) ) και δεξιού ( state(32 to 63) ) μέρους του state: Συνολικά έχουμε χρόνο εκτέλεσης της εντολής: 98 γύρους=>40ns*98=3920ns. Ο συνολικός αλγόριθμος βρίσκεται στο ΠΡΟΣΑΡΤΗΜΑ Β. 8.3 Προσομοίωση του TOP Ο κώδικας που βρίσκεται στο τέλος του TOP σε σχόλια χρησιμεύει μόνο για την προσομοίωση του DES_CORE: 97

99 -- clock_process :process -- begin -- clock <= '0'; -- wait for clock_period/2; -- clock <= '1'; -- wait for clock_period/2; -- end process; stim_proc: process -- begin wait for clock_period*10; -- enable<='0'; -- wait for 500 ns; -- data_in<=x"b3f7d27f8bdf90f2"; -- mode<="000"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 500 ns; -- data_in<=x"3f85e9961f6aedea"; -- mode<="001"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 500 ns; -- mode<="100"; -- enable<='1'; -- wait until ready<='1'; -- wait; --end process; Με clock_period= 40ns εισάγουμε το κείμενο " B3F7D27F8BDF90F2" και το κλειδί "3F85E9961F6AEDEA". Μετά θέτοντας το mode= 100 ζητάμε από τον AES_CORE να κάνει κρυπτογράφηση. Στο παρακάτω σχήμα φαίνεται το αποτέλεσμα της προσομοίωσης. data_out= 1D8153E1F4949D0B το οποίο είναι το αποτέλεσμα της κρυπτογράφησης. 98

100 Κεφάλαιο 9 Υλοποίηση-Ανακεφαλαίωση 9.1 Ανακεφαλαίωση Στην παρούσα διπλωματική αναλύθηκαν οι κρυπτογραφικοί αλγόριθμοι DES και AES και δόθηκε η ανάπτυξη τους σε γλώσσα VHDL.Αναλύθηκε το μαθηματικό υπόβαθρο που είναι απαραίτητο για την κατανόηση των κρυπτογραφικών αλγορίθμων. Παρουσιάστηκαν αναλυτικά οι εσωτερικές δομές και λειτουργίες των AES και DES. Αναλύθηκε η αναπτυξιακή κάρτα ML402 και τα διάφορα εξαρτήματα της και δόθηκε η εσωτερική δομή του Virtex-4 FPGA. Τέλος αναλύθηκαν οι υλοποιήσεις των AES και DES σε γλώσσα περιγραφής VHDL. Ως πρόγραμμα προσομοίωσης και μετάφρασής της VHDL σε κύκλωμα χρησιμοποιήθηκε το ISE τις Xilinx. Όταν ένας αλγόριθμος τρέχει σε hardware τρέχει πολύ πιο γρήγορα από ότι σε software, έτσι μια πιθανή χρήση της υλοποίησης της διπλωματικής είναι η ενσωμάτωση του AES σε ένα router έτσι ώστε η επικοινωνία μεταξύ δυο υπολογιστών να κρυπτογραφείται αυτόματα και γρήγορα μέσω του router. Βασικός λόγος της γρήγορης κρυπτογράφησης είναι η παραλληλοποίηση των εντολών, έτσι πχ κάτι που θέλει 10 εντολές να υλοποιηθεί σε C++ μπορεί να υλοποιηθεί σε 1 κύκλο μηχανής σε VHDL. Στην παρούσα υλοποίηση η κρυπτογράφηση μέσω του AES διαρκεί 3120ns και η κρυπτογράφηση μέσω του DES 3920ns. Αυτοί οι χρόνοι μπορούν να μειωθούν αισθητά περισσότερο αν χρησιμοποιηθούν πίνακες αντιστοιχιών μεταξύ εισόδου και εξόδου για κάποια συνάρτηση, πχ την mix_columns του AES. 9.2 Υλοποίηση Το πρόγραμμα ISE της Xilinx έχει μεταφράσει τον κώδικα VHDL σε αντίστοιχο κύκλωμα για το FPGA και μέσω του προγράμματος Impact της Xilinx έχει περαστεί στην πλακέτα ML

101 Για την παρούσα εργασία δεν υλοποιήθηκε επικοινωνία με υπολογιστή και FPGA, αλλά μόνο με χρήστη μέσω πληκτρολογίου. H ενημέρωση του χρήστη γίνεται μέσω της οθόνης LCD.Το αποτέλεσμα φαίνεται στις παρακάτω εικόνες: Στην παρακάτω εικόνα βλέπουμε την Σύνδεση με τον υπολογιστή μέσω του καλωδίου Parallel cable IV (για προγραμματισμό του FPGA) και την σύνδεση με το πληκτρολόγιο. Κείμενο χαιρετισμού του AES 100

102 Πάτημα των πλήκτρων 0,1.F για την εισαγωγή κειμένου Πάτημα του πλήκτρου Enter για την ενημέρωση κειμένου 101

103 Πάτημα του πλήκτρου Ζ για Κρυπτογράφηση Κείμενο χαιρετισμού του DES 102

104 Βιβλιογραφία [1] Σταύρος Π. Δοκουζγιάννης. Ψηφιακά Συστήματα ΙΙ. Θεσσαλονίκη [2] Σταύρος Π. Δοκουζγιάννης. Ψηφιακά Συστήματα ΙΙΙ. Θεσσαλονίκη. [3] Γ. Πάγκαλος. Ασφάλεια πληροφοριακών συστημάτων. Εκδόσεις ΑΝΙΚΟΥΛΑ [4] Bruce Schneier. Applied cryptography. Publisher: Katherine Schowalter [5] Alfred J. Menezes, Paul C. van Oorschot, Scott A. Vanstone. HANDBOOK of APPLIED k uuuuuuu CRYPTOGRAPHY. Publisher: CRC Press [6] Johannes Buchmann. An Introduction to Cryptography. Publisher: Springer Language. K k 1990 [7] National Institute of Standards and Technology. FIPS 197. Publisher: Federal Information ghhhhhhgh Processing Standards Publication, 2001 [8] National Institute of Standards and Technology. FIPS Publisher: Federal fffffffffffffffffffffinformation Processing Standards Publication, 1999 [9] wikipedia. Data Encryption Standard. Kkkkkkkkkkkkn nnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnnnn 17 October 2010 [10] wikipedia. Advanced Encryption Standard jj jjjjjjjjjjjjjjjjjjjjjjjj nnnnnnnnnn nnnnnnnnnnn nnnnnnnnn October 2010 [11] wikipedia. Finitefield August 2010 [12] wikipedia. Finite field arithmetic. jjjjjjjjjjjjjjjjjjjjjjmarch 2010 [13] wikipedia. Elementary group theory. Jjjjjjjjjjjjjjjjjjjjj nnnnnnnnnnnnn nnnnnnnnnn nnnnnnnn nnnnnnnnnn 4 june 2010 [14] wikipedia. Advanced Encryption Standard jj jjjjjjjjjjjjjjjjjjjjjjj nnnnnnnnnnn nnnnnnnnnnnn nnnnnnnnnn October 2010 [15] wikipedia. Field_(mathematics), jjjjjjjjjjjjjjjjjjjjjjjjseptember 2010 [16] HITACHI. HD44780U (LCD-II) [17] LUMEX. LCM-S01602DTR/M [18] XILINX. ISE In-Depth Tutorial [19] XILINX. Xilinx Parallel Cable IV [20] XILINX. ML401/ML402/ML403 Evaluation Platform User guide [21] XILINX. ML40x Getting Started Tutorial [22] XILINX. Virtex-4 Family Overview [23] XILINX. Virtex-4 FPGA User Guide [24] XILINX. Virtex-4 FPGA Configuration User Guide

105 [25] XILINX. XtremeDSP for Virtex-4 FPGAs User guide [26] XILINX. Virtex-4 FPGA Packaging and Pinout Specification

106 Προσάρτημα Α Ο AES σε VHDL Α.1 TOP library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TOP is port( clk: in STD_LOGIC; rw : out STD_LOGIC; rs:out STD_LOGIC; e:out STD_LOGIC; led1:out STD_LOGIC:='0'; led2:out STD_LOGIC:='1'; psclk:in STD_LOGIC; psdata:in STD_LOGIC; db : out STD_LOGIC_VECTOR (3 downto 0)); end TOP; architecture Behavioral of TOP is signal enable : STD_LOGIC; signal clock : STD_LOGIC; signal data_in : STD_LOGIC_VECTOR (127 downto 0); signal data_out : STD_LOGIC_VECTOR (127 downto 0); signal ready : STD_LOGIC; signal mode : STD_LOGIC_VECTOR (2 downto 0); component AES_CORE is Port ( enable : in STD_LOGIC; clock : in STD_LOGIC; data_in : in STD_LOGIC_VECTOR (127 downto 0); data_out : out STD_LOGIC_VECTOR (127 downto 0); ready : out STD_LOGIC; mode : in STD_LOGIC_VECTOR (2 downto 0)); end component; component lcd_psk is 105

107 Port ( clk: in STD_LOGIC; rw : out STD_LOGIC; rs:out STD_LOGIC; e:out STD_LOGIC; led1:out STD_LOGIC:='0'; led2:out STD_LOGIC:='1'; psclk:in STD_LOGIC; psdata:in STD_LOGIC; aes_core_enable : out STD_LOGIC; aes_core_data_in : out STD_LOGIC_VECTOR (127 downto 0); aes_core_data_out : in STD_LOGIC_VECTOR (127 downto 0); aes_core_ready : in STD_LOGIC; aes_core_mode : out STD_LOGIC_VECTOR (2 downto 0); db : out STD_LOGIC_VECTOR (3 downto 0)); end component; --constant clock_period : time := 40 ns; begin CORE: AES_CORE port map( enable =>enable, clock =>clk, --clock=>clock, data_in => data_in, data_out =>data_out, ready =>ready, mode =>mode); lcd_ps2keybd:lcd_psk port map ( clk=>clk, rw =>rw, rs=>rs, e=>e, led1=>led1, led2=>led2, psclk=>psclk, psdata=>psdata, aes_core_enable=>enable, aes_core_data_in =>data_in, aes_core_data_out=>data_out, aes_core_ready =>ready, aes_core_mode =>mode, db =>db); -- clock_process :process -- begin -- clock <= '0'; -- wait for clock_period/2; -- clock <= '1'; -- wait for clock_period/2; 106

108 -- end process; -- --stim_proc: process -- begin wait for clock_period*10; -- enable<='0'; -- wait for 100 ns; -- data_in<=x"3243f6a8885a308d313198a2e "; -- mode<="000"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 100 ns; -- data_in<=x"2b7e151628aed2a6abf cf4f3c"; -- mode<="001"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 100 ns; -- mode<="100"; -- enable<='1'; -- wait until ready<='1'; -- wait; --end process; end Behavioral; Α.2 AES_CORE library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity AES_CORE is Port ( enable : in STD_LOGIC; clock : in STD_LOGIC; data_in : in STD_LOGIC_VECTOR (127 downto 0); data_out : out STD_LOGIC_VECTOR (127 downto 0):=(others=>'0'); ready : out STD_LOGIC; mode : in STD_LOGIC_VECTOR (2 downto 0)); end AES_CORE; architecture Behavioral of AES_CORE is signal clk40ns: std_logic:='0'; type key_type is array (integer range 0 to 43) of std_logic_vector(31 downto 0); shared variable subword,subword2:std_logic_vector(31 downto 0); 107

109 signal counter,counter2,counter3: integer:=0 ; signal tempbyte1,tempbyte2,tempbyte3,tempbyte4,tempbyte5,tempbyte6: k kkkkkkkkkkkkkkkkkkkkstd_logic_vector(7 downto 0); shared variable temp1,temp2,temp3,temp4: std_logic_vector(10 downto 0); type sbox is array (integer range 0 to 15, integer range 0 to 15) of std_logic_vector(7 downto 0); constant SUBBOX: sbox := ( ( x"63", x"7c", x"77", x"7b", x"f2", x"6b", x"6f", x"c5", x"30", x"01", x"67", x"2b", x"fe", x"d7", x"ab", x"76"), ( x"ca", x"82", x"c9", x"7d", x"fa", x"59", x"47", x"f0", x"ad", x"d4", x"a2", x"af", x"9c", x"a4", x"72", x"c0"), ( x"b7", x"fd", x"93", x"26", x"36", x"3f", x"f7", x"cc", x"34", x"a5", x"e5", x"f1", x"71", x"d8", x"31", x"15"), ( x"04", x"c7", x"23", x"c3", x"18", x"96", x"05", x"9a", x"07", x"12", x"80", x"e2", x"eb", x"27", x"b2", x"75"), ( x"09", x"83", x"2c", x"1a", x"1b", x"6e", x"5a", x"a0", x"52", x"3b", x"d6", x"b3", x"29", x"e3", x"2f", x"84"), ( x"53", x"d1", x"00", x"ed", x"20", x"fc", x"b1", x"5b", x"6a", x"cb", x"be", x"39", x"4a", x"4c", x"58", x"cf"), ( x"d0", x"ef", x"aa", x"fb", x"43", x"4d", x"33", x"85", x"45", x"f9", x"02", x"7f", x"50", x"3c", x"9f", x"a8"), ( x"51", x"a3", x"40", x"8f", x"92", x"9d", x"38", x"f5", x"bc", x"b6", x"da", x"21", x"10", x"ff", x"f3", x"d2"), ( x"cd", x"0c", x"13", x"ec", x"5f", x"97", x"44", x"17", x"c4", x"a7", x"7e", x"3d", x"64", x"5d", x"19", x"73"), ( x"60", x"81", x"4f", x"dc", x"22", x"2a", x"90", x"88", x"46", x"ee", x"b8", x"14", x"de", x"5e", x"0b", x"db"), ( x"e0", x"32", x"3a", x"0a", x"49", x"06", x"24", x"5c", x"c2", x"d3", x"ac", x"62", x"91", x"95", x"e4", x"79"), ( x"e7", x"c8", x"37", x"6d", x"8d", x"d5", x"4e", x"a9", x"6c", x"56", x"f4", x"ea", x"65", x"7a", x"ae", x"08"), ( x"ba", x"78", x"25", x"2e", x"1c", x"a6", x"b4", x"c6", x"e8", x"dd", x"74", x"1f", x"4b", x"bd", x"8b", x"8a"), ( x"70", x"3e", x"b5", x"66", x"48", x"03", x"f6", x"0e", x"61", x"35", x"57", x"b9", x"86", x"c1", x"1d", x"9e"), ( x"e1", x"f8", x"98", x"11", x"69", x"d9", x"8e", x"94", x"9b", x"1e", x"87", x"e9", x"ce", x"55", x"28", x"df"), ( x"8c", x"a1", x"89", x"0d", x"bf", x"e6", x"42", x"68", x"41", x"99", x"2d", x"0f", x"b0", x"54", x"bb", x"16")); constant INVSUBBOX: sbox := ( ( x"52", x"09", x"6a", x"d5", x"30", x"36", x"a5", x"38", x"bf", x"40", x"a3", x"9e", x"81", x"f3", x"d7", x"fb" ), ( x"7c", x"e3", x"39", x"82", x"9b", x"2f", x"ff", x"87", x"34", x"8e", x"43", x"44", x"c4", x"de", x"e9", x"cb" ), ( x"54", x"7b", x"94", x"32", x"a6", x"c2", x"23", x"3d", x"ee", x"4c", x"95", x"0b", x"42", x"fa", x"c3", x"4e" ), ( x"08", x"2e", x"a1", x"66", x"28", x"d9", x"24", x"b2", x"76", x"5b", x"a2", x"49", x"6d", x"8b", x"d1", x"25" ), ( x"72", x"f8", x"f6", x"64", x"86", x"68", x"98", x"16", x"d4", x"a4", x"5c", x"cc", x"5d", x"65", x"b6", x"92" ), ( x"6c", x"70", x"48", x"50", x"fd", x"ed", x"b9", x"da", x"5e", x"15", x"46", x"57", x"a7", x"8d", x"9d", x"84" ), 108

110 ( x"90", x"d8", x"ab", x"00", x"8c", x"bc", x"d3", x"0a", x"f7", x"e4", x"58", x"05", x"b8", x"b3", x"45", x"06" ), ( x"d0", x"2c", x"1e", x"8f", x"ca", x"3f", x"0f", x"02", x"c1", x"af", x"bd", x"03", x"01", x"13", x"8a", x"6b" ), ( x"3a", x"91", x"11", x"41", x"4f", x"67", x"dc", x"ea", x"97", x"f2", x"cf", x"ce", x"f0", x"b4", x"e6", x"73" ), ( x"96", x"ac", x"74", x"22", x"e7", x"ad", x"35", x"85", x"e2", x"f9", x"37", x"e8", x"1c", x"75", x"df", x"6e" ), ( x"47", x"f1", x"1a", x"71", x"1d", x"29", x"c5", x"89", x"6f", x"b7", x"62", x"0e", x"aa", x"18", x"be", x"1b" ), ( x"fc", x"56", x"3e", x"4b", x"c6", x"d2", x"79", x"20", x"9a", x"db", x"c0", x"fe", x"78", x"cd", x"5a", x"f4" ), ( x"1f", x"dd", x"a8", x"33", x"88", x"07", x"c7", x"31", x"b1", x"12", x"10", x"59", x"27", x"80", x"ec", x"5f" ), ( x"60", x"51", x"7f", x"a9", x"19", x"b5", x"4a", x"0d", x"2d", x"e5", x"7a", x"9f", x"93", x"c9", x"9c", x"ef" ), ( x"a0", x"e0", x"3b", x"4d", x"ae", x"2a", x"f5", x"b0", x"c8", x"eb", x"bb", x"3c", x"83", x"53", x"99", x"61" ), ( x"17", x"2b", x"04", x"7e", x"ba", x"77", x"d6", x"26", x"e1", x"69", x"14", x"63", x"55", x"21", x"0c", x"7d" )); begin process (clock) begin if(clock'event and clock='0') then if (counter3= 1) then counter3<=0; clk40ns<=not clk40ns; else counter3<=counter3+1; end process; main:process(clk40ns) variable key: key_type; variable state:std_logic_vector (127 downto 0); begin if (enable='0' or enable='z') then counter<=0; counter2<=0; ready<='0'; elsif(clk40ns'event and clk40ns='0') then case counter is when 0 => if(mode(2 downto 0)="000") then counter<=1; elsif(mode(2 downto 0)="001") then counter<=2; elsif(mode(2 downto 0)="010") then --update state --update key --output state 109

111 counter<=6; elsif(mode(2 downto 0)="011") then --output key counter<=7; elsif(mode(2 downto 0)="100") then --encrypt counter<=8; elsif(mode(2 downto 0)="101") then --decrypt counter<=30; else counter<=50000; when 1=> --update state state(127 downto 0):=data_in(127 downto 0); counter<=50000; when 2=> --update key key(0)(31 downto 0):=data_in(127 downto 96); key(1)(31 downto 0):=data_in(95 downto 64); key(2)(31 downto 0):=data_in(63 downto 32); key(3)(31 downto 0):=data_in(31 downto 0); when 3=> subword(31 downto24):=subbox(conv_integer(key(counter2+3)(23 ηηηηη downto 20)),CONV_INTEGER(key(counter2+3)(19 downto 16)) ); subword(23 downto 16):=SUBBOX(CONV_INTEGER(key(counter2+3)(15 ηηηη downto 12)),CONV_INTEGER(key(counter2+3)(11 downto 8))); subword(15 downto 8):=SUBBOX(CONV_INTEGER(key(counter2+3)(7 downto 4)),CONV_INTEGER(key(counter2+3)(3 downto 0))); subword(7 downto 0):=SUBBOX(CONV_INTEGER(key(counter2+3)(31 downto 28)),CONV_INTEGER(key(counter2+3)(27 downto 24))); case counter2 is when 0=> subword2 :=x" "; when 4=> subword2 :=x" "; when 8=> subword2 :=x" "; when 12=> subword2 :=x" "; when 16=> subword2 :=x" "; when 20=> subword2 :=x" "; when 24=> subword2 :=x" "; when 28=> subword2 :=x" "; when 32=> subword2 :=x"1b000000"; when 36=> subword2 :=x" "; when others =>null; end case; 110

112 when 4=> key(counter2+4):=key(counter2) xor subword xor subword2; when 5=> key(counter2+5):=key(counter2+4) xor key(counter2+1); ηη key(counter2+6):=key(counter2+4) xor key(counter2+1) xor mmmmmmmmmmmmmmmmmmmmmmmmm key(counter2+2); key(counter2+7):=key(counter2+4) xor key(counter2+1) xor mmmmmmmmmmmmmmmmmmmmmmmm key(counter2+2) xor key(counter2+3); if (counter2=36) then counter<=50000; else counter<=3; counter2<=counter2+4; when 6=> when 7=> --output state data_out(127 downto 0)<=state(127 downto 0); counter<=50000; --output key data_out(127 downto 96)<=key(0)(31 downto 0); data_out(95 downto 64)<=key(1)(31 downto 0); data_out(63 downto 32)<=key(2)(31 downto 0); data_out(31 downto 0)<=key(3)(31 downto 0); counter<=50000; when 8=> --add_round_key(0) --encrypt state(127 downto 96):=state(127 downto 96) xor key(0)(31 downto 0); state(95 downto 64):=state(95 downto 64) xor key(1)(31 downto 0); state(63 downto 32):=state(63 downto 32) xor key(2)(31 downto 0); state(31 downto 0):=state(31 downto 0) xor key(3)(31 downto 0); counter2<=counter2+4; when 9=> --Sub_Bytes state(127 downto 120):=SUBBOX(CONV_INTEGER(state(127 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk124)),conv_integer(state(123 downto 120) )); state(119 downto 112):=SUBBOX(CONV_INTEGER(state(119 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 116)),CONV_INTEGER(state(115 downto 112) )); state(111 downto 104):=SUBBOX(CONV_INTEGER(state(111 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 108)),CONV_INTEGER(state(107 downto 104)) ); state(103 downto 96):=SUBBOX(CONV_INTEGER(state(103 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 100)),CONV_INTEGER(state(99 downto 96)) ); state(95 downto 88):=SUBBOX(CONV_INTEGER(state(95 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 92)),CONV_INTEGER(state(91 downto 88)) ); state(87 downto 80):=SUBBOX(CONV_INTEGER(state(87 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 84)),CONV_INTEGER(state(83 downto 80)) ); state(79 downto 72):=SUBBOX(CONV_INTEGER(state(79 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 76)),CONV_INTEGER(state(75 downto 72)) ); 111

113 state(71 downto 64):=SUBBOX(CONV_INTEGER(state(71 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 68)),CONV_INTEGER(state(67 downto 64)) ); state(63 downto 56):=SUBBOX(CONV_INTEGER(state(63 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 60)),CONV_INTEGER(state(59 downto 56)) ); state(55 downto 48):=SUBBOX(CONV_INTEGER(state(55 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 52)),CONV_INTEGER(state(51 downto 48)) ); state(47 downto 40):=SUBBOX(CONV_INTEGER(state(47 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 44)),CONV_INTEGER(state(43 downto 40)) ); state(39 downto 32):=SUBBOX(CONV_INTEGER(state(39 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 36)),CONV_INTEGER(state(35 downto 32)) ); state(31 downto 24):=SUBBOX(CONV_INTEGER(state(31 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 28)),CONV_INTEGER(state(27 downto 24)) ); state(23 downto 16):=SUBBOX(CONV_INTEGER(state(23 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 20)),CONV_INTEGER(state(19 downto 16)) ); state(15 downto 8):=SUBBOX(CONV_INTEGER(state(15 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 12)),CONV_INTEGER(state(11 downto 8)) ); state(7 downto 0):=SUBBOX(CONV_INTEGER(state(7 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 4)),CONV_INTEGER(state(3 downto 0)) ); when 10=> --shift_rows tempbyte1<=state(119 downto 112); tempbyte2<=state(111 downto 104); tempbyte3<=state(103 downto 96); tempbyte4<=state(79 downto 72); tempbyte5<=state(55 downto 48); tempbyte6<=state(39 downto 32); when 11=> state(119 downto 112):=state(87 downto 80); state(111 downto 104):=state(47 downto 40); state(103 downto 96):=state(7 downto 0); state(79 downto 72):=state(15 downto 8); state(55 downto 48):=state(23 downto 16); state(39 downto 32):=state(71 downto 64); when 12=> state(23 downto 16):=tempbyte1; state(47 downto 40):=tempbyte2; state(71 downto 64):=tempbyte3; state(15 downto 8):=tempbyte4; state(87 downto 80):=tempbyte5; state(7 downto 0):=tempbyte6; when 13=> --Mix_Columns --calc (127 downto 120); temp1(8 downto 0):=state(127 downto 120) & '0' xor state(119 downto 112) & '0' xor '0' & state(119 downto 112) xor '0' & state(111 downto 104) xor '0' & state(103 downto 96); 112

114 --calc(119 downto 112) temp2(8 downto 0):='0' & state(127 downto 120) xor state(119 downto 112)& '0' xor state(111 downto 104) & '0' xor '0' & state(111 downto 104) xor '0' & state(103 downto 96); --calc(111 downto 104) temp3(8 downto 0):='0' & state(127 downto 120) xor '0' & state(119 downto 112) xor state(111 downto 104) & '0' xor state(103 downto 96) & '0' xor '0' & state(103 downto 96) ; --calc(103 downto 96) temp4(8 downto 0):= state(127 downto 120) & '0' xor '0' & state(127 downto 120) xor '0' & state(119 downto 112) xor '0' & state(111 downto 104)xor state(103 downto 96) & '0' ; if(temp1(8)='1') then temp1(7 downto 0):=temp1(7 downto 0) xor " "; if(temp2(8)='1') then temp2(7 downto 0):=temp2(7 downto 0) xor " "; if(temp3(8)='1') then temp3(7 downto 0):=temp3(7 downto 0) xor " "; if(temp4(8)='1') then temp4(7 downto 0):=temp4(7 downto 0) xor " "; when 14=> state(127 downto 120):=temp1(7 downto 0); state(119 downto 112):=temp2(7 downto 0); state(111 downto 104):=temp3(7 downto 0); state(103 downto 96):=temp4(7 downto 0); --calc (95 downto 88) temp1(8 downto 0):=state(95 downto 88) & '0' xor state(87 downto 80) & '0' xor '0' & state(87 downto 80) xor '0' & state(79 downto 72) xor '0' & state(71 downto 64); --calc(87 downto 80) temp2(8 downto 0):='0' & state(95 downto 88) xor state(87 downto 80) & '0' xor 113

115 state(79 downto 72) & '0' xor '0' & state(79 downto 72) xor '0' & state(71 downto 64); --calc(79 downto 72) temp3(8 downto 0):='0' & state(95 downto 88) xor '0' & state(87 downto 80) xor state(79 downto 72) & '0' xor state(71 downto 64) & '0' xor '0' & state(71 downto 64) ; --calc(71 downto 64) temp4(8 downto 0):= state(95 downto 88) & '0' xor '0' & state(95 downto 88) xor '0' & state(87 downto 80) xor '0' & state(79 downto 72) xor state(71 downto 64) & '0' ; if(temp1(8)='1') then temp1(7 downto 0):=temp1(7 downto 0) xor " "; if(temp2(8)='1') then temp2(7 downto 0):=temp2(7 downto 0) xor " "; if(temp3(8)='1') then temp3(7 downto 0):=temp3(7 downto 0) xor " "; if(temp4(8)='1') then temp4(7 downto 0):=temp4(7 downto 0) xor " "; when 15=> state(95 downto 88):=temp1(7 downto 0); state(87 downto 80):=temp2(7 downto 0); state(79 downto 72):=temp3(7 downto 0); state(71 downto 64):=temp4(7 downto 0); --calc (63 downto 56) temp1(8 downto 0):=state(63 downto 56) & '0' xor state(55 downto 48) & '0' xor '0' & state(55 downto 48) xor '0' & state(47 downto 40) xor '0' & state(39 downto 32); --calc(55 downto 48) temp2(8 downto 0):='0' & state(63 downto 56) xor state(55 downto 48) & '0' xor state(47 downto 40) & '0' xor '0' & state(47 downto 40) xor '0' & state(39 downto 32); 114

116 --calc(47 downto 40) temp3(8 downto 0):='0' & state(63 downto 56) xor '0' & state(55 downto 48) xor state(47 downto 40) & '0' xor state(39 downto 32) & '0' xor '0' & state(39 downto 32) ; --calc(39 downto 32) temp4(8 downto 0):= state(63 downto 56) & '0' xor '0' & state(63 downto 56) xor '0' & state(55 downto 48) xor '0' & state(47 downto 40) xor state(39 downto 32) & '0' ; if(temp1(8)='1') then temp1(7 downto 0):=temp1(7 downto 0) xor " "; if(temp2(8)='1') then temp2(7 downto 0):=temp2(7 downto 0) xor " "; if(temp3(8)='1') then temp3(7 downto 0):=temp3(7 downto 0) xor " "; if(temp4(8)='1') then temp4(7 downto 0):=temp4(7 downto 0) xor " "; when 16=> state(63 downto 56):=temp1(7 downto 0); state(55 downto 48):=temp2(7 downto 0); state(47 downto 40):=temp3(7 downto 0); state(39 downto 32):=temp4(7 downto 0); --calc (31 downto 24) temp1(8 downto 0):=state(31 downto 24) & '0' xor state(23 downto 16) & '0' xor '0' & state(23 downto 16) xor '0' & state(15 downto 8) xor '0' & state(7 downto 0); --calc(23 downto 16) temp2(8 downto 0):='0' & state(31 downto 24) xor state(23 downto 16) & '0' xor state(15 downto 8) & '0' xor '0' & state(15 downto 8) xor '0' & state(7 downto 0); --calc(15 downto 8) temp3(8 downto 0):='0' & state(31 downto 24) xor '0' & state(23 downto 16) xor 115

117 state(15 downto 8) & '0' xor state(7 downto 0) & '0' xor '0' & state(7 downto 0) ; --calc(7 downto 0) temp4(8 downto 0):= state(31 downto 24) & '0' xor '0' & state(31 downto 24) xor '0' & state(23 downto 16) xor '0' & state(15 downto 8) xor state(7 downto 0) & '0' ; if(temp1(8)='1') then temp1(7 downto 0):=temp1(7 downto 0) xor " "; if(temp2(8)='1') then temp2(7 downto 0):=temp2(7 downto 0) xor " "; if(temp3(8)='1') then temp3(7 downto 0):=temp3(7 downto 0) xor " "; if(temp4(8)='1') then temp4(7 downto 0):=temp4(7 downto 0) xor " "; state(31 downto 24):=temp1(7 downto 0); state(23 downto 16):=temp2(7 downto 0); state(15 downto 8):=temp3(7 downto 0); state(7 downto 0):=temp4(7 downto 0); when 17=> --add_round_key state(127 downto 96):=state(127 downto 96) xor key(counter2)(31 downto 0); state(95 downto 64):=state(95 downto 64) xor key(counter2+1)(31 downto 0); state(63 downto 32):=state(63 downto 32) xor key(counter2+2)(31 downto 0); state(31 downto 0):=state(31 downto 0) xor kkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkk key(counter2+3)(31 downto 0); if(counter2=36) then else counter2<=counter2+4; counter<=9; when 18=> --Sub_Bytes state(127 downto 120):=SUBBOX(CONV_INTEGER(state(127 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk124)),conv_integer(state(123 downto 120) )); state(119 downto 112):=SUBBOX(CONV_INTEGER(state(119 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 116)),CONV_INTEGER(state(115 downto 112) )); state(111 downto 104):=SUBBOX(CONV_INTEGER(state(111 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 108)),CONV_INTEGER(state(107 downto 104)) ); 116

118 state(103 downto 96):=SUBBOX(CONV_INTEGER(state(103 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 100)),CONV_INTEGER(state(99 downto 96)) ); state(95 downto 88):=SUBBOX(CONV_INTEGER(state(95 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 92)),CONV_INTEGER(state(91 downto 88)) ); state(87 downto 80):=SUBBOX(CONV_INTEGER(state(87 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 84)),CONV_INTEGER(state(83 downto 80)) ); state(79 downto 72):=SUBBOX(CONV_INTEGER(state(79 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 76)),CONV_INTEGER(state(75 downto 72)) ); state(71 downto 64):=SUBBOX(CONV_INTEGER(state(71 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 68)),CONV_INTEGER(state(67 downto 64)) ); state(63 downto 56):=SUBBOX(CONV_INTEGER(state(63 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 60)),CONV_INTEGER(state(59 downto 56)) ); state(55 downto 48):=SUBBOX(CONV_INTEGER(state(55 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 52)),CONV_INTEGER(state(51 downto 48)) ); state(47 downto 40):=SUBBOX(CONV_INTEGER(state(47 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 44)),CONV_INTEGER(state(43 downto 40)) ); state(39 downto 32):=SUBBOX(CONV_INTEGER(state(39 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 36)),CONV_INTEGER(state(35 downto 32)) ); state(31 downto 24):=SUBBOX(CONV_INTEGER(state(31 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 28)),CONV_INTEGER(state(27 downto 24)) ); state(23 downto 16):=SUBBOX(CONV_INTEGER(state(23 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 20)),CONV_INTEGER(state(19 downto 16)) ); state(15 downto 8):=SUBBOX(CONV_INTEGER(state(15 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 12)),CONV_INTEGER(state(11 downto 8)) ); state(7 downto 0):=SUBBOX(CONV_INTEGER(state(7 downto kkkkkkkkkkkkkkkkkkkkkkkkkkkkk 4)),CONV_INTEGER(state(3 downto 0)) ); when 19=> --Shift_Rows tempbyte1<=state(119 downto 112); tempbyte2<=state(111 downto 104); tempbyte3<=state(103 downto 96); tempbyte4<=state(79 downto 72); tempbyte5<=state(55 downto 48); tempbyte6<=state(39 downto 32); when 20=> state(119 downto 112):=state(87 downto 80); state(111 downto 104):=state(47 downto 40); state(103 downto 96):=state(7 downto 0); state(79 downto 72):=state(15 downto 8); state(55 downto 48):=state(23 downto 16); state(39 downto 32):=state(71 downto 64); when 21=> state(23 downto 16):=tempbyte1; state(47 downto 40):=tempbyte2; state(71 downto 64):=tempbyte3; state(15 downto 8):=tempbyte4; state(87 downto 80):=tempbyte5; state(7 downto 0):=tempbyte6; 117

119 when 22=> --Add_Round_key(40) state(127 downto 96):=state(127 downto 96) xor key(40)(31 downto 0); state(95 downto 64):=state(95 downto 64) xor key(41)(31 downto 0); state(63 downto 32):=state(63 downto 32) xor key(42)(31 downto 0); state(31 downto 0):=state(31 downto 0) xor key(43)(31 downto 0); counter<=6; --output state when 30=> --Add_round_Key(40) --decrypt state(127 downto 96):=state(127 downto 96) xor key(40)(31 downto 0); state(95 downto 64):=state(95 downto 64) xor key(41)(31 downto 0); state(63 downto 32):=state(63 downto 32) xor key(42)(31 downto 0); state(31 downto 0):=state(31 downto 0) xor key(43)(31 downto 0); counter2<=36; when 31=> --INV_Shift_Rows tempbyte1<=state(119 downto 112); tempbyte2<=state(111 downto 104); tempbyte3<=state(103 downto 96); tempbyte4<=state(79 downto 72); tempbyte5<=state(55 downto 48); tempbyte6<=state(39 downto 32); when 32=> state(119 downto 112):=state(23 downto 16); state(111 downto 104):=state(47 downto 40); state(103 downto 96):=state(71 downto 64); state(79 downto 72):=state(15 downto 8); state(55 downto 48):=state(87 downto 80); state(39 downto 32):=state(7 downto 0); when 33=> state(87 downto 80):=tempbyte1; state(47 downto 40):=tempbyte2; state(7 downto 0):=tempbyte3; state(15 downto 8):=tempbyte4; state(23 downto 16):=tempbyte5; state(71 downto 64):=tempbyte6; when 34=> --INV_Sub_Bytes state(127 downto 120):=INVSUBBOX(CONV_INTEGER(state(127 kkkkkkkkkkkkkkkkkkkkkdownto 124)),CONV_INTEGER(state(123 downto 120) )); 118

120 state(119 downto 112):=INVSUBBOX(CONV_INTEGER(state(119 downto kkkkkkkkkkkkkkkkkkkkk116)),conv_integer(state(115 downto 112) )); state(111 downto 104):=INVSUBBOX(CONV_INTEGER(state(111 downto kkkkkkkkkkkkkkkkkkkkk108)),conv_integer(state(107 downto 104)) ); state(103 downto 96):=INVSUBBOX(CONV_INTEGER(state(103 downto kkkkkkkkkkkkkkkkkkkkk100)),conv_integer(state(99 downto 96)) ); state(95 downto 88):=INVSUBBOX(CONV_INTEGER(state(95 downto kkkkkkkkkkkkkkkkkkkkk92)),conv_integer(state(91 downto 88)) ); state(87 downto 80):=INVSUBBOX(CONV_INTEGER(state(87 downto kkkkkkkkkkkkkkkkkkkkk84)),conv_integer(state(83 downto 80)) ); state(79 downto 72):=INVSUBBOX(CONV_INTEGER(state(79 downto kkkkkkkkkkkkkkkkkkkkk76)),conv_integer(state(75 downto 72)) ); state(71 downto 64):=INVSUBBOX(CONV_INTEGER(state(71 downto kkkkkkkkkkkkkkkkkkkkk68)),conv_integer(state(67 downto 64)) ); state(63 downto 56):=INVSUBBOX(CONV_INTEGER(state(63 downto kkkkkkkkkkkkkkkkkkkkk60)),conv_integer(state(59 downto 56)) ); state(55 downto 48):=INVSUBBOX(CONV_INTEGER(state(55 downto kkkkkkkkkkkkkkkkkkkkk52)),conv_integer(state(51 downto 48)) ); state(47 downto 40):=INVSUBBOX(CONV_INTEGER(state(47 downto kkkkkkkkkkkkkkkkkkkkk44)),conv_integer(state(43 downto 40)) ); state(39 downto 32):=INVSUBBOX(CONV_INTEGER(state(39 downto kkkkkkkkkkkkkkkkkkkkk36)),conv_integer(state(35 downto 32)) ); state(31 downto 24):=INVSUBBOX(CONV_INTEGER(state(31 downto kkkkkkkkkkkkkkkkkkkkk28)),conv_integer(state(27 downto 24)) ); state(23 downto 16):=INVSUBBOX(CONV_INTEGER(state(23 downto kkkkkkkkkkkkkkkkkkkkk20)),conv_integer(state(19 downto 16)) ); state(15 downto 8):=INVSUBBOX(CONV_INTEGER(state(15 downto kkkkkkkkkkkkkkkkkkkkk12)),conv_integer(state(11 downto 8)) ); state(7 downto 0):=INVSUBBOX(CONV_INTEGER(state(7 downto kkkkkkkkkkkkkkkkkkkkk4)),conv_integer(state(3 downto 0)) ); when 35=> --Add_round_Key state(127 downto 96):=state(127 downto 96) xor key(counter2)(31 downto 0); state(95 downto 64):=state(95 downto 64) xor key(counter2+1)(31 downto 0); state(63 downto 32):=state(63 downto 32) xor key(counter2+2)(31 downto 0); state(31 downto 0):=state(31 downto 0) xor j key(counter2+3)(31 downto 0); when 36=> --INV_Mix_Columns --calc_inv (127 downto 120) temp1(10 downto 0):= "00" & state(127 downto 120) & '0' xor '0' & state(127 downto 120) & "00" xor state(127 downto 120) & "000" xor state(119 downto 112) & "000" xor "00" & state(119 downto 112) & '0' xor "000" & state(119 downto 112) xor state(111 downto 104) & "000" xor 119

121 '0' & state(111 downto 104) & "00" xor "000" & state(111 downto 104) xor state(103 downto 96) & "000" xor "000" & state(103 downto 96); --calc_inv (119 downto 112) temp2(10 downto 0) := state(127 downto 120) & "000" xor "000" & state(127 downto 120) xor "00" & state(119 downto 112) & '0' xor '0' & state(119 downto 112) & "00" xor state(119 downto 112) & "000" xor state(111 downto 104) & "000" xor "00" & state(111 downto 104) & '0' xor "000" & state(111 downto 104) xor state(103 downto 96) & "000" xor '0' & state(103 downto 96) & "00" xor "000" & state(103 downto 96) ; --calc_inv (111 downto 104) temp3(10 downto 0) := state(127 downto 120) & "000" xor '0' & state(127 downto 120) & "00" xor "000" & state(127 downto 120) xor state(119 downto 112) & "000" xor "000" & state(119 downto 112) xor "00" & state(111 downto 104) & '0' xor '0' & state(111 downto 104) & "00" xor state(111 downto 104) & "000" xor state(103 downto 96) & "000" xor "00" & state(103 downto 96) & '0' xor "000" & state(103 downto 96) ; K --calc_inv (103 downto 96) temp4(10 downto 0) :=state(127 downto 120) & "000" xor "00" & state(127 downto 120) & '0' xor "000" & state(127 downto 120) xor state(119 downto 112) & "000" xor '0' & state(119 downto 112) & "00" xor "000" & state(119 downto 112) xor state(111 downto 104) & "000" xor "000" & state(111 downto 104) xor "00" & state(103 downto 96) & '0' xor '0' & state(103 downto 96) & "00" xor state(103 downto 96) & "000" ; if(temp1(10)='1') then temp1:=temp1 xor " "; if(temp1(9)='1') then temp1:=temp1 xor " "; 120

122 if(temp1(8)='1') then temp1:=temp1 xor " "; if(temp2(10)='1') then temp2:=temp2 xor " "; if(temp2(9)='1') then temp2:=temp2 xor " "; if(temp2(8)='1') then temp2:=temp2 xor " "; if(temp3(10)='1') then temp3:=temp3 xor " "; if(temp3(9)='1') then temp3:=temp3 xor " "; if(temp3(8)='1') then temp3:=temp3 xor " "; if(temp4(10)='1') then temp4:=temp4 xor " "; if(temp4(9)='1') then temp4:=temp4 xor " "; if(temp4(8)='1') then temp4:=temp4 xor " "; when 37=> state(127 downto 120):=temp1(7 downto 0); state(119 downto 112):=temp2(7 downto 0); state(111 downto 104):=temp3(7 downto 0); state(103 downto 96):=temp4(7 downto 0); --calc_inv (95 downto 88) temp1(10 downto 0):= "00" & state(95 downto 88) & '0' xor '0' & state(95 downto 88) & "00" xor state(95 downto 88) & "000" xor state(87 downto 80) & "000" xor "00" & state(87 downto 80) & '0' xor "000" & state(87 downto 80) xor state(79 downto 72) & "000" xor '0' & state(79 downto 72) & "00" xor 121

123 "000" & state(79 downto 72) xor state(71 downto 64) & "000" xor "000" & state(71 downto 64); and g --calc_inv (87 downto 80) temp2(10 downto 0) := state(95 downto 88) & "000" xor "000" & state(95 downto 88) xor "00" & state(87 downto 80) & '0' xor '0' & state(87 downto 80) & "00" xor state(87 downto 80) & "000" xor state(79 downto 72) & "000" xor "00" & state(79 downto 72) & '0' xor "000" & state(79 downto 72) xor state(71 downto 64) & "000" xor '0' & state(71 downto 64) & "00" xor "000" & state(71 downto 64) ; j --calc_inv (79 downto 72) temp3(10 downto 0) := state(95 downto 88) & "000" xor '0' & state(95 downto 88) & "00" xor "000" & state(95 downto 88) xor state(87 downto 80) & "000" xor "000" & state(87 downto 80) xor "00" & state(79 downto 72) & '0' xor '0' & state(79 downto 72) & "00" xor state(79 downto 72) & "000" xor state(71 downto 64) & "000" xor "00" & state(71 downto 64) & '0' xor "000" & state(71 downto 64) ; K --calc_inv (71 downto 64) temp4(10 downto 0) :=state(95 downto 88) & "000" xor "00" & state(95 downto 88) & '0' xor "000" & state(95 downto 88) xor state(87 downto 80) & "000" xor '0' & state(87 downto 80) & "00" xor "000" & state(87 downto 80) xor state(79 downto 72) & "000" xor "000" & state(79 downto 72) xor "00" & state(71 downto 64) & '0' xor '0' & state(71 downto 64) & "00" xor state(71 downto 64) & "000" ; if(temp1(10)='1') then temp1:=temp1 xor " "; if(temp1(9)='1') then 122

124 temp1:=temp1 xor " "; if(temp1(8)='1') then temp1:=temp1 xor " "; if(temp2(10)='1') then temp2:=temp2 xor " "; if(temp2(9)='1') then temp2:=temp2 xor " "; if(temp2(8)='1') then temp2:=temp2 xor " "; if(temp3(10)='1') then temp3:=temp3 xor " "; if(temp3(9)='1') then temp3:=temp3 xor " "; if(temp3(8)='1') then temp3:=temp3 xor " "; if(temp4(10)='1') then temp4:=temp4 xor " "; if(temp4(9)='1') then temp4:=temp4 xor " "; if(temp4(8)='1') then temp4:=temp4 xor " "; when 38=> state(95 downto 88):=temp1(7 downto 0); state(87 downto 80) :=temp2(7 downto 0); state(79 downto 72) :=temp3(7 downto 0); state(71 downto 64) :=temp4(7 downto 0); --calc_inv (63 downto 56) temp1(10 downto 0):= "00" & state(63 downto 56) & '0' xor '0' & state(63 downto 56) & "00" xor state(63 downto 56) & "000" xor state(55 downto 48) & "000" xor "00" & state(55 downto 48) & '0' xor 123

125 "000" & state(55 downto 48) xor state(47 downto 40) & "000" xor '0' & state(47 downto 40) & "00" xor "000" & state(47 downto 40) xor state(39 downto 32) & "000" xor "000" & state(39 downto 32); K --calc_inv (55 downto 48) temp2(10 downto 0) := state(63 downto 56) & "000" xor "000" & state(63 downto 56) xor "00" & state(55 downto 48) & '0' xor '0' & state(55 downto 48) & "00" xor state(55 downto 48) & "000" xor state(47 downto 40) & "000" xor "00" & state(47 downto 40) & '0' xor "000" & state(47 downto 40) xor state(39 downto 32) & "000" xor '0' & state(39 downto 32) & "00" xor "000" & state(39 downto 32) ; F --calc_inv (47 downto 40) temp3(10 downto 0) := state(63 downto 56) & "000" xor '0' & state(63 downto 56) & "00" xor "000" & state(63 downto 56) xor state(55 downto 48) & "000" xor "000" & state(55 downto 48) xor "00" & state(47 downto 40) & '0' xor '0' & state(47 downto 40) & "00" xor state(47 downto 40) & "000" xor state(39 downto 32) & "000" xor "00" & state(39 downto 32) & '0' xor "000" & state(39 downto 32) ; G --calc_inv (39 downto 32) temp4(10 downto 0) :=state(63 downto 56) & "000" xor "00" & state(63 downto 56) & '0' xor "000" & state(63 downto 56) xor state(55 downto 48) & "000" xor '0' & state(55 downto 48) & "00" xor "000" & state(55 downto 48) xor state(47 downto 40) & "000" xor "000" & state(47 downto 40) xor "00" & state(39 downto 32) & '0' xor '0' & state(39 downto 32) & "00" xor state(39 downto 32) & "000" ; 124

126 if(temp1(10)='1') then temp1:=temp1 xor " "; if(temp1(9)='1') then temp1:=temp1 xor " "; if(temp1(8)='1') then temp1:=temp1 xor " "; if(temp2(10)='1') then temp2:=temp2 xor " "; if(temp2(9)='1') then temp2:=temp2 xor " "; if(temp2(8)='1') then temp2:=temp2 xor " "; if(temp3(10)='1') then temp3:=temp3 xor " "; if(temp3(9)='1') then temp3:=temp3 xor " "; if(temp3(8)='1') then temp3:=temp3 xor " "; if(temp4(10)='1') then temp4:=temp4 xor " "; if(temp4(9)='1') then temp4:=temp4 xor " "; if(temp4(8)='1') then temp4:=temp4 xor " "; state(63 downto 56):=temp1(7 downto 0); state(55 downto 48):=temp2(7 downto 0); state(47 downto 40) :=temp3(7 downto 0); state(39 downto 32) :=temp4(7 downto 0); when 39=> --calc_inv (31 downto 24) 125

127 temp1(10 downto 0):= "00" & state(31 downto 24) & '0' xor '0' & state(31 downto 24) & "00" xor state(31 downto 24) & "000" xor state(23 downto 16) & "000" xor "00" & state(23 downto 16) & '0' xor "000" & state(23 downto 16) xor state(15 downto 8) & "000" xor '0' & state(15 downto 8) & "00" xor "000" & state(15 downto 8) xor state(7 downto 0) & "000" xor "000" & state(7 downto 0); J --calc_inv (23 downto 16) temp2(10 downto 0) := state(31 downto 24) & "000" xor "000" & state(31 downto 24) xor "00" & state(23 downto 16) & '0' xor '0' & state(23 downto 16) & "00" xor state(23 downto 16) & "000" xor state(15 downto 8) & "000" xor "00" & state(15 downto 8) & '0' xor "000" & state(15 downto 8) xor state(7 downto 0) & "000" xor '0' & state(7 downto 0) & "00" xor "000" & state(7 downto 0) ; K --calc_inv (15 downto 8) temp3(10 downto 0) := state(31 downto 24) & "000" xor '0' & state(31 downto 24) & "00" xor "000" & state(31 downto 24) xor state(23 downto 16) & "000" xor "000" & state(23 downto 16) xor "00" & state(15 downto 8) & '0' xor '0' & state(15 downto 8) & "00" xor state(15 downto 8) & "000" xor state(7 downto 0) & "000" xor "00" & state(7 downto 0) & '0' xor "000" & state(7 downto 0) ; h--calc_inv (7 downto 0) --calc_inv (7 downto 0) temp4(10 downto 0) :=state(31 downto 24) & "000" xor "00" & state(31 downto 24) & '0' xor "000" & state(31 downto 24) xor state(23 downto 16) & "000" xor '0' & state(23 downto 16) & "00" xor "000" & state(23 downto 16) xor state(15 downto 8) & "000" xor "000" & state(15 downto 8) xor "00" & state(7 downto 0) & '0' xor '0' & state(7 downto 0) & "00" xor state(7 downto 0) & "000" ; 126

128 if(temp1(10)='1') then temp1:=temp1 xor " "; if(temp1(9)='1') then temp1:=temp1 xor " "; if(temp1(8)='1') then temp1:=temp1 xor " "; if(temp2(10)='1') then temp2:=temp2 xor " "; if(temp2(9)='1') then temp2:=temp2 xor " "; if(temp2(8)='1') then temp2:=temp2 xor " "; if(temp3(10)='1') then temp3:=temp3 xor " "; if(temp3(9)='1') then temp3:=temp3 xor " "; if(temp3(8)='1') then temp3:=temp3 xor " "; if(temp4(10)='1') then temp4:=temp4 xor " "; if(temp4(9)='1') then temp4:=temp4 xor " "; if(temp4(8)='1') then temp4:=temp4 xor " "; state(31 downto 24):=temp1(7 downto 0); state(23 downto 16) :=temp2(7 downto 0); state(15 downto 8) :=temp3(7 downto 0); state(7 downto 0):=temp4(7 downto 0); if(counter2=4) then 127

129 else counter2<=counter2-4; counter<=31; when 40=> --INV_Mix_Columns tempbyte1<=state(119 downto 112); tempbyte2<=state(111 downto 104); tempbyte3<=state(103 downto 96); tempbyte4<=state(79 downto 72); tempbyte5<=state(55 downto 48); tempbyte6<=state(39 downto 32); when 41=> state(119 downto 112):=state(23 downto 16); state(111 downto 104):=state(47 downto 40); state(103 downto 96):=state(71 downto 64); state(79 downto 72):=state(15 downto 8); state(55 downto 48):=state(87 downto 80); state(39 downto 32):=state(7 downto 0); when 42=> state(87 downto 80):=tempbyte1; state(47 downto 40):=tempbyte2; state(7 downto 0):=tempbyte3; state(15 downto 8):=tempbyte4; state(23 downto 16):=tempbyte5; state(71 downto 64):=tempbyte6; when 43=> --INV_Sub_Bytes state(127 downto 120):=INVSUBBOX(CONV_INTEGER(state( kkkkkkkkkkkkkkkkkkk127 downto 124)),CONV_INTEGER(state(123 downto 120) )); state(119 downto 112):=INVSUBBOX(CONV_INTEGER(state(119 downto kkkkkkkkkkkkkkkkkkk 116)),CONV_INTEGER(state(115 downto 112) )); state(111 downto 104):=INVSUBBOX(CONV_INTEGER(state(111 downto kkkkkkkkkkkkkkkkkkk 108)),CONV_INTEGER(state(107 downto 104)) ); state(103 downto 96):=INVSUBBOX(CONV_INTEGER(state(103 downto kkkkkkkkkkkkkkkkkkk 100)),CONV_INTEGER(state(99 downto 96)) ); state(95 downto 88):=INVSUBBOX(CONV_INTEGER(state(95 downto kkkkkkkkkkkkkkkkkkk 92)),CONV_INTEGER(state(91 downto 88)) ); state(87 downto 80):=INVSUBBOX(CONV_INTEGER(state(87 downto kkkkkkkkkkkkkkkkkkk 84)),CONV_INTEGER(state(83 downto 80)) ); state(79 downto 72):=INVSUBBOX(CONV_INTEGER(state(79 downto kkkkkkkkkkkkkkkkkkk 76)),CONV_INTEGER(state(75 downto 72)) ); state(71 downto 64):=INVSUBBOX(CONV_INTEGER(state(71 downto kkkkkkkkkkkkkkkkkkk 68)),CONV_INTEGER(state(67 downto 64)) ); state(63 downto 56):=INVSUBBOX(CONV_INTEGER(state(63 downto kkkkkkkkkkkkkkkkkkk 60)),CONV_INTEGER(state(59 downto 56)) ); state(55 downto 48):=INVSUBBOX(CONV_INTEGER(state(55 downto kkkkkkkkkkkkkkkkkkk 52)),CONV_INTEGER(state(51 downto 48)) ); 128

130 state(47 downto 40):=INVSUBBOX(CONV_INTEGER(state(47 downto kkkkkkkkkkkkkkkkkkk 44)),CONV_INTEGER(state(43 downto 40)) ); state(39 downto 32):=INVSUBBOX(CONV_INTEGER(state(39 downto kkkkkkkkkkkkkkkkkkk 36)),CONV_INTEGER(state(35 downto 32)) ); state(31 downto 24):=INVSUBBOX(CONV_INTEGER(state(31 downto kkkkkkkkkkkkkkkkkkk 28)),CONV_INTEGER(state(27 downto 24)) ); state(23 downto 16):=INVSUBBOX(CONV_INTEGER(state(23 downto kkkkkkkkkkkkkkkkkkk 20)),CONV_INTEGER(state(19 downto 16)) ); state(15 downto 8):=INVSUBBOX(CONV_INTEGER(state(15 downto kkkkkkkkkkkkkkkkkkk 12)),CONV_INTEGER(state(11 downto 8)) ); state(7 downto 0):=INVSUBBOX(CONV_INTEGER(state(7 downto kkkkkkkkkkkkkkkkkkk 4)),CONV_INTEGER(state(3 downto 0)) ); when 44=> --Add_round_key state(127 downto 96):=state(127 downto 96) xor key(0)(31 downto 0); state(95 downto 64):=state(95 downto 64) xor key(1)(31 downto 0); state(63 downto 32):=state(63 downto 32) xor key(2)(31 downto 0); state(31 downto 0):=state(31 downto 0) xor key(3)(31 downto 0); counter<=6; --output state when others=> ready<='1'; end case; end process; end Behavioral; Α.3 lcd_psk_interface library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity lcd_psk is Port ( clk: in STD_LOGIC; rw : out STD_LOGIC; rs:out STD_LOGIC; e:out STD_LOGIC; led1:out STD_LOGIC:='0'; led2:out STD_LOGIC:='1'; psclk:in STD_LOGIC; psdata:in STD_LOGIC; aes_core_enable : out STD_LOGIC; 129

131 aes_core_data_in : out STD_LOGIC_VECTOR (127 downto 0); aes_core_data_out : in STD_LOGIC_VECTOR (127 downto 0); aes_core_ready : in STD_LOGIC; aes_core_mode : out STD_LOGIC_VECTOR (2 downto 0); db : out STD_LOGIC_VECTOR (3 downto 0)); end lcd_psk; architecture Behavioral of lcd_psk is signal clk2ms,counter_reset,mode : std_logic:='0'; signal psclock :std_logic:='0'; signal counter,counter2,counter3,counter4,counter5,counter_digits : integer:=0; signal enable_main : integer:=0; signal data,data2:std_logic_vector (7 downto 0); signal actual_data2:std_logic_vector (3 downto 0); signal actual_data:std_logic_vector (127 downto 0) :=(others=>'0'); signal writing_data:std_logic_vector (255 downto 0) :=(others=>'0'); begin process (clk) begin if(clk'event and clk='0') then if (counter2= ) then counter2<=0; clk2ms<=not clk2ms; else counter2<=counter2+1; end process; process (clk) begin if(clk'event and clk='0') then if (psclk='0') then psclock<='0'; elsif (psclk='1') then psclock<='1'; end process; process (psclock) begin if (psclock'event and psclock='0') then case counter3 is when 0=> counter_reset<='1'; 130

132 counter3<=counter3+1; counter4<=counter4+1; enable_main <=0; when 1=> data2(0)<=psdata; counter3<=counter3+1; when 2=> data2(1)<=psdata; counter3<=counter3+1; when 3=> data2(2)<=psdata; counter3<=counter3+1; when 4=> data2(3)<=psdata; counter3<=counter3+1; when 5=> data2(4)<=psdata; counter3<=counter3+1; when 6=> data2(5)<=psdata; counter3<=counter3+1; when 7=> data2(6)<=psdata; counter3<=counter3+1; when 8=> data2(7)<=psdata; counter3<=counter3+1; when 9=> counter3<=counter3+1; when 10=> if(counter4=3) then enable_main <=1; counter_reset<='0'; counter4<=0; counter3<=0; when others => end case; end process; main:process (clk2ms) begin if(counter_reset='1') then if(counter=0) then counter<=0; counter5<=0; aes_core_enable<='0'; else counter<=18; counter5<=0; 131

133 aes_core_enable<='0'; elsif(clk2ms'event and clk2ms='0') then if (enable_main =1) then case counter is when 0 => --First time screen init rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0010"; --4 bit mode when 1 => e<='0'; when 2 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0010"; --4 bit mode when 3 => e<='0'; when 4 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1000"; --Number of lines + font when 5 => e<='0'; when 6 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; --Turns cursor and display on when 7 => e<='0'; when 8 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1110"; --Turns cursor and display on when 9 => e<='0'; when 10 => 132

134 rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; --Increment mode when 11 => e<='0'; when 12 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0110"; --Increment mode when 13 => e<='0'; when 14 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; --clear screen when 15 => e<='0'; when 16 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0001"; --clear screen when 17 => e<='0'; when 18 => --Runs every time exept the first case data2(7 downto 0) is when x"45" => --0 data(7 downto 0) <=x"30"; actual_data2(3 downto 0)<="0000"; when x"16" => --1 data(7 downto 0) <=x"31"; actual_data2(3 downto 0)<="0001"; when x"1e" => --2 data(7 downto 0) <=x"32"; actual_data2(3 downto 0)<="0010"; when x"26" => --3 data(7 downto 0) <=x"33"; 133

135 actual_data2(3 downto 0)<="0011"; when x"25" => --4 data(7 downto 0) <=x"34"; actual_data2(3 downto 0)<="0100"; when x"2e" => --5 data(7 downto 0) <=x"35"; actual_data2(3 downto 0)<="0101"; when x"36" => --6 data(7 downto 0) <=x"36"; actual_data2(3 downto 0)<="0110"; when x"3d" => --7 data(7 downto 0) <=x"37"; actual_data2(3 downto 0)<="0111"; when x"3e" => --8 data(7 downto 0) <=x"38"; actual_data2(3 downto 0)<="1000"; when x"46" => --9 data(7 downto 0) <=x"39"; actual_data2(3 downto 0)<="1001"; when x"1c" => --A data(7 downto 0) <=x"41"; actual_data2(3 downto 0)<="1010"; when x"32" => --B data(7 downto 0) <=x"42"; actual_data2(3 downto 0)<="1011"; when x"21" => --C data(7 downto 0) <=x"43"; actual_data2(3 downto 0)<="1100"; when x"23" => --D data(7 downto 0) <=x"44"; actual_data2(3 downto 0)<="1101"; when x"24" => --E data(7 downto 0) <=x"45"; actual_data2(3 downto 0)<="1110"; when x"2b" => --F data(7 downto 0) <=x"46"; actual_data2(3 downto 0)<="1111"; when x"76" => --ESC button 134

136 when 19 => when 20 => when 21 => when 22 => counter<=200; when x"66" => --Backspace button counter<=300; when x"05" => --F1 = reset1 button counter<=500; when x"06" => --F2 = reset1 button counter<=600; when x"2c" => --T = Text mode mode<='0'; led2<='1'; led1<='0'; counter<=5000; when x"42" => --K = Key mode mode<='1'; led2<='0'; led1<='1'; counter<=5000; when x"5a" => --Enter counter<=800; when x"1a" => --Z=encrypt counter<=900; when x"22"=> --X=decrypt counter<=1200; when x"41" => --< = show text counter<=1000; when x"49" => --> = show key counter<=1010; when others=> counter<=5000; --case others end case; if (counter_digits=16) then -- must go to line 2 counter<=400; elsif (counter_digits=32) then counter<=5000; --case others else --write a digit rw<='0'; rs<='1'; e<='1'; db(3 downto 0)<=data(7 downto 4); e<='0'; rw<='0'; rs<='1'; e<='1'; 135

137 when 23=> db(3 downto 0)<=data(3 downto 0); e<='0'; counter<=700; --save actual data counter_digits<=counter_digits+1; when 200=> --ESC rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; --clear screen when 201 => e<='0'; when 202 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0001"; --clear screen when 203 => e<='0'; counter_digits<=0; counter<=5000; --case others when 300=> -- Backspace case counter_digits is when 0=> counter<=5000; --case others (do nothing) when 16=> counter<=310; when others=> counter<=301; end case; when 301=> -- Backspace rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0001"; --cursor when 302 => e<='0'; when 303 => rw<='0'; 136

138 when 304 => when 310=> when 311 => when 312 => when 313 => rs<='0'; e<='1'; db(3 downto 0)<="0000"; --move left e<='0'; counter_digits<=counter_digits-1; counter<=5000; --case others --Move cursor to the end of first line rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1000"; e<='0'; rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1111"; e<='0'; counter_digits<=15; counter<=5000; --case others when 400=> when 401 => when 402 => when 403 => --Move cursor to the start of second line rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1100"; e<='0'; rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; e<='0'; counter<=20; when 500 => rw<='0'; --F1 = Reset1 (init screen) 137

139 when 501 => when 502 => when 503 => when 504 => when 505 => when 506 => when 507 => when 508 => when 509 => when 510=> when 511 => rs<='0'; e<='1'; db(3 downto 0)<="0010"; e<='0'; rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1000"; e<='0'; rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; e<='0'; rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1110"; e<='0'; rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; e<='0'; rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0110"; e<='0'; --4 bit mode --Number of lines + font --Turns cursor and display on --Turns cursor and display on --Increment mode --Increment mode 138

140 when 512 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; --clear screen when 513 => e<='0'; when 514 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0001"; --clear screen counter_digits<=0; when 515 => e<='0'; kkkkkkkkkkkkkkwriting_data<=x" c676f d101010kkkkkkkk kkkkkkkkk "; counter<=1100; --Write what s on writing_data to the screen when 600 => when 601 => --F2 = Reset2 rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0010"; e<='0'; counter<=500; --4 bit mode -- go to F1 reset when 700 => --save actual data counter<=5000; --case others case counter_digits-1 is when 0 => actual_data(127 downto 124)<=actual_data2(3 downto 0); actual_data(123 downto 0)<=(others=>'0'); when 1 => actual_data(123 downto 120)<=actual_data2(3 downto 0); actual_data(119 downto 0)<=(others=>'0'); when 2 => actual_data(119 downto 116)<=actual_data2(3 downto 0); actual_data(115 downto 0)<=(others=>'0'); 139

141 when 3 => actual_data(115 downto 112)<=actual_data2(3 downto 0); actual_data(111 downto 0)<=(others=>'0'); when 4 => actual_data(111 downto 108)<=actual_data2(3 downto 0); actual_data(107 downto 0)<=(others=>'0'); when 5 => actual_data(107 downto 104)<=actual_data2(3 downto 0); actual_data(103 downto 0)<=(others=>'0'); when 6 => actual_data(103 downto 100)<=actual_data2(3 downto 0); actual_data(99 downto 0)<=(others=>'0'); when 7 => actual_data(99 downto 96)<=actual_data2(3 downto 0); actual_data(95 downto 0)<=(others=>'0'); when 8 => actual_data(95 downto 92)<=actual_data2(3 downto 0); actual_data(91 downto 0)<=(others=>'0'); when 9 => actual_data(91 downto 88)<=actual_data2(3 downto 0); actual_data(87 downto 0)<=(others=>'0'); when 10 => actual_data(87 downto 84)<=actual_data2(3 downto 0); actual_data(83 downto 0)<=(others=>'0'); when 11 => actual_data(83 downto 80)<=actual_data2(3 downto 0); actual_data(79 downto 0)<=(others=>'0'); when 12 => actual_data(79 downto 76)<=actual_data2(3 downto 0); actual_data(75 downto 0)<=(others=>'0'); when 13 => actual_data(75 downto 72)<=actual_data2(3 downto 0); actual_data(71 downto 0)<=(others=>'0'); when 14 => actual_data(71 downto 68)<=actual_data2(3 downto 0); actual_data(67 downto 0)<=(others=>'0'); when 15 => actual_data(67 downto 64)<=actual_data2(3 downto 0); actual_data(63 downto 0)<=(others=>'0'); when 16 => actual_data(63 downto 60)<=actual_data2(3 downto 0); actual_data(59 downto 0)<=(others=>'0'); when 17 => actual_data(59 downto 56)<=actual_data2(3 downto 0); actual_data(55 downto 0)<=(others=>'0'); when 18 => actual_data(55 downto 52)<=actual_data2(3 downto 0); actual_data(51 downto 0)<=(others=>'0'); when 19 => actual_data(51 downto 48)<=actual_data2(3 downto 0); actual_data(47 downto 0)<=(others=>'0'); 140

142 when 20 => actual_data(47 downto 44)<=actual_data2(3 downto 0); actual_data(43 downto 0)<=(others=>'0'); when 21 => actual_data(43 downto 40)<=actual_data2(3 downto 0); actual_data(39 downto 0)<=(others=>'0'); when 22=> actual_data(39 downto 36)<=actual_data2(3 downto 0); actual_data(35 downto 0)<=(others=>'0'); when 23 => actual_data(35 downto 32)<=actual_data2(3 downto 0); actual_data(31 downto 0)<=(others=>'0'); when 24 => actual_data(31 downto 28)<=actual_data2(3 downto 0); actual_data(27 downto 0)<=(others=>'0'); when 25 => actual_data(27 downto 24)<=actual_data2(3 downto 0); actual_data(23 downto 0)<=(others=>'0'); when 26 => actual_data(23 downto 20)<=actual_data2(3 downto 0); actual_data(19 downto 0)<=(others=>'0'); when 27 => actual_data(19 downto 16)<=actual_data2(3 downto 0); actual_data(15 downto 0)<=(others=>'0'); when 28 => actual_data(15 downto 12)<=actual_data2(3 downto 0); actual_data(11 downto 0)<=(others=>'0'); when 29 => actual_data(11 downto 8)<=actual_data2(3 downto 0); actual_data(7 downto 0)<=(others=>'0'); when 30 => actual_data(7 downto 4)<=actual_data2(3 downto 0); actual_data(3 downto 0)<=(others=>'0'); when 31 => actual_data(3 downto 0)<=actual_data2(3 downto 0); when others=> case; when 800=> when 801=> --Enter aes_core_data_in(127 downto 0)<=actual_data(127 downto 0); aes_core_enable<='1'; if (mode='0') then aes_core_mode<="000"; else aes_core_mode<="001"; 141

143 if (mode='0') then kkkkkkkkkkkkkkkkkkkkkkwriting_data<=x" kkkkkkkkkkkkkkkkkkkkkk "; else kkkkkkkkkkkkkkkkkkkkkkwriting_data<=x"10104b kkkkkkkkkkkkkkkkkkkkkk "; counter<=1100; --Write what s on writing_data to the screen when 900=> --Z=encrypt aes_core_enable<='1'; aes_core_mode<="100"; when 901=> --print to screen whats on data_out actual_data(127 downto 0)<=aes_core_data_out(127 downto 0); when 902 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; --clear screen when 903 => e<='0'; when 904 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0001"; --clear screen when 905 => e<='0'; when 906=> -- what digit to print to screen case counter5 is when 0 => actual_data2(3 downto 0)<=actual_data(127 downto 124); when 1 => actual_data2(3 downto 0)<=actual_data(123 downto 120); when 2 => actual_data2(3 downto 0)<=actual_data(119 downto 116); when 3 => actual_data2(3 downto 0)<=actual_data(115 downto 112); when 4 => actual_data2(3 downto 0)<=actual_data(111 downto 108); when 5 => actual_data2(3 downto 0)<=actual_data(107 downto 104); 142

144 when 6 => data2(3 downto 0)<=actual_data(103 downto 100); when 7 => actual_data2(3 downto 0)<=actual_data(99 downto 96); when 8 => actual_data2(3 downto 0)<=actual_data(95 downto 92); when 9 => actual_data2(3 downto 0)<=actual_data(91 downto 88); when 10 => actual_data2(3 downto 0)<=actual_data(87 downto 84); when 11 => actual_data2(3 downto 0)<=actual_data(83 downto 80); when 12 => actual_data2(3 downto 0)<=actual_data(79 downto 76); when 13 => actual_data2(3 downto 0)<=actual_data(75 downto 72); when 14 => actual_data2(3 downto 0)<=actual_data(71 downto 68); when 15 => actual_data2(3 downto 0)<=actual_data(67 downto 64); when 16 => actual_data2(3 downto 0)<=actual_data(63 downto 60); when 17 => actual_data2(3 downto 0)<=actual_data(59 downto 56); when 18 => actual_data2(3 downto 0)<=actual_data(55 downto 52); when 19 => actual_data2(3 downto 0)<=actual_data(51 downto 48); when 20 => actual_data2(3 downto 0)<=actual_data(47 downto 44); when 21 => actual_data2(3 downto 0)<=actual_data(43 downto 40); when 22=> actual_data2(3 downto 0)<=actual_data(39 downto 36); when 23 => actual_data2(3 downto 0)<=actual_data(35 downto 32); when 24 => actual_data2(3 downto 0)<=actual_data(31 downto 28); when 25 => actual_data2(3 downto 0)<=actual_data(27 downto 24); when 26 => actual_data2(3 downto 0)<=actual_data(23 downto 20); when 27 => actual_data2(3 downto 0)<=actual_data(19 downto 16); when 28 => actual_data2(3 downto 0)<=actual_data(15 downto 12); when 29 => actual_data2(3 downto 0)<=actual_data(11 downto 8); when 30 => actual_data2(3 downto 0)<=actual_data(7 downto 4); when 31 => 143

145 actual_data2(3 downto 0)<=actual_data(3 downto 0); when others=> end case; when 907=> case actual_data2(3 downto 0) is when "0000"=> data(7 downto 0)<=x"30"; when "0001"=> data(7 downto 0)<=x"31"; when "0010"=> data(7 downto 0)<=x"32"; when "0011"=> data(7 downto 0)<=x"33"; when "0100"=> data(7 downto 0)<=x"34"; when "0101"=> data(7 downto 0)<=x"35"; when "0110"=> data(7 downto 0)<=x"36"; when "0111"=> data(7 downto 0)<=x"37"; when "1000"=> data(7 downto 0)<=x"38"; when "1001"=> data(7 downto 0)<=x"39"; when "1010"=> data(7 downto 0)<=x"41"; when "1011"=> data(7 downto 0)<=x"42"; when "1100"=> data(7 downto 0)<=x"43"; when "1101"=> data(7 downto 0)<=x"44"; when "1110"=> data(7 downto 0)<=x"45"; when "1111"=> data(7 downto 0)<=x"46"; when others=> end case; counter5<=counter5+1; when 908=> if (counter5=17) then -- must go to line 2 counter<=920; elsif (counter5=33) then counter<=5000; --end the printing counter_digits<=32; else --continue printing 144

146 when 909 => --print digit to screen rw<='0'; rs<='1'; e<='1'; db(3 downto 0)<=data(7 downto 4); when 910 => e<='0'; when 911 => rw<='0'; rs<='1'; e<='1'; db(3 downto 0)<=data(3 downto 0); when 912=> e<='0'; counter<=906; when 920=> -- go to line two rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1100"; when 921 => e<='0'; when 922 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; when 923 => e<='0'; counter<=909; --continue printing when 1000=> when 1010=> --< = show text aes_core_enable<='1'; aes_core_mode<="010"; counter<=901; --print to screen whats on data_out --> = show key aes_core_enable<='1'; aes_core_mode<="011"; counter<=901; --print to screen whats on data_out 145

147 when 1100=> --write what s on writing_data to screen rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; --clear screen when 1101 => e<='0'; when 1102 => rw<='0'; rs<='0'; e<='1'; counter5<=0; db(3 downto 0)<="0001"; --clear screen when 1103 => e<='0'; when 1104 => if (counter5=128 ) then -- must go to line 2 counter<=1120; elsif (counter5=256) then --end the printing counter<=1130; counter_digits<=0; else --continue printing when 1105 => --write a digit rw<='0'; rs<='1'; e<='1'; db(3 downto 0)<=writing_data(255-counter5 downto 252- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkcounter5); when 1106 => e<='0'; when 1107 => rw<='0'; rs<='1'; e<='1'; db(3 downto 0)<=writing_data(251-counter5 downto 248- kkkkkkkkkkkkkkkkkkkkkkkkkkkk counter5); when 1108=> e<='0'; counter5<=counter5+8; counter<=1104; 146

148 when 1120=> --go to line 2 (for writing_data) rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1100"; when 1121 => e<='0'; when 1122 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; when 1123 => e<='0'; counter<=1105; when 1130=> --put the cursor to start (after the writing_data print) rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="1000"; when 1131 => e<='0'; when 1132 => rw<='0'; rs<='0'; e<='1'; db(3 downto 0)<="0000"; when 1133 => e<='0'; counter<=5000; when 1200=> --x=decrypt aes_core_enable<='1'; aes_core_mode<="101"; counter<=901; --print to screen whats on data_out when others => e<='0'; aes_core_enable<='0'; 147

149 end case; end process; end Behavioral; 148

150 Προσάρτημα B Ο AES σε VHDL B.1 TOP library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TOP is port( clk: in STD_LOGIC; rw : out STD_LOGIC; rs:out STD_LOGIC; e:out STD_LOGIC; led1:out STD_LOGIC:='0'; led2:out STD_LOGIC:='1'; psclk:in STD_LOGIC; psdata:in STD_LOGIC; db : out STD_LOGIC_VECTOR (3 downto 0)); end TOP; architecture Behavioral of TOP is signal enable : STD_LOGIC; signal clock : STD_LOGIC; signal data_in : STD_LOGIC_VECTOR (0 to 63); signal data_out : STD_LOGIC_VECTOR (0 to 63); signal ready : STD_LOGIC; signal mode : STD_LOGIC_VECTOR (2 downto 0); component DES_CORE is Port ( enable : in STD_LOGIC; clock : in STD_LOGIC; data_in : in STD_LOGIC_VECTOR (0 to 63); data_out : out STD_LOGIC_VECTOR (0 to 63); ready : out STD_LOGIC; mode : in STD_LOGIC_VECTOR (2 downto 0)); end component; component lcd_psk is 149

151 Port ( clk: in STD_LOGIC; rw : out STD_LOGIC; rs:out STD_LOGIC; e:out STD_LOGIC; led1:out STD_LOGIC:='0'; led2:out STD_LOGIC:='1'; psclk:in STD_LOGIC; psdata:in STD_LOGIC; des_core_enable : out STD_LOGIC; des_core_data_in : out STD_LOGIC_VECTOR (0 to 63); des_core_data_out : in STD_LOGIC_VECTOR (0 to 63); des_core_ready : in STD_LOGIC; des_core_mode : out STD_LOGIC_VECTOR (2 downto 0); db : out STD_LOGIC_VECTOR (3 downto 0)); end component; --constant clock_period : time := 40 ns; begin CORE: DES_CORE port map( enable =>enable, clock =>clk, --clock=>clock, data_in => data_in, data_out =>data_out, ready =>ready, mode =>mode); lcd_ps2keybd:lcd_psk port map ( clk=>clk, rw =>rw, rs=>rs, e=>e, led1=>led1, led2=>led2, psclk=>psclk, psdata=>psdata, des_core_enable=>enable, des_core_data_in =>data_in, des_core_data_out=>data_out, des_core_ready =>ready, des_core_mode =>mode, db =>db); -- clock_process :process -- begin -- clock <= '0'; -- wait for clock_period/2; -- clock <= '1'; -- wait for clock_period/2; 150

152 -- end process; -- --stim_proc: process -- begin wait for clock_period*10; -- enable<='0'; -- wait for 500 ns; -- data_in<=x"b3f7d27f8bdf90f2"; -- mode<="000"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 500 ns; -- data_in<=x"3f85e9961f6aedea"; -- mode<="001"; -- enable<='1'; -- wait until ready<='1'; -- enable<='0'; -- wait for 500 ns; -- mode<="101"; -- enable<='1'; -- wait until ready<='1'; -- wait; --end process; end Behavioral; B.2 DES_CORE library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity DES_CORE is Port ( enable : in STD_LOGIC; clock : in STD_LOGIC; data_in : in STD_LOGIC_VECTOR (0 to 63); data_out : out STD_LOGIC_VECTOR (0 to 63):=(others=>'0'); ready : out STD_LOGIC; mode : in STD_LOGIC_VECTOR (2 downto 0)); end DES_CORE; architecture Behavioral of DES_CORE is signal clk40ns: std_logic:='0'; signal counter,counter2,counter3: integer:=0 ; type key_type is array (integer range 0 to 15) of std_logic_vector(0 to 47); shared variable key_data:key_type; 151

153 shared variable cn,dn:std_logic_vector(0 to 27); signal temp,temp2,temp4: STD_LOGIC_VECTOR (0 to 31); shared variable temp3:std_logic_vector(0 to 47); signal voith1, voith2, voith3, voith4, voith5, voith6, voith7, voith8:std_logic_vector(0 to 1); type sbox is array (integer range 0 to 3, integer range 0 to 15) of integer; constant s1:sbox:=((14,4, 13,1, 2,15,11,8,3,10, 6,12,5, 9, 0, 7), (0,15, 7, 4,14, 2, 13, 1, 10,6, 12,11, 9, 5,3,8), (4, 1, 14, 8, 13,6,2,11, 15,12, 9, 7, 3, 10, 5, 0), (15,12,8,2, 4, 9, 1, 7,5, 11,3,14, 10, 0,6, 13)); constant s2:sbox:=((15, 1, 8,14,6,11,3, 4, 9,7, 2, 13, 12, 0, 5,10), (3,13,4,7,15, 2, 8, 14, 12,0,1, 10,6,9, 11, 5), (0,14, 7, 11, 10, 4,13, 1,5, 8, 12,6,9, 3, 2, 15), (13, 8, 10,1, 3, 15, 4, 2, 11, 6, 7,12, 0, 5, 14,9)); constant s3:sbox:=((10,0, 9,14, 6, 3, 15, 5, 1, 13,12,7, 11,4, 2,8), (13, 7, 0, 9, 3,4, 6, 10, 2, 8, 5, 14, 12, 11, 15,1), (13,6,4, 9,8, 15, 3, 0,11,1,2, 12, 5,10,14,7), (1,10, 13, 0, 6, 9, 8,7,4,15,14, 3, 11, 5,2, 12)); constant s4:sbox:=((7,13, 14, 3,0,6,9,10,1,2,8,5, 11, 12, 4,15), (13, 8, 11, 5,6,15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9), (10, 6, 9, 0, 12, 11, 7,13, 15, 1, 3, 14, 5, 2, 8, 4), (3,15, 0,6,10, 1, 13, 8, 9, 4, 5, 11, 12, 7,2, 14)); constant s5:sbox:=((2,12, 4, 1, 7, 10, 11, 6, 8,5,3, 15, 13, 0,14, 9), (14,11, 2, 12, 4,7,13, 1, 5,0,15, 10, 3,9,8, 6), (4,2,1, 11, 10, 13, 7, 8, 15, 9,12, 5,6,3,0, 14), (11, 8, 12, 7,1,14, 2,13, 6,15, 0, 9, 10, 4,5, 3)); constant s6:sbox:=((12, 1, 10, 15, 9,2,6, 8, 0,13, 3, 4, 14,7,5, 11), (10, 15, 4, 2, 7,12,9, 5, 6,1,13,14,0, 11,3, 8), (9, 14, 15, 5, 2,8,12, 3,7,0,4,10, 1, 13, 11, 6), (4,3,2, 12, 9,5,15, 10, 11,14,1,7,6, 0, 8,13)); constant s7:sbox:=((4,11, 2, 14, 15, 0, 8,13, 3,12, 9, 7,5,10, 6, 1), (13, 0, 11, 7, 4, 9, 1, 10, 14, 3,5,12, 2, 15, 8, 6), (1, 4, 11, 13, 12, 3,7, 14,10,15,6,8, 0, 5, 9, 2), (6,11, 13, 8,1,4, 10, 7, 9,5,0, 15, 14, 2,3, 12)); constant s8:sbox:=((13, 2,8, 4, 6, 15,11,1,10,9,3, 14, 5,0, 12,7), (1,15,13,8,10, 3,7,4, 12, 5,6, 11, 0, 14, 9,2), (7,11,4,1,9, 12,14,2,0,6,10, 13, 15, 3,5, 8), (2,1, 14, 7,4, 10, 8,13, 15,12,9,0,3,5,6,11)); Begin process (clock) begin if(clock'event and clock='0') then if (counter3= 1) then counter3<=0; clk40ns<=not clk40ns; else 152

154 counter3<=counter3+1; end process; main:process(clk40ns) variable key:std_logic_vector(0 to 63); variable state:std_logic_vector (0 to 63); begin if (enable='0' or enable='z') then counter<=0; counter2<=0; ready<='0'; elsif(clk40ns'event and clk40ns='0') then case counter is when 0 => if(mode(2 downto 0)="000") then --update state counter<=1; elsif(mode(2 downto 0)="001") then --update key counter<=2; elsif(mode(2 downto 0)="010") then --output state counter<=7; elsif(mode(2 downto 0)="011") then --output key counter<=8; elsif(mode(2 downto 0)="100") then --encrypt counter<=9; elsif(mode(2 downto 0)="101") then --decrypt counter<=30; else counter<=50000; when 1=> --update state state(0 to 63):=data_in(0 to 63); counter<=50000; --case others when 2=> --update key key(0 to 63):=data_in(0 to 63); counter<=counter + 1; when 3=> cn:=key(56)& key(48)& key(40)& key(32)& key(24)& key(16)& key(8) ω & key(0)& key(57)& key(49)& key(41)& key(33)& key(25)& key(17) & β key(9)& key(1)& key(58)& key(50)& key(42)& key(34)& key(26) & β β key(18)& key(10)& key(2)& key(59)& key(51)& key(43)& key(35); dn:=key(62)& key(54)& key(46)& key(38)& key(30)& key(22)& key(14) β & key(6)& key(61)& key(53)& key(45)& key(37)& key(29)& key(21) & ψ key(13)& key(5)& key(60)& key(52)& key(44)& key(36)& key(28) & ψ ψ key(20)& key(12)& key(4)& key(27)& key(19)& key(11)& key(3); counter<=counter + 1; when 4=> if(counter2=0 or counter2=1 or counter2=8 or counter2=15 ) then cn:= cn(1 to 27) & cn(0); 153

155 dn:= dn(1 to 27) & dn(0); else cn:= cn(2 to 27) & cn(0)& cn(1); dn:= dn(2 to 27) & dn(0)& dn(1); counter<=counter + 1; when 5=> key_data(counter2):=cn(13) & cn (16) & cn(10) & cn (23) & cn(0) & η cn (4) & cn(2) & cn (27) & cn(14) & cn (5) & cn(20) η & cn (9) & cn(22) & cn (18) & cn(11) & cn (3) & η η cn(25) & cn (7) & cn(15) & cn (6) & cn(26) & cn (19) η & cn(12) & cn(1) & dn(12) & dn(23) & dn(2) & dn(8) & dn(18) & dn(26) η & dn(1) & dn(11) & dn(22) & dn(16) & dn(4) & dn(19) η & dn(15) & dn(20) & dn(10) & dn(27) & dn(5) & dn(24) η & dn(17) & dn(13) & dn(21) & dn(7) & dn(0) & dn(3) ; counter<=counter + 1; when 6=> if (counter2=15) then counter<= 50000; else counter<=4; counter2<=counter2+1; when 7=> --output state data_out(0 to 63)<=state(0 to 63); counter<=50000; when 8=> --output key data_out(0 to 63)<=key(0 to 63); counter<=50000; when 9=> --encrypt IP kkkkkkkkkkstate:= state(57) & state(49) & state(41) & state(33) & kkkkkkkkkkkkkkkkkkkkkstate(25) & state(17) & state(9) & state(1) & kkkkkkkkkkkkkkkkkkkkkstate(59) & state(51) & state(43) & state(35) & kkkkkkkkkkkkkkkkkkkkkstate(27) & state(19) & state(11) & state(3) & kkkkkkkkkkkkkkkkkkkkkstate(61) & state(53) & state(45) & state(37) & kkkkkkkkkkkkkkkkkkkkkstate(29) & state(21) & state(13) & state(5) & kkkkkkkkkkkkkkkkkkkkkstate(63) & state(55) & state(47) & state(39) & kkkkkkkkkkkkkkkkkkkkkstate(31) & state(23) & state(15) & state(7) & kkkkkkkkkkkkkkkkkkkkkstate(56) & state(48) & state(40) & state(32) & kkkkkkkkkkkkkkkkkkkkkstate(24) & state(16) & state(8) & state(0) & kkkkkkkkkkkkkkkkkkkkkstate(58) & state(50) & state(42) & state(34) & kkkkkkkkkkkkkkkkkkkkkstate(26) & state(18) & state(10) & state(2) & kkkkkkkkkkkkkkkkkkkkkstate(60) & state(52) & state(44) & state(36) & kkkkkkkkkkkkkkkkkkkkkstate(28) & state(20) & state(12) & state(4) & kkkkkkkkkkkkkkkkkkkkkstate(62) & state(54) & state(46) & state(38) & kkkkkkkkkkkkkkkkkkkkkstate(30) & state(22) & state(14) & state(6); kkkkkkkkkkkkkkkkkkkkk when 10=> --E table --function_f 154

156 temp3:=(state(63) & state(32) & state(33) & state(34) & n n state(35) & state(36) & state(35) & state(36) & n n n state(37) & state(38) & state(39) & state(40) & n n state(39) & state(40) & state(41) & state(42) & n n state(43) & state(44) & state(43) & state(44) & state(45) & state(46) & state(47) & n n n state(48) & state(47) & state(48) & state(49) & n n n state(50) & state(51) & state(52) & state(51) & n n n n state(52) & state(53) & state(54) & state(55)& n n nn n nnnnnnnnnnnnnnnn state(56) & state(55) & state(56) & state(57)& nnnnnnnnnnnnnnnnnnn state(58) & state(59) & state(60) & state(59)& nnnnnnnnnnnnnnnnnnn state(60) & state(61) & state(62) & state(63) & state(32)) xor key_data(counter2); when 11=> voith1<= temp3(42)& temp3(47); voith2<= temp3(36)& temp3(41); voith3<= temp3(30)& temp3(35); voith4<= temp3(24)& temp3(29); voith5<= temp3(18)& temp3(23); voith6<= temp3(12)& temp3(17); voith7<= temp3(6)& temp3(11); voith8<= temp3(0)& temp3(5); counter<= counter+1; when 12=> --s1 s8 tables temp4(28 to 31)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks8(conv_integer(voith1), CONV_INTEGER(temp3(43 to 46))), 4); temp4(24 to 27)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks7(conv_integer(voith2), CONV_INTEGER(temp3(37 to 40))), 4); temp4(20 to 23)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks6( CONV_INTEGER(voith3), CONV_INTEGER(temp3(31 to 34))), 4); temp4(16 to 19)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks5( CONV_INTEGER(voith4), CONV_INTEGER(temp3(25 to 28))), 4); temp4(12 to 15)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks4( CONV_INTEGER(voith5), CONV_INTEGER(temp3(19 to 22))), 4); temp4(8 to 11)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks3( CONV_INTEGER(voith6), CONV_INTEGER(temp3(13 to 16))), 4); temp4(4 to 7)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks2( CONV_INTEGER(voith7), CONV_INTEGER(temp3(7 to 10))), 4); temp4(0 to 3)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks1( CONV_INTEGER(voith8), CONV_INTEGER(temp3(1 to 4))), 4); when 13=> --P table temp4<=temp4(15) & temp4(6) & temp4(19) & temp4(20) & yyyyyyyyyyyyyyyytemp4(28) & temp4(11) & temp4(27) & temp4(16) & temp4(0) & yyyyyyyyyyyyyyyytemp4(14) & temp4(22) & temp4(25) & temp4(4) & temp4(17) & yyyyyyyyyyyyyyyytemp4(30) & temp4(9) & temp4(1) & temp4(7) & temp4(23) & yyyyyyyyyyyyyyyytemp4(13) & temp4(31) & temp4(26) & temp4(2) & temp4(8) & yyyyyyyyyyyyyyyytemp4(18) & temp4(12) & temp4(29) & temp4(5) & temp4(21) & yyyyyyyyyyyyyyyytemp4(10) & temp4(3) & temp4(24); 155

157 when 14 => -- temp είναι η έξοδος του function_f temp<=temp4 xor state(0 to 31); temp2<=state(32 to 63); counter<=1+counter; when 15 => -- αλλαγή δεξιού και αριστερού μέρους του state if (counter2=15) then state(0 to 31):=temp; counter<=1+counter; else state(0 to 31):=temp2; state(32 to 63):=temp; counter<=10; counter2<=1+counter2; when 16=> IP -1 state:= state(39) & state(7) & state(47) & kkkkkkkkkkkkkkkkkkkstate(15) & state(55) & state(23) & state(63) & kkkkkkkkkkkkkkkkkkkstate(31) & state(38) & state(6) & state(46) & kkkkkkkkkkkkkkkkkkkstate(14) & state(54) & state(22) & state(62) & kkkkkkkkkkkkkkkkkkkstate(30) & state(37) & state(5) & state(45) & kkkkkkkkkkkkkkkkkkkstate(13) & state(53) & state(21) & state(61) & kkkkkkkkkkkkkkkkkkkstate(29) & state(36) & state(4) & state(44) & kkkkkkkkkkkkkkkkkkkstate(12) & state(52) & state(20) & state(60) & kkkkkkkkkkkkkkkkkkkstate(28) & state(35) & state(3) & state(43) & kkkkkkkkkkkkkkkkkkkstate(11) & state(51) & state(19) & state(59) & kkkkkkkkkkkkkkkkkkkstate(27) & state(34) & state(2) & state(42) & kkkkkkkkkkkkkkkkkkkstate(10) & state(50) & state(18) & state(58) & kkkkkkkkkkkkkkkkkkkstate(26) & state(33) & state(1) & state(41) & state(9) kkkkkkkkkkkkkkkkkkk& state(49) & state(17) & state(57) & state(25) & kkkkkkkkkkkkkkkkkkkstate(32) & state(0) & state(40) & state(8) & state(48) kkkkkkkkkkkkkkkkkkk& state(16) & state(56) & state(24); counter<=7; --output state when 30=> --decrypt IP kkkkkkkkkkstate:= state(57) & state(49) & state(41) & state(33) & kkkkkkkkkkkkkkkkkkkkkstate(25) & state(17) & state(9) & state(1) & kkkkkkkkkkkkkkkkkkkkkstate(59) & state(51) & state(43) & state(35) & kkkkkkkkkkkkkkkkkkkkkstate(27) & state(19) & state(11) & state(3) & kkkkkkkkkkkkkkkkkkkkkstate(61) & state(53) & state(45) & state(37) & kkkkkkkkkkkkkkkkkkkkkstate(29) & state(21) & state(13) & state(5) & kkkkkkkkkkkkkkkkkkkkkstate(63) & state(55) & state(47) & state(39) & kkkkkkkkkkkkkkkkkkkkkstate(31) & state(23) & state(15) & state(7) & kkkkkkkkkkkkkkkkkkkkkstate(56) & state(48) & state(40) & state(32) & kkkkkkkkkkkkkkkkkkkkkstate(24) & state(16) & state(8) & state(0) & kkkkkkkkkkkkkkkkkkkkkstate(58) & state(50) & state(42) & state(34) & kkkkkkkkkkkkkkkkkkkkkstate(26) & state(18) & state(10) & state(2) & kkkkkkkkkkkkkkkkkkkkkstate(60) & state(52) & state(44) & state(36) & 156

158 kkkkkkkkkkkkkkkkkkkkkstate(28) & state(20) & state(12) & state(4) & counter2<=15; when 31=> --E table --function_f temp3:=(state(63) & state(32) & state(33) & state(34) & n n state(35) & state(36) & state(35) & state(36) & n n n state(37) & state(38) & state(39) & state(40) & n n state(39) & state(40) & state(41) & state(42) & n n state(43) & state(44) & state(43) & state(44) & state(45) & state(46) & state(47) & n n n state(48) & state(47) & state(48) & state(49) & n n n state(50) & state(51) & state(52) & state(51) & n n n n state(52) & state(53) & state(54) & state(55)& n n nn n nnnnnnnnnnnnnnnn state(56) & state(55) & state(56) & state(57)& nnnnnnnnnnnnnnnnnnn state(58) & state(59) & state(60) & state(59)& nnnnnnnnnnnnnnnnnnn state(60) & state(61) & state(62) & state(63) & state(32)) xor key_data(counter2); when 32=> voith1<= temp3(42)& temp3(47); voith2<= temp3(36)& temp3(41); voith3<= temp3(30)& temp3(35); voith4<= temp3(24)& temp3(29); voith5<= temp3(18)& temp3(23); voith6<= temp3(12)& temp3(17); voith7<= temp3(6)& temp3(11); voith8<= temp3(0)& temp3(5); counter<= counter+1; when 33=> --s1 s8 tables temp4(28 to 31)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks8(conv_integer(voith1), CONV_INTEGER(temp3(43 to 46))), 4); temp4(24 to 27)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks7(conv_integer(voith2), CONV_INTEGER(temp3(37 to 40))), 4); temp4(20 to 23)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks6( CONV_INTEGER(voith3), CONV_INTEGER(temp3(31 to 34))), 4); temp4(16 to 19)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks5( CONV_INTEGER(voith4), CONV_INTEGER(temp3(25 to 28))), 4); temp4(12 to 15)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks4( CONV_INTEGER(voith5), CONV_INTEGER(temp3(19 to 22))), 4); temp4(8 to 11)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks3( CONV_INTEGER(voith6), CONV_INTEGER(temp3(13 to 16))), 4); temp4(4 to 7)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks2( CONV_INTEGER(voith7), CONV_INTEGER(temp3(7 to 10))), 4); temp4(0 to 3)<= CONV_STD_LOGIC_VECTOR( kkkkkkkkkkkkks1( CONV_INTEGER(voith8), CONV_INTEGER(temp3(1 to 4))), 4); when 34=> --P table temp4<=temp4(15) & temp4(6) & temp4(19) & temp4(20) & yyyyyyyyyyyyyyyytemp4(28) & temp4(11) & temp4(27) & temp4(16) & temp4(0) & yyyyyyyyyyyyyyyytemp4(14) & temp4(22) & temp4(25) & temp4(4) & temp4(17) & yyyyyyyyyyyyyyyytemp4(30) & temp4(9) & temp4(1) & temp4(7) & temp4(23) & 157

159 yyyyyyyyyyyyyyyytemp4(13) & temp4(31) & temp4(26) & temp4(2) & temp4(8) & yyyyyyyyyyyyyyyytemp4(18) & temp4(12) & temp4(29) & temp4(5) & temp4(21) & yyyyyyyyyyyyyyyytemp4(10) & temp4(3) & temp4(24); when 35 => -- temp είναι η έξοδος του function_f temp<=temp4 xor state(0 to 31); temp2<=state(32 to 63); counter<=1+counter; when 36 => if (counter2=0) then state(0 to 31):=temp; counter<=1+counter; else state(0 to 31):=temp2; state(32 to 63):=temp; counter<=31; counter2<=counter2-1; when 37=> IP -1 state:= state(39) & state(7) & state(47) & kkkkkkkkkkkkkkkkkkkstate(15) & state(55) & state(23) & state(63) & kkkkkkkkkkkkkkkkkkkstate(31) & state(38) & state(6) & state(46) & kkkkkkkkkkkkkkkkkkkstate(14) & state(54) & state(22) & state(62) & kkkkkkkkkkkkkkkkkkkstate(30) & state(37) & state(5) & state(45) & kkkkkkkkkkkkkkkkkkkstate(13) & state(53) & state(21) & state(61) & kkkkkkkkkkkkkkkkkkkstate(29) & state(36) & state(4) & state(44) & kkkkkkkkkkkkkkkkkkkstate(12) & state(52) & state(20) & state(60) & kkkkkkkkkkkkkkkkkkkstate(28) & state(35) & state(3) & state(43) & kkkkkkkkkkkkkkkkkkkstate(11) & state(51) & state(19) & state(59) & kkkkkkkkkkkkkkkkkkkstate(27) & state(34) & state(2) & state(42) & kkkkkkkkkkkkkkkkkkkstate(10) & state(50) & state(18) & state(58) & kkkkkkkkkkkkkkkkkkkstate(26) & state(33) & state(1) & state(41) & state(9) kkkkkkkkkkkkkkkkkkk& state(49) & state(17) & state(57) & state(25) & kkkkkkkkkkkkkkkkkkkstate(32) & state(0) & state(40) & state(8) & state(48) kkkkkkkkkkkkkkkkkkk& state(16) & state(56) & state(24); counter<=7; --output state when others => ready<='1'; end case; end process; end Behavioral; 158

160 Προσάρτημα Γ Η οθόνη LCD Οι διευθύνσεις της κάθε θέσης της οθόνης φαίνονται παρακάτω: Ο κωδικός κάθε ψηφίου φαίνεται παρακάτω: 159

161 Ο τρόπος επικοινωνίας με 4- bit φαίνεται παρακάτω: Κάθε εντολή έχει μήκος 8 bit και στέλνεται μέσα σε 2 γύρους μέσω του 4-bit interface. Οι εντολές τις οθόνης LCD φαίνονται παρακάτω: 160

162 Όπου: Και ένα παράδειγμα εκτύπωσης χαρακτήρα στην οθόνη για πρώτη φορά: 161

Εφαρμοσμένη Κρυπτογραφία Ι

Εφαρμοσμένη Κρυπτογραφία Ι Εφαρμοσμένη Κρυπτογραφία Ι Κωνσταντίνου Ελισάβετ ekonstantinou@aegean.gr http://www.icsd.aegean.gr/ekonstantinou Συμμετρικά Κρυπτοσυστήματα κλειδί k Αρχικό κείμενο (m) Αλγόριθμος Κρυπτογράφησης Ε c = E

Διαβάστε περισσότερα

Εφαρμοσμένη Κρυπτογραφία Ι

Εφαρμοσμένη Κρυπτογραφία Ι Εφαρμοσμένη Κρυπτογραφία Ι Κωνσταντίνου Ελισάβετ ekonstantinou@aegean.gr http://www.icsd.aegean.gr/ekonstantinou Ασύμμετρα Κρυπτοσυστήματα κλειδί κρυπτογράφησης k1 Αρχικό κείμενο (m) (δημόσιο κλειδί) Αλγόριθμος

Διαβάστε περισσότερα

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Κρυπτογραφία Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Block ciphers και ψευδοτυχαίες

Διαβάστε περισσότερα

ΤΕΙ Κρήτης Τμήμα Μηχανικών Πληροφορικής. Συμμετρική Κρυπτογραφία

ΤΕΙ Κρήτης Τμήμα Μηχανικών Πληροφορικής. Συμμετρική Κρυπτογραφία ΤΕΙ Κρήτης Τμήμα Μηχανικών Πληροφορικής Συμμετρική Κρυπτογραφία Εισαγωγή Στην συνηθισμένη κρυπτογραφία, ο αποστολέας και ο παραλήπτης ενός μηνύματος γνωρίζουν και χρησιμοποιούν το ίδιο μυστικό κλειδί.

Διαβάστε περισσότερα

Κρυπτογραφία. Κρυπτοσυστήματα πακέτου (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας

Κρυπτογραφία. Κρυπτοσυστήματα πακέτου (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Κρυπτογραφία Κρυπτοσυστήματα πακέτου (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Block ciphers και ψευδοτυχαίες

Διαβάστε περισσότερα

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Κρυπτογραφία Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Σχολή ΗΜΜΥ ΕΜΠ Κρυπτογραφία

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών. Aσφάλεια

Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών. Aσφάλεια Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών Aσφάλεια ΣΤΟΧΟΙ ΚΕΦΑΛΑΙΟΥ Ορισµός τριών στόχων ασφάλειας - Εµπιστευτικότητα, ακεραιότητα και διαθεσιµότητα Επιθέσεις Υπηρεσίες και Τεχνικές

Διαβάστε περισσότερα

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Κρυπτογραφία Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Block ciphers (κρυπτοσυστήματα

Διαβάστε περισσότερα

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας

Κρυπτογραφία. Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Κρυπτογραφία Κρυπτοσυστήματα τμήματος (Block ciphers) Άρης Παγουρτζής Στάθης Ζάχος Πέτρος Ποτίκας Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Σχολή ΗΜΜΥ ΕΜΠ 1 / 26

Διαβάστε περισσότερα

Ασφάλεια Υπολογιστικών Συστηµάτων

Ασφάλεια Υπολογιστικών Συστηµάτων Ορισµοί Κρυπτογράφηση: η διεργασία µετασχηµατισµού ενός µηνύµατος µεταξύ ενός αποστολέα και ενός παραλήπτη σε µια ακατανόητη µορφή ώστε αυτό να µην είναι αναγνώσιµο από τρίτους Αποκρυπτογράφηση: η διεργασία

Διαβάστε περισσότερα

Κρυπτογραφία. Κεφάλαιο 1 Γενική επισκόπηση

Κρυπτογραφία. Κεφάλαιο 1 Γενική επισκόπηση Κρυπτογραφία Κεφάλαιο 1 Γενική επισκόπηση Ανασκόπηση ύλης Στόχοι της κρυπτογραφίας Ιστορικό Γενικά χαρακτηριστικά Κλασσική κρυπτογραφία Συμμετρικού κλειδιού (block ciphers stream ciphers) Δημοσίου κλειδιού

Διαβάστε περισσότερα

Δ Εξάμηνο. Κρυπτογραφία: Συμμετρική Κρυπτογράφηση

Δ Εξάμηνο. Κρυπτογραφία: Συμμετρική Κρυπτογράφηση ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Δ Εξάμηνο Κρυπτογραφία: Συμμετρική Κρυπτογράφηση Διδάσκων : Δρ. Παρασκευάς Κίτσος http://www.diceslab.cied.teiwest.gr Επίκουρος Καθηγητής Εργαστήριο Σχεδίασης Ψηφιακών

Διαβάστε περισσότερα

Κρυπτογραφία. Κωνσταντίνου Ελισάβετ

Κρυπτογραφία. Κωνσταντίνου Ελισάβετ Κρυπτογραφία Κωνσταντίνου Ελισάβετ ekonstantinou@aegean.gr http://www.icsd.aegean.gr/ekonstantinou Συμμετρικά Κρυπτοσυστήματα κλειδί k Αρχικό κείμενο (m) Αλγόριθμος Κρυπτογράφησης Ε c = E k (m) Κρυπτογραφημένο

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Κρυπτοαλγόριθμοι. Χρήστος Ξενάκης

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Κρυπτοαλγόριθμοι. Χρήστος Ξενάκης Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Κρυπτογραφία Κρυπτοαλγόριθμοι Χρήστος Ξενάκης Θεωρία Πληροφορίας Η Θεωρία πληροφορίας (Shannon 1948 1949) σχετίζεται με τις επικοινωνίες και την ασφάλεια

Διαβάστε περισσότερα

Κρυπτογραφία. Κωνσταντίνου Ελισάβετ

Κρυπτογραφία. Κωνσταντίνου Ελισάβετ Κρυπτογραφία Κωνσταντίνου Ελισάβετ ekonstantinou@aegean.gr http://www.icsd.aegean.gr/ekonstantinou AES Ιαν. 1997: Το NIST (National Institute of Standards and Technology) απευθύνει κάλεσμα για τη δημιουργία

Διαβάστε περισσότερα

Υπολογιστική Θεωρία Αριθμών και Κρυπτογραφία

Υπολογιστική Θεωρία Αριθμών και Κρυπτογραφία Υπολογιστική Θεωρία Αριθμών και Κρυπτογραφία Συμμετρικά κρυπτοσυστήματα Άρης Παγουρτζής Στάθης Ζάχος Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Σχολή ΗΜΜΥ ΕΜΠ 1

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών. Aσφάλεια

Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών. Aσφάλεια Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών Aσφάλεια Περιεχόμενα Πλευρές Ασφάλειας Ιδιωτικό Απόρρητο Μέθοδος Μυστικού Κλειδιού (Συμμετρική Κρυπτογράφηση) Μέθοδος Δημόσιου Κλειδιού (Ασύμμετρη

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη της Πληροφορικής και των. Aσφάλεια

Εισαγωγή στην επιστήμη της Πληροφορικής και των. Aσφάλεια Εισαγωγή στην επιστήμη της Πληροφορικής και των Τηλεπικοινωνιών Aσφάλεια Περιεχόμενα Πλευρές Ασφάλειας Ιδιωτικό Απόρρητο Μέθοδος Μυστικού Κλειδιού (Συμμετρική Κρυπτογράφηση) Μέθοδος Δημόσιου Κλειδιού (Ασύμμετρη

Διαβάστε περισσότερα

Κρυπτογραφία. Εργαστηριακό μάθημα 1

Κρυπτογραφία. Εργαστηριακό μάθημα 1 Κρυπτογραφία Εργαστηριακό μάθημα 1 Βασικοί όροι Με τον όρο κρυπτογραφία εννοούμε τη μελέτη μαθηματικών τεχνικών που στοχεύουν στην εξασφάλιση θεμάτων που άπτονται της ασφάλειας μετάδοσης της πληροφορίας,

Διαβάστε περισσότερα

Υπολογιστικά & Διακριτά Μαθηματικά

Υπολογιστικά & Διακριτά Μαθηματικά Υπολογιστικά & Διακριτά Μαθηματικά Ενότητα 9: Εσωτερική πράξη και κλάσεις ισοδυναμίας - Δομές Ισομορφισμοί Στεφανίδης Γεώργιος Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Θεωρία αριθμών Αλγεβρικές δομές. Χρήστος Ξενάκης

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Θεωρία αριθμών Αλγεβρικές δομές. Χρήστος Ξενάκης Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Κρυπτογραφία Θεωρία αριθμών Αλγεβρικές δομές Χρήστος Ξενάκης Το σύνολο των ακεραίων Ζ = {..., -2, -1, 0, 1, 2,...} Το σύνολο των φυσικών Ν = {0, 1, 2,...}

Διαβάστε περισσότερα

ΠΕΡΙΕΧΟΜΕΝΑ 1. Εισαγωγή 2. Θεωρία αριθμών Αλγεβρικές δομές 3. Οι κρυπταλγόριθμοι και οι ιδιότητές τους

ΠΕΡΙΕΧΟΜΕΝΑ 1. Εισαγωγή 2. Θεωρία αριθμών Αλγεβρικές δομές  3. Οι κρυπταλγόριθμοι και οι ιδιότητές τους ΠΕΡΙΕΧΟΜΕΝΑ 1. Εισαγωγή... 1 1.1. Ορισμοί και ορολογία... 2 1.1.1. Συμμετρικά και ασύμμετρα κρυπτοσυστήματα... 4 1.1.2. Κρυπτογραφικές υπηρεσίες και πρωτόκολλα... 9 1.1.3. Αρχές μέτρησης κρυπτογραφικής

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Συμμετρική Κρυπτογραφία. Χρήστος Ξενάκης

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Συμμετρική Κρυπτογραφία. Χρήστος Ξενάκης Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Κρυπτογραφία Συμμετρική Κρυπτογραφία Χρήστος Ξενάκης Χρονολογείται από την Αρχαία Αίγυπτο Η πλειοψηφία των συμμετρικών κρυπτοαλγορίθμων είναι κρυπτοαλγόριθμοι

Διαβάστε περισσότερα

Αριθμοθεωρητικοί Αλγόριθμοι

Αριθμοθεωρητικοί Αλγόριθμοι Αλγόριθμοι που επεξεργάζονται μεγάλους ακέραιους αριθμούς Μέγεθος εισόδου: Αριθμός bits που απαιτούνται για την αναπαράσταση των ακεραίων. Έστω ότι ένας αλγόριθμος λαμβάνει ως είσοδο έναν ακέραιο Ο αλγόριθμος

Διαβάστε περισσότερα

Εφαρμοσμένη Κρυπτογραφία Ι

Εφαρμοσμένη Κρυπτογραφία Ι Εφαρμοσμένη Κρυπτογραφία Ι Κωνσταντίνου Ελισάβετ ekonstantinou@aegean.gr http://www.icsd.aegean.gr/ekonstantinou Συνολικό Πλαίσιο Ασφάλεια ΠΕΣ Εμπιστευτικότητα Ακεραιότητα Πιστοποίηση Μη-αποποίηση Κρυπτογράφηση

Διαβάστε περισσότερα

Υπολογιστικά & Διακριτά Μαθηματικά

Υπολογιστικά & Διακριτά Μαθηματικά Υπολογιστικά & Διακριτά Μαθηματικά Ενότητα 11: Αριθμητική υπολοίπων-δυνάμεις Στεφανίδης Γεώργιος Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

Γραμμική Αλγεβρα ΙΙ Διάλεξη 1 Εισαγωγή Χρήστος Κουρουνιώτης Πανεπισ τήμιο Κρήτης 19/2/2014 Χ.Κουρουνιώτης (Παν.Κρήτης) Διάλεξη 1 19/2/ / 13

Γραμμική Αλγεβρα ΙΙ Διάλεξη 1 Εισαγωγή Χρήστος Κουρουνιώτης Πανεπισ τήμιο Κρήτης 19/2/2014 Χ.Κουρουνιώτης (Παν.Κρήτης) Διάλεξη 1 19/2/ / 13 Γραμμική Άλγεβρα ΙΙ Διάλεξη 1 Εισαγωγή Χρήστος Κουρουνιώτης Πανεπιστήμιο Κρήτης 19/2/2014 Χ.Κουρουνιώτης (Παν.Κρήτης) Διάλεξη 1 19/2/2014 1 / 13 Εισαγωγή Τι έχουμε μάθει; Στο πρώτο μάθημα Γραμμικής Άλγεβρας

Διαβάστε περισσότερα

Πρόβληµα 2 (15 µονάδες)

Πρόβληµα 2 (15 µονάδες) ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΕΦΑΡΜΟΓΕΣ, 2013-2014 ΔΙΔΑΣΚΩΝ: Ε. Μαρκάκης Πρόβληµα 1 (5 µονάδες) 2 η Σειρά Ασκήσεων Προθεσµία Παράδοσης: 19/1/2014 Υπολογίστε

Διαβάστε περισσότερα

Συμμετρικά κρυπτοσυστήματα

Συμμετρικά κρυπτοσυστήματα Υπολογιστική Θεωρία Αριθμών και Κρυπτογραφία Συμμετρικά κρυπτοσυστήματα Άρης Παγουρτζής Στάθης Ζάχος Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών - Μηχανικών Υπολογιστών Δίκτυα Feistel Σημαντικές

Διαβάστε περισσότερα

KΕΦΑΛΑΙΟ 1 ΧΡΗΣΙΜΕΣ ΜΑΘΗΜΑΤΙΚΕΣ ΕΝΝΟΙΕΣ. { 1,2,3,..., n,...

KΕΦΑΛΑΙΟ 1 ΧΡΗΣΙΜΕΣ ΜΑΘΗΜΑΤΙΚΕΣ ΕΝΝΟΙΕΣ. { 1,2,3,..., n,... KΕΦΑΛΑΙΟ ΧΡΗΣΙΜΕΣ ΜΑΘΗΜΑΤΙΚΕΣ ΕΝΝΟΙΕΣ Βασικές έννοιες διαιρετότητας Θα συµβολίζουµε µε, τα σύνολα των φυσικών αριθµών και των ακεραίων αντιστοίχως: {,,3,,, } { 0,,,,, } = = ± ± ± Ορισµός Ένας φυσικός αριθµός

Διαβάστε περισσότερα

Υπολογιστικά & Διακριτά Μαθηματικά

Υπολογιστικά & Διακριτά Μαθηματικά Υπολογιστικά & Διακριτά Μαθηματικά Ενότητα 8: Σχέσεις - Πράξεις Δομές Στεφανίδης Γεώργιος Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό,

Διαβάστε περισσότερα

Fast Fourier Transform

Fast Fourier Transform Fast Fourier Transform Παναγιώτης Πατσιλινάκος ΕΜΕ 19 Οκτωβρίου 2017 Παναγιώτης Πατσιλινάκος (ΕΜΕ) Fast Fourier Transform 19 Οκτωβρίου 2017 1 / 20 1 Εισαγωγή Στόχος Προαπαιτούμενα 2 Η ιδέα Αντιστροφή -

Διαβάστε περισσότερα

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή 1. Ηλεκτρονικός Υπολογιστής Ο Ηλεκτρονικός Υπολογιστής είναι μια συσκευή, μεγάλη ή μικρή, που επεξεργάζεται δεδομένα και εκτελεί την εργασία του σύμφωνα με τα παρακάτω

Διαβάστε περισσότερα

Αριθμητική Ανάλυση και Εφαρμογές

Αριθμητική Ανάλυση και Εφαρμογές Αριθμητική Ανάλυση και Εφαρμογές Διδάσκων: Δημήτριος Ι. Φωτιάδης Τμήμα Μηχανικών Επιστήμης Υλικών Ιωάννινα 07-08 Πεπερασμένες και Διαιρεμένες Διαφορές Εισαγωγή Θα εισάγουμε την έννοια των διαφορών με ένα

Διαβάστε περισσότερα

Υπολογιστικά & Διακριτά Μαθηματικά

Υπολογιστικά & Διακριτά Μαθηματικά Υπολογιστικά & Διακριτά Μαθηματικά Ενότητα 10: Αριθμητική υπολοίπων - Κυκλικές ομάδες: Διαιρετότητα - Ευκλείδειος αλγόριθμος - Κατάλοιπα Στεφανίδης Γεώργιος Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

Ασφάλεια Πληροφοριακών Συστημάτων

Ασφάλεια Πληροφοριακών Συστημάτων Ασφάλεια Πληροφοριακών Συστημάτων Κρυπτογραφία/Ψηφιακές Υπογραφές Διάλεξη 2η Δρ. Β. Βασιλειάδης Τμ. Διοίκησης Επιχειρήσεων, ΤΕΙ Δυτ. Ελλάδας Kρυπτανάλυση Προσπαθούμε να σπάσουμε τον κώδικα. Ξέρουμε το

Διαβάστε περισσότερα

Κρυπτογραφία. Κεφάλαιο 4 Αλγόριθμοι Δημοσίου Κλειδιού (ή ασύμμετροι αλγόριθμοι)

Κρυπτογραφία. Κεφάλαιο 4 Αλγόριθμοι Δημοσίου Κλειδιού (ή ασύμμετροι αλγόριθμοι) Κρυπτογραφία Κεφάλαιο 4 Αλγόριθμοι Δημοσίου Κλειδιού (ή ασύμμετροι αλγόριθμοι) Κρυπτοσυστήματα Δημοσίου κλειδιού Αποστολέας P Encryption C Decryption P Παραλήπτης Προτάθηκαν το 1976 Κάθε συμμετέχων στο

Διαβάστε περισσότερα

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά και Πληροφορικής Μαθηματικά Πανεπιστήμιο ΙΙ Ιωαννίνων

Διαβάστε περισσότερα

G 1 = G/H. I 3 = {f R : f(1) = 2f(2) ή f(1) = 3f(2)}. I 5 = {f R : f(1) = 0}.

G 1 = G/H. I 3 = {f R : f(1) = 2f(2) ή f(1) = 3f(2)}. I 5 = {f R : f(1) = 0}. Αλγεβρα ΙΙ, Εαρινο Εξαμηνο 2017 18 Ασκησεις που συζητηθηκαν στο φροντιστηριο Φροντιστήριο 1. 1. Δίνεται η ομάδα G = Z 4 Z 8, το στοιχείο a = (1, 2) της G, και η υποομάδα H =< a > της G. Εστω G 1 = G/H.

Διαβάστε περισσότερα

Πληροφορική Ι. Μάθημα 10 ο Ασφάλεια. Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας. Δρ. Γκόγκος Χρήστος

Πληροφορική Ι. Μάθημα 10 ο Ασφάλεια. Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας. Δρ. Γκόγκος Χρήστος Οι διαφάνειες έχουν βασιστεί στο βιβλίο «Εισαγωγή στην επιστήμη των υπολογιστών» του B. Forouzanκαι Firoyz Mosharraf(2 η έκδοση-2010) Εκδόσεις Κλειδάριθμος Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου

Διαβάστε περισσότερα

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών Ασφάλεια Δεδομένων.

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών Ασφάλεια Δεδομένων. Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής στην Επιστήμη των Υπολογιστών 2015-16 Ασφάλεια Δεδομένων http://www.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Οι απειλές Ένας κακόβουλος χρήστης Καταγράφει μηνύματα

Διαβάστε περισσότερα

Κεφάλαιο 2. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας. Περιεχόμενα. 2.1 Αριθμητικά Συστήματα. Εισαγωγή

Κεφάλαιο 2. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας. Περιεχόμενα. 2.1 Αριθμητικά Συστήματα. Εισαγωγή Κεφάλαιο. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας Περιεχόμενα. Αριθμητικά συστήματα. Μετατροπή αριθμών από ένα σύστημα σε άλλο.3 Πράξεις στο δυαδικό σύστημα.4 Πράξεις στο δεκαεξαδικό σύστημα.5

Διαβάστε περισσότερα

Δυαδικό Σύστημα Αρίθμησης

Δυαδικό Σύστημα Αρίθμησης Δυαδικό Σύστημα Αρίθμησης Το δυαδικό σύστημα αρίθμησης χρησιμοποιεί δύο ψηφία. Το 0 και το 1. Τα ψηφία ενός αριθμού στο δυαδικό σύστημα αρίθμησης αντιστοιχίζονται σε δυνάμεις του 2. Μονάδες, δυάδες, τετράδες,

Διαβάστε περισσότερα

ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ(Θ)

ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ(Θ) ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ(Θ) Ενότητα 4: ΑΣΦΑΛΕΙΑ & ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΩΝ ΔΙΔΑΣΚΩΝ: ΚΩΝΣΤΑΝΤΙΝΟΣ ΧΕΙΛΑΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ 1 Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

UP class. & DES και AES

UP class. & DES και AES Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Σημειώσεις Διαλέξεων UP class & DES και AES Επιμέλεια σημειώσεων: Ιωάννης Νέμπαρης Μάριος Κουβαράς Διδάσκοντες: Στάθης Ζάχος

Διαβάστε περισσότερα

Κρυπ Κρ το υπ γραφία Κρυπ Κρ το υπ λογίας

Κρυπ Κρ το υπ γραφία Κρυπ Κρ το υπ λογίας Διαχείριση και Ασφάλεια Τηλεπικοινωνιακών Συστημάτων Κρυπτογραφία Κρυπτογραφία Η Κρυπτογραφία (cryptography) είναι ένας κλάδος της επιστήμης της Κρυπτολογίας (cryptology), η οποία ασχολείται με την μελέτη

Διαβάστε περισσότερα

Οι απειλές. Απόρρητο επικοινωνίας. Αρχές ασφάλειας δεδομένων. Απόρρητο (privacy) Μέσω κρυπτογράφησης

Οι απειλές. Απόρρητο επικοινωνίας. Αρχές ασφάλειας δεδομένων. Απόρρητο (privacy) Μέσω κρυπτογράφησης Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής στην Επιστήμη των Υπολογιστών 2014-015 Ασφάλεια Δεδομένων http://www.ionio.gr/~mistral/tp/csintro/ Οι απειλές Ένας κακόβουλος χρήστης Καταγράφει μηνύματα που ανταλλάσσονται

Διαβάστε περισσότερα

κρυπτογραϕία Ψηφιακή ασφάλεια και ιδιωτικότητα Γεώργιος Σπαθούλας Msc Πληροφορική και υπολογιστική βιοιατρική Πανεπιστήμιο Θεσσαλίας

κρυπτογραϕία Ψηφιακή ασφάλεια και ιδιωτικότητα Γεώργιος Σπαθούλας Msc Πληροφορική και υπολογιστική βιοιατρική Πανεπιστήμιο Θεσσαλίας κρυπτογραϕία Ψηφιακή ασφάλεια και ιδιωτικότητα Γεώργιος Σπαθούλας Msc Πληροφορική και υπολογιστική βιοιατρική Πανεπιστήμιο Θεσσαλίας ιδιότητες ασϕάλειας ιδιότητες ασϕάλειας αγαθών Εμπιστευτικότητα (Confidentiality)

Διαβάστε περισσότερα

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά και Πληροφορικής Μαθηματικά Πανεπιστήμιο ΙΙ Ιωαννίνων

Διαβάστε περισσότερα

a = a a Z n. a = a mod n.

a = a a Z n. a = a mod n. Αλγεβρα Ι Χειμερινο Εξαμηνο 2017 18 Διάλεξη 1 Ενότητα 1. Πράξεις: Πράξεις στο σύνολο S, ο πίνακας της πράξης, αντιμεταθετικές πράξεις. Προσεταιριστικές πράξεις, το στοιχείο a 1 a 2 a n. Η πράξη «σύνθεση

Διαβάστε περισσότερα

(a + b) + c = a + (b + c), (ab)c = a(bc) a + b = b + a, ab = ba. a(b + c) = ab + ac

(a + b) + c = a + (b + c), (ab)c = a(bc) a + b = b + a, ab = ba. a(b + c) = ab + ac Σημειώσεις μαθήματος Μ1212 Γραμμική Άλγεβρα ΙΙ Χρήστος Κουρουνιώτης ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ 2014 Κεφάλαιο 1 Διανυσματικοί Χώροι Στο εισαγωγικό μάθημα Γραμμικής Άλγεβρας ξεκινήσαμε μελετώντας

Διαβάστε περισσότερα

8.3.4 Τεχνικές Ασφάλειας Συμμετρική Κρυπτογράφηση Ασυμμετρική Κρυπτογράφηση Ψηφιακές Υπογραφές

8.3.4 Τεχνικές Ασφάλειας Συμμετρική Κρυπτογράφηση Ασυμμετρική Κρυπτογράφηση Ψηφιακές Υπογραφές Κεφάλαιο 8 8.3.4 Τεχνικές Ασφάλειας Συμμετρική Κρυπτογράφηση Ασυμμετρική Κρυπτογράφηση Ψηφιακές Υπογραφές Σελ. 320-325 Γεώργιος Γιαννόπουλος ΠΕ19, ggiannop (at) sch.gr http://diktya-epal-g.ggia.info/ Creative

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Ενότητα 3 Λειτουργίες σε Bits, Αριθμητικά Συστήματα Χρήστος Γκουμόπουλος Πανεπιστήμιο Αιγαίου Τμήμα Μηχανικών Πληροφοριακών και Επικοινωνιακών Συστημάτων Φύση υπολογιστών Η

Διαβάστε περισσότερα

Εργαστήριο Ασφάλεια Πληροφοριακών Συστημάτων. Συναρτήσεις Κατακερματισμού

Εργαστήριο Ασφάλεια Πληροφοριακών Συστημάτων. Συναρτήσεις Κατακερματισμού ΤΕΙ ΚΡΗΤΗΣ ΤΜΉΜΑ ΜΗΧΑΝΙΚΏΝ ΠΛΗΡΟΦΟΡΙΚΉΣ Εργαστήριο Ασφάλεια Πληροφοριακών Συστημάτων Συναρτήσεις Κατακερματισμού Ο όρος συνάρτηση κατακερματισμού (hash function) υποδηλώνει ένα μετασχηματισμό που παίρνει

Διαβάστε περισσότερα

ΑΣΥΜΜΕΤΡΗ ΚΡΥΠΤΟΓΡΑΦΙΑ Lab 3

ΑΣΥΜΜΕΤΡΗ ΚΡΥΠΤΟΓΡΑΦΙΑ Lab 3 ΑΣΥΜΜΕΤΡΗ ΚΡΥΠΤΟΓΡΑΦΙΑ Lab 3 Η Aσύμμετρη Kρυπτογραφία ή Κρυπτογραφία Δημοσίου Κλειδιού χρησιμοποιεί δύο διαφορετικά κλειδιά για την κρυπτογράφηση και αποκρυπτογράφηση. Eπινοήθηκε στο τέλος της δεκαετίας

Διαβάστε περισσότερα

Εφαρμοσμένη Κρυπτογραφία Ι

Εφαρμοσμένη Κρυπτογραφία Ι Εφαρμοσμένη Κρυπτογραφία Ι Κωνσταντίνου Ελισάβετ ekonstantinou@aegean.gr http://www.icsd.aegean.gr/ekonstantinou Η συνάρτηση φ(.) του Euler Για κάθε ακέραιο n > 0, έστω φ(n) το πλήθος των ακεραίων στο

Διαβάστε περισσότερα

Πεπερασμένα σώματα και Κρυπτογραφία Σύμφωνα με τις παραδόσεις του Α. Κοντογεώργη. Τσουκνίδας Ι.

Πεπερασμένα σώματα και Κρυπτογραφία Σύμφωνα με τις παραδόσεις του Α. Κοντογεώργη. Τσουκνίδας Ι. Πεπερασμένα σώματα και Κρυπτογραφία Σύμφωνα με τις παραδόσεις του Α. Κοντογεώργη Τσουκνίδας Ι. 2 Περιεχόμενα 1 Εισαγωγή στα πεπερασμένα σώματα 5 1.1 Μάθημα 1..................................... 5 1.1.1

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ Κ. Δεμέστιχας Εργαστήριο Πληροφορικής Γεωπονικό Πανεπιστήμιο Αθηνών Επικοινωνία μέσω e-mail: cdemest@aua.gr, cdemest@cn.ntua.gr 1 2. ΑΡΙΘΜΗΤΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ ΜΕΡΟΣ Α 2 Τεχνολογία

Διαβάστε περισσότερα

Κρυπτογραφία. Εργαστηριακό μάθημα 5 Stream ciphers Κρυπτανάλυση με τον αλγόριθμο Berlekamp-Massey

Κρυπτογραφία. Εργαστηριακό μάθημα 5 Stream ciphers Κρυπτανάλυση με τον αλγόριθμο Berlekamp-Massey Κρυπτογραφία Εργαστηριακό μάθημα 5 Stream ciphers Κρυπτανάλυση με τον αλγόριθμο Berlekamp-Massey Γενικά χαρακτηριστικά των stream ciphers Keystream Generator K i P i C i Δουλεύουν πάνω σε ένα ρεύμα από

Διαβάστε περισσότερα

Ηλεκτρονικό εμπόριο. HE 7 Τεχνολογίες ασφάλειας

Ηλεκτρονικό εμπόριο. HE 7 Τεχνολογίες ασφάλειας Ηλεκτρονικό εμπόριο HE 7 Τεχνολογίες ασφάλειας Πρόκληση ανάπτυξης ασφαλών συστημάτων Η υποδομή του διαδικτύου παρουσίαζε έλλειψη υπηρεσιών ασφάλειας καθώς η οικογένεια πρωτοκόλλων TCP/IP στην οποία στηρίζεται

Διαβάστε περισσότερα

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ. Δ Εξάμηνο

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ. Δ Εξάμηνο ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Δ Εξάμηνο Εισαγωγή- Βασικές Έννοιες Διδάσκων : Δρ. Παρασκευάς Κίτσος diceslab.cied.teiwest.gr Επίκουρος Καθηγητής Εργαστήριο Σχεδίασης Ψηφιακών Ολοκληρωμένων Κυκλωμάτων

Διαβάστε περισσότερα

KΕΦΑΛΑΙΟ 5 ΨΗΦΙΑΚΕΣ ΥΠΟΓΡΑΦΕΣ

KΕΦΑΛΑΙΟ 5 ΨΗΦΙΑΚΕΣ ΥΠΟΓΡΑΦΕΣ KΕΦΑΛΑΙΟ 5 ΨΗΦΙΑΚΕΣ ΥΠΟΓΡΑΦΕΣ 1 Γενικά Η ψηφιακή υπογραφή είναι µια µέθοδος ηλεκτρονικής υπογραφής όπου ο παραλήπτης ενός υπογεγραµµένου ηλεκτρονικού µηνύµατος µπορεί να διαπιστώσει τη γνησιότητα του,

Διαβάστε περισσότερα

Αριθμητική Ανάλυση & Εφαρμογές

Αριθμητική Ανάλυση & Εφαρμογές Αριθμητική Ανάλυση & Εφαρμογές Διδάσκων: Δημήτριος Ι. Φωτιάδης Τμήμα Μηχανικών Επιστήμης Υλικών Ιωάννινα 2017-2018 Υπολογισμοί και Σφάλματα Παράσταση Πραγματικών Αριθμών Συστήματα Αριθμών Παράσταση Ακέραιου

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Εισαγωγή. Χρήστος Ξενάκης

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Εισαγωγή. Χρήστος Ξενάκης Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Κρυπτογραφία Εισαγωγή Χρήστος Ξενάκης Στόχος του μαθήματος Η παρουσίαση και ανάλυση των βασικών θεμάτων της θεωρίας κρυπτογραφίας. Οι εφαρμογές της κρυπτογραφίας

Διαβάστε περισσότερα

Μετρήσεις και συλλογή δεδομένων (Data acquisition) με μικροελεγκτές. Εισαγωγή στο Arduino. Ηλεκτρομηχανολογικός εξοπλισμός διεργασιών

Μετρήσεις και συλλογή δεδομένων (Data acquisition) με μικροελεγκτές. Εισαγωγή στο Arduino. Ηλεκτρομηχανολογικός εξοπλισμός διεργασιών Μετρήσεις και συλλογή δεδομένων (Data acquisition) με μικροελεγκτές Εισαγωγή στο Arduino Ηλεκτρομηχανολογικός εξοπλισμός διεργασιών Τι είναι Μικροελεγκτής; Ηλεκτρονική συσκευή που διαχειρίζεται ηλεκτρονικά

Διαβάστε περισσότερα

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ. Δ Εξάμηνο

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ. Δ Εξάμηνο ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Δ Εξάμηνο Οι Αλγόριθμοι Κρυπτογραφίας και οι Ιδιότητές τους Διδάσκων : Δρ. Παρασκευάς Κίτσος Επίκουρος Καθηγητής e-mail: pkitsos@teimes.gr, pkitsos@ieee.org Αντίρριο

Διαβάστε περισσότερα

ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ

ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΨΗΦΙΑΚΑ ΣΥΣΤΗΜΑΤΑ ΚΕΦΑΛΑΙΟ 7ο ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ Γενικό διάγραμμα υπολογιστικού συστήματος Γενικό διάγραμμα υπολογιστικού συστήματος - Κεντρική Μονάδα Επεξεργασίας ονομάζουμε

Διαβάστε περισσότερα

Στοιχεία Θεωρίας Αριθμών

Στοιχεία Θεωρίας Αριθμών Ε Μ Π Σ Ε Μ & Φ Ε Σημειώσεις Διαλέξεων Στοιχεία Θεωρίας Αριθμών & Εφαρμογές στην Κρυπτογραφία Επιμέλεια σημειώσεων: Κωστής Γ Διδάσκοντες: Στάθης Ζ Άρης Π 9 Δεκεμβρίου 2011 1 Πιθανές Επιθέσεις στο RSA Υπενθύμιση

Διαβάστε περισσότερα

2 ΘΕΩΡΙΑ ΑΡΙΘΜΩΝ ΑΛΓΕΒΡΙΚΕΣ ΔΟΜΕΣ

2 ΘΕΩΡΙΑ ΑΡΙΘΜΩΝ ΑΛΓΕΒΡΙΚΕΣ ΔΟΜΕΣ ΘΕΩΡΙΑ ΑΡΙΘΜΩΝ ΑΛΓΕΒΡΙΚΕΣ ΔΟΜΕΣ Η θεωρία αριθμών και οι αλγεβρικές δομές τα τελευταία χρόνια χρησιμοποιούνται όλο και περισσότερο στην κρυπτολογία. Αριθμο-θεωρητικοί αλγόριθμοι χρησιμοποιούνται σήμερα

Διαβάστε περισσότερα

Πρόβληµα 2 (12 µονάδες)

Πρόβληµα 2 (12 µονάδες) ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΕΦΑΡΜΟΓΕΣ, 2015-2016 ΔΙΔΑΣΚΟΝΤΕΣ: Ε. Μαρκάκης, Θ. Ντούσκας Λύσεις 2 ης Σειράς Ασκήσεων Πρόβληµα 1 (12 µονάδες) 1) Υπολογίστε τον

Διαβάστε περισσότερα

ΤΟ ΕΣΩΤΕΡΙΚΟ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ

ΤΟ ΕΣΩΤΕΡΙΚΟ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ ΤΟ ΕΣΩΤΕΡΙΚΟ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ ΕΙΣΑΓΩΓΗ Οι υπολογιστές αποτελούνται από πολλά ηλεκτρονικά εξαρτήματα. Κάθε εξάρτημα έχει ειδικό ρόλο στη λειτουργία του υπολογιστή. Όλα όμως έχουν σχεδιαστεί, για να συνεργάζονται,

Διαβάστε περισσότερα

β) 3 n < n!, n > 6 i i! = (n + 1)! 1, n 1 i=1

β) 3 n < n!, n > 6 i i! = (n + 1)! 1, n 1 i=1 Κεφάλαιο 2: Στοιχεία Λογικής - Μέθοδοι Απόδειξης 1. Να αποδειχθεί ότι οι λογικοί τύποι: (p ( (( p) q))) (p q) και p είναι λογικά ισοδύναμοι. Θέλουμε να αποδείξουμε ότι: (p ( (( p) q))) (p q) p, ή με άλλα

Διαβάστε περισσότερα

Κεφάλαια 2&21. Συναρτήσεις κατακερματισμού Πιστοποίηση ταυτότητας μηνυμάτων

Κεφάλαια 2&21. Συναρτήσεις κατακερματισμού Πιστοποίηση ταυτότητας μηνυμάτων Κεφάλαια 2&21 Συναρτήσεις κατακερματισμού Πιστοποίηση ταυτότητας μηνυμάτων Ενεργητικές επιθέσεις Η κρυπτογράφηση παρέχει προστασία από παθητικές επιθέσεις (υποκλοπή). Μια διαφορετική απαίτηση είναι η προστασία

Διαβάστε περισσότερα

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Κρυπτογραφικές Συναρτήσεις. Χρήστος Ξενάκης

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων. Κρυπτογραφία. Κρυπτογραφικές Συναρτήσεις. Χρήστος Ξενάκης Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Κρυπτογραφία Κρυπτογραφικές Συναρτήσεις Χρήστος Ξενάκης Ψευδοτυχαίες ακολουθίες Η επιλογή τυχαίων αριθμών είναι ένα βασικό σημείο στην ασφάλεια των κρυπτοσυστημάτων

Διαβάστε περισσότερα

Εφαρμοσμένη Κρυπτογραφία Ι

Εφαρμοσμένη Κρυπτογραφία Ι Εφαρμοσμένη Κρυπτογραφία Ι Κωνσταντίνου Ελισάβετ ekonstantinou@aegean.gr http://www.icsd.aegean.gr/ekonstantinou Ησυνάρτησηφ(.) του Euler Για κάθε ακέραιο n> 0, έστω φ(n) το πλήθος των ακεραίων στο διάστημα

Διαβάστε περισσότερα

KEΦΑΛΑΙΟ 5 ΨΗΦΙΑΚΑ ΚΡΥΠΤΟΣΥΣΤΗΜΑΤΑ

KEΦΑΛΑΙΟ 5 ΨΗΦΙΑΚΑ ΚΡΥΠΤΟΣΥΣΤΗΜΑΤΑ Βασικές έννοιες KEΦΑΛΑΙΟ 5 ΨΗΦΙΑΚΑ ΚΡΥΠΤΟΣΥΣΤΗΜΑΤΑ Ένα κρυπτοσύστηµα όπου οι χώροι των καθαρών µηνυµάτων, των κρυπτογραφηµένων µυνηµάτων και των κλειδιών είναι ο m,,,... m = καλείται ψηφιακό κρυπτοσύστηµα.

Διαβάστε περισσότερα

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Δ Εξάμηνο Συναρτήσεις Κατακερματισμού και Πιστοποίηση Μηνύματος Διδάσκων : Δρ. Παρασκευάς Κίτσος Επίκουρος Καθηγητής e-mail: pkitsos@teimes.gr, pkitsos@ieee.org Αντίρριο

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών. Πράξεις με μπιτ

Εισαγωγή στην επιστήμη των υπολογιστών. Πράξεις με μπιτ Εισαγωγή στην επιστήμη των υπολογιστών Πράξεις με μπιτ 1 Πράξεις με μπιτ 2 Αριθμητικές Πράξεις σε Ακέραιους Πρόσθεση, Αφαίρεση, Πολλαπλασιασμός, Διαίρεση 3 Πρόσθεση στη μορφή συμπληρώματος ως προς δύο

Διαβάστε περισσότερα

Κρυπτογραφία Δημόσιου Κλειδιού II Αλγόριθμος RSA

Κρυπτογραφία Δημόσιου Κλειδιού II Αλγόριθμος RSA Κρυπτογραφία Δημόσιου Κλειδιού II Αλγόριθμος RSA Τμήμα Μηχ. Πληροφορικής ΤΕΙ Κρήτης Κρυπτογραφία Δημόσιου Κλειδιού -RSA 1 Κρυπτογραφία Δημόσιου Κλειδιού - Ιστορία Ηνωμένες Πολιτείες 1975: Ο Diffie οραματίζεται

Διαβάστε περισσότερα

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM).

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM). Μνήμες Ένα από τα βασικά πλεονεκτήματα των ψηφιακών συστημάτων σε σχέση με τα αναλογικά, είναι η ευκολία αποθήκευσης μεγάλων ποσοτήτων πληροφοριών, είτε προσωρινά είτε μόνιμα Οι πληροφορίες αποθηκεύονται

Διαβάστε περισσότερα

1.3 Ιδεώδη και Περιοχές κυρίων Ιδεωδών 1.3. Ι Π Ι. Για το σύμβολο δεχόμαστε ότι n N {0}, < n καθώς και ότι:

1.3 Ιδεώδη και Περιοχές κυρίων Ιδεωδών 1.3. Ι Π Ι. Για το σύμβολο δεχόμαστε ότι n N {0}, < n καθώς και ότι: 13 Ι Π Ι Για το σύμβολο δεχόμαστε ότι n N {0}, < n καθώς και ότι: n N {0}, ( ) + n = = n + ( ) και ( ) + ( ) = (**) Ονομάζουμε επικεφαλής συντελεστή ενός μη μηδενικού πολυωνύμου f, τον συντελεστή f(i)

Διαβάστε περισσότερα

Ενότητα 4. Εισαγωγή στην Πληροφορική. Αναπαράσταση δεδοµένων. Αναπαράσταση πληροφορίας. υαδικοί αριθµοί. Χειµερινό Εξάµηνο 2006-07

Ενότητα 4. Εισαγωγή στην Πληροφορική. Αναπαράσταση δεδοµένων. Αναπαράσταση πληροφορίας. υαδικοί αριθµοί. Χειµερινό Εξάµηνο 2006-07 Ενότητα 4 Εισαγωγή στην Πληροφορική Κεφάλαιο 4Α: Αναπαράσταση πληροφορίας Κεφάλαιο 4Β: Επεξεργαστές που χρησιµοποιούνται σε PCs Χειµερινό Εξάµηνο 2006-07 ρ. Παναγιώτης Χατζηδούκας (Π..407/80) Εισαγωγή

Διαβάστε περισσότερα

Εισ. Στην ΠΛΗΡΟΦΟΡΙΚΗ. Διάλεξη 8 η. Βασίλης Στεφανής

Εισ. Στην ΠΛΗΡΟΦΟΡΙΚΗ. Διάλεξη 8 η. Βασίλης Στεφανής Εισ. Στην ΠΛΗΡΟΦΟΡΙΚΗ Διάλεξη 8 η Βασίλης Στεφανής Περιεχόμενα Τι είναι κρυπτογραφία Ιστορική αναδρομή Αλγόριθμοι: Καίσαρα Μονοαλφαβιτικοί Vigenere Vernam Κρυπτογραφία σήμερα Κρυπτογραφία Σκοπός Αποστολέας

Διαβάστε περισσότερα

Διδάσκων: Καθηγητής Μαρμαρίδης Νικόλαος - Θεοδόσιος

Διδάσκων: Καθηγητής Μαρμαρίδης Νικόλαος - Θεοδόσιος Τίτλος Μαθήματος: Αλγεβρικές Δομές ΙΙ Ενότητα: Ιδεώδη και Περιοχές κυρίων Ιδεωδών Διδάσκων: Καθηγητής Μαρμαρίδης Νικόλαος - Θεοδόσιος Τμήμα: Μαθηματικών 13 Ι Π Ι Για το σύμβολο δεχόμαστε ότι n N {0},

Διαβάστε περισσότερα

a b b < a > < b > < a >.

a b b < a > < b > < a >. Θεωρια Δακτυλιων και Modules Εαρινο Εξαμηνο 2016 17 Διάλεξη 1 Ενότητα 1. Επανάληψη: Προσθετικές ομάδες, δακτύλιοι, αντιμεταθετικοί δακτύλιοι, δακτύλιοι με μοναδιαίο στοιχείο, παραδείγματα. Συμφωνήσαμε

Διαβάστε περισσότερα

Ε Μέχρι 18 Μαΐου 2015.

Ε Μέχρι 18 Μαΐου 2015. Ε Μέχρι 18 Μαΐου 2015. 1 Αντικείμενα: δακτύλιοι Fraleigh, 4.1. Ορισμός έννοιας «δακτυλίου». Χαρακτηρισμοί δακτυλίων και στοιχείων αυτών: Δακτύλιος R Στοιχεία δακτυλίου R / (= δεν έχει μηδενοδιαιρέτες άρα

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΣΤΗ ΔΙΟΙΚΗΣΗ ΚΑΙ ΣΤΗΝ ΟΙΚΟΝΟΜΙΑ 2 Ο ΜΑΘΗΜΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΑΠΟΣΤΟΛΙΑ ΠΑΓΓΕ Υπολογιστής Συνοπτικό λεξικό Οξφόρδης -> «ηλεκτρονική υπολογιστική μηχανή»

Διαβάστε περισσότερα

Αλγόριθµοι συµµετρικού κλειδιού

Αλγόριθµοι συµµετρικού κλειδιού Αλγόριθµοι συµµετρικού κλειδιού Αλγόριθµοι συµµετρικού κλειδιού Χρησιµοποιούν το ίδιο κλειδί για την κρυπτογράφηση και την αποκρυπτογράφηση Υλοποιούνται τόσο µε υλικό (hardware) όσο και µε λογισµικό (software)

Διαβάστε περισσότερα

Κρυπτογραφία. Έλεγχος πρώτων αριθών-παραγοντοποίηση. Διαφάνειες: Άρης Παγουρτζής Πέτρος Ποτίκας

Κρυπτογραφία. Έλεγχος πρώτων αριθών-παραγοντοποίηση. Διαφάνειες: Άρης Παγουρτζής Πέτρος Ποτίκας Κρυπτογραφία Έλεγχος πρώτων αριθών-παραγοντοποίηση Διαφάνειες: Άρης Παγουρτζής Πέτρος Ποτίκας Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Σχολή ΗΜΜΥ ΕΜΠ Κρυπτογραφία

Διαβάστε περισσότερα

Επιμέλεια: Σπυρίδων Τζινιέρης-ΘΕΩΡΙΑ ΚΛΑΣΜΑΤΩΝ ΓΙΑ ΤΗΝ Α ΓΥΜΝΑΣΙΟΥ ΘΕΩΡΙΑ ΚΛΑΣΜΑΤΩΝ Α ΓΥΜΝΑΣΙΟΥ

Επιμέλεια: Σπυρίδων Τζινιέρης-ΘΕΩΡΙΑ ΚΛΑΣΜΑΤΩΝ ΓΙΑ ΤΗΝ Α ΓΥΜΝΑΣΙΟΥ ΘΕΩΡΙΑ ΚΛΑΣΜΑΤΩΝ Α ΓΥΜΝΑΣΙΟΥ Τι είναι κλάσμα; Κλάσμα είναι ένα μέρος μιας ποσότητας. ΘΕΩΡΙΑ ΚΛΑΣΜΑΤΩΝ Α ΓΥΜΝΑΣΙΟΥ Κλάσμα είναι ένας λόγος δύο αριθμών(fraction is a ratio of two whole numbers) Πως εκφράζετε συμβολικά ένα κλάσμα; Εκφράζετε

Διαβάστε περισσότερα

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική Ι. Ενότητα 10 : Ασφάλεια. Δρ. Γκόγκος Χρήστος

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική Ι. Ενότητα 10 : Ασφάλεια. Δρ. Γκόγκος Χρήστος 1 Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου Πληροφορική Ι Ενότητα 10 : Ασφάλεια Δρ. Γκόγκος Χρήστος 2 Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου Τμήμα Χρηματοοικονομικής & Ελεγκτικής

Διαβάστε περισσότερα

Οικονομικό Πανεπιστήμιο Αθηνών Τμήμα Πληροφορικής ΠΜΣ Κρυπτογραφία και Εφαρμογές Διαλέξεις Ακ. Έτους

Οικονομικό Πανεπιστήμιο Αθηνών Τμήμα Πληροφορικής ΠΜΣ Κρυπτογραφία και Εφαρμογές Διαλέξεις Ακ. Έτους Οικονομικό Πανεπιστήμιο Αθηνών Τμήμα Πληροφορικής ΠΜΣ Κρυπτογραφία και Εφαρμογές Διαλέξεις Ακ. Έτους 2011-2012 Μαριάς Ιωάννης Μαρκάκης Ευάγγελος marias@aueb.gr markakis@gmail.com Διάλεξη 6-1 5-1 Περίληψη

Διαβάστε περισσότερα

ΕΠΛ 674: Εργαστήριο 1 Ασφάλεια Επικοινωνιακών Συστημάτων - Κρυπτογραφία

ΕΠΛ 674: Εργαστήριο 1 Ασφάλεια Επικοινωνιακών Συστημάτων - Κρυπτογραφία ΕΠΛ 674: Εργαστήριο 1 Ασφάλεια Επικοινωνιακών Συστημάτων - Κρυπτογραφία Παύλος Αντωνίου Γραφείο: ΘΕΕ 02 B176 Εαρινό Εξάμηνο 2011 Department of Computer Science Ασφάλεια - Απειλές Ασφάλεια Γενικά (Ι) Τα

Διαβάστε περισσότερα

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ. Δ Εξάμηνο

ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ. Δ Εξάμηνο ΚΡΥΠΤΟΓΡΑΦΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Δ Εξάμηνο Εισαγωγή- Βασικές Έννοιες Διδάσκων : Δρ. Παρασκευάς Κίτσος Επίκουρος Καθηγητής e-mail: pkitsos@teimes.gr, pkitsos@ieee.org Αντίρριο 2015 1 ΤΙ ΕΙΝΑΙ Η ΚΡΥΠΤΟΛΟΓΙΑ?

Διαβάστε περισσότερα

Ι ΑΣΚΩΝ ΚΑΘΗΓΗΤΗΣ: ΚΑΘΗΓΗΤΗΣ ΕΦΑΡΜΟΓΩΝ. ΤΕΙ ΥΤΙΚΗΣ ΜΑΚΕ ΟΝΙΑΣ d.fotiadis@kastoria.teikoz.gr

Ι ΑΣΚΩΝ ΚΑΘΗΓΗΤΗΣ: ΚΑΘΗΓΗΤΗΣ ΕΦΑΡΜΟΓΩΝ. ΤΕΙ ΥΤΙΚΗΣ ΜΑΚΕ ΟΝΙΑΣ d.fotiadis@kastoria.teikoz.gr Ι ΑΣΚΩΝ ΚΑΘΗΓΗΤΗΣ: ΦΩΤΙΑ ΗΣ Α. ΗΜΗΤΡΗΣ M.Sc. ΚΑΘΗΓΗΤΗΣ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Τ.Ε. ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ (Σ.Τ.ΕΦ.) ΤΕΙ ΥΤΙΚΗΣ ΜΑΚΕ ΟΝΙΑΣ d.fotiadis@kastoria.teikoz.gr Ασύγχρονη σειριακή

Διαβάστε περισσότερα

Ασφάλεια Ασύρματων & Κινητών Επικοινωνιών

Ασφάλεια Ασύρματων & Κινητών Επικοινωνιών Ασφάλεια Ασύρματων & Κινητών Επικοινωνιών Ασύρματες Επικοινωνίες Μέρος V Χρήστος Ξενάκης Τμήμα Ψηφιακών Συστημάτων Πανεπιστήμιο Πειραιώς Slide: 1/30 Περιεχόμενα IEEE 802.11i ΤΟ ΠΡΩΤΟΚΟΛΛΟ CCMP Γενικά Λίγα

Διαβάστε περισσότερα

ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΚΑΙ ΠΟΛΙΤΙΣΜΟΥ ΔΙΕΥΘΥΝΣΗ ΑΝΩΤΕΡΗΣ ΚΑΙ ΑΝΩΤΑΤΗΣ ΕΚΠΑΙΔΕΥΣΗΣ ΥΠΗΡΕΣΙΑ ΕΞΕΤΑΣΕΩΝ ΠΑΓΚΥΠΡΙΕΣ ΕΞΕΤΑΣΕΙΣ 2016

ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΚΑΙ ΠΟΛΙΤΙΣΜΟΥ ΔΙΕΥΘΥΝΣΗ ΑΝΩΤΕΡΗΣ ΚΑΙ ΑΝΩΤΑΤΗΣ ΕΚΠΑΙΔΕΥΣΗΣ ΥΠΗΡΕΣΙΑ ΕΞΕΤΑΣΕΩΝ ΠΑΓΚΥΠΡΙΕΣ ΕΞΕΤΑΣΕΙΣ 2016 ΥΠΟΥΡΓΕΙΟ ΠΑΙΔΕΙΑΣ ΚΑΙ ΠΟΛΙΤΙΣΜΟΥ ΔΙΕΥΘΥΝΣΗ ΑΝΩΤΕΡΗΣ ΚΑΙ ΑΝΩΤΑΤΗΣ ΕΚΠΑΙΔΕΥΣΗΣ ΥΠΗΡΕΣΙΑ ΕΞΕΤΑΣΕΩΝ ΠΑΓΚΥΠΡΙΕΣ ΕΞΕΤΑΣΕΙΣ 2016 ΤΕΧΝΟΛΟΓΙΑ (ΙΙ) ΤΕΧΝΙΚΩΝ ΣΧΟΛΩΝ ΠΡΑΚΤΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Μάθημα : Τεχνολογία και

Διαβάστε περισσότερα

Ελίνα Μακρή

Ελίνα Μακρή Ελίνα Μακρή elmak@unipi.gr Μετατροπή Αριθμητικών Συστημάτων Πράξεις στα Αριθμητικά Συστήματα Σχεδίαση Ψηφιακών Κυκλωμάτων με Logism Άλγεβρα Boole Λογικές Πύλες (AND, OR, NOT, NAND, XOR) Flip Flops (D,

Διαβάστε περισσότερα

bca = e. H 1j = G 2 H 5j = {f G j : f(0) = 1}

bca = e. H 1j = G 2 H 5j = {f G j : f(0) = 1} Αλγεβρα Ι, Χειμερινο Εξαμηνο 2017 18 Ασκησεις που συζητηθηκαν στο φροντιστηριο Το [Α] συμβολίζει το φυλλάδιο ασκήσεων που θα βρείτε στην ιστοσελίδα του μαθήματος επιλέγοντας «Άλλες Ασκήσεις». 1. Πόσες

Διαβάστε περισσότερα