AES (Advanced Encryption Standard) — είναι ένας συμμετρικός αλγόριθμος κρυπτογράφησης μπλοκ, που υιοθετήθηκε το 2001 από το Εθνικό Ινστιτούτο Προτύπων και Τεχνολογίας των ΗΠΑ (NIST) ως επίσημο πρότυπο. Το AES αντικατέστησε το παλαιωμένο DES και από τότε έγινε ο πιο διαδεδομένος αλγόριθμος κρυπτογράφησης στον κόσμο, που χρησιμοποιείται από τραπεζικά συστήματα έως εφαρμογές για κινητά. Σύμφωνα με δεδομένα του NIST (2023), το AES παρέχει αντοχή ισοδύναμη με 2^256 πράξεις για ένα κλειδί μήκους 256 bit, καθιστώντας το άτρωτο σε σύγχρονες επιθέσεις ωμής βίας. NIST FIPS 197, 2023
Κύρια Σημεία
AES (Advanced Encryption Standard) — είναι ένα συμμετρικό κρυπτογράφημα μπλοκ που αναπτύχθηκε από τους Βέλγους κρυπτογράφους Joan Daemen και Vincent Rijmen με το όνομα Rijndael. Το 2001, το NIST επέλεξε το Rijndael ως νικητή του διαγωνισμού για το νέο πρότυπο κρυπτογράφησης των ΗΠΑ μετά από πέντε χρόνια ανοιχτών δοκιμών και ανάλυσης. Το AES λειτουργεί με μπλοκ δεδομένων σταθερού μεγέθους (128 bit) και υποστηρίζει τρία μήκη κλειδιού: 128, 192 και 256 bit. Ο αριθμός των γύρων μετασχηματισμού εξαρτάται από το μήκος του κλειδιού: 10 γύροι για κλειδί 128 bit, 12 για 192 bit και 14 για κλειδί 256 bit. Κάθε γύρος περιλαμβάνει τέσσερις πράξεις: SubBytes (μη γραμμική αντικατάσταση byte μέσω S-box), ShiftRows (κυκλική μετατόπιση γραμμών), MixColumns (ανάμειξη στηλών) και AddRoundKey (εφαρμογή κλειδιού γύρου).
Η ανάπτυξη του AES ξεκίνησε το 1997, όταν το NIST ανακοίνωσε διαγωνισμό για την αντικατάσταση του DES, του οποίου το κλειδί 56 bit είχε σπάσει σε 22 ώρες το 1998 στην εξειδικευμένη συσκευή Deep Crack. Στο διαγωνισμό συμμετείχαν 15 αλγόριθμοι από διάφορες χώρες, συμπεριλαμβανομένων των Serpent (Ηνωμένο Βασίλειο), Twofish (ΗΠΑ) και RC6 (ΗΠΑ). Μέχρι τον τελικό του 1999, έμειναν 5 υποψήφιοι. Το Rijndael κέρδισε χάρη στον συνδυασμό υψηλής ταχύτητας σε όλες τις πλατφόρμες (από μικροελεγκτές 8 bit έως διακομιστές 64 bit), αντοχής στην κρυπτανάλυση και συμπαγούς υλοποίησης σε υλικό. Από το 2006, το AES χρησιμοποιείται για την κρυπτογράφηση δεδομένων με διαβάθμιση SECRET και TOP SECRET σε κυβερνητικά συστήματα των ΗΠΑ. Σήμερα, το AES είναι ενσωματωμένο σε όλα τα κύρια πρωτόκολλα: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3 και Bluetooth BR/EDR.
Το AES επεξεργάζεται δεδομένα σε μπλοκ των 128 bit (16 byte), οργανωμένα σε έναν πίνακα 4x4 byte, που ονομάζεται state. Κάθε γύρος κρυπτογράφησης εκτελεί μια σειρά ντετερμινιστικών μετασχηματισμών που μαζί δημιουργούν το “φαινόμενο της χιονοστιβάδας”: η αλλαγή ενός bit των δεδομένων εισόδου αλλάζει περίπου το 50% των bit των δεδομένων εξόδου. Αυτό το αποτέλεσμα καθιστά το AES ανθεκτικό στη διαφορική και γραμμική κρυπτανάλυση — τις κύριες μεθόδους σπασίματος κρυπτογραφημάτων μπλοκ.
Η διαδικασία ξεκινά με το AddRoundKey — εφαρμογή του αρχικού κλειδιού στο state μέσω πράξης XOR. Στη συνέχεια εκτελούνται οι γύροι: το SubBytes αντικαθιστά κάθε byte του state με την τιμή από το S-box (πίνακας αντικατάστασης). Το ShiftRows μετατοπίζει κυκλικά τη δεύτερη γραμμή κατά 1 θέση, την τρίτη κατά 2, την τέταρτη κατά 3 — αυτό εξασφαλίζει ανάμειξη μεταξύ των στηλών. Το MixColumns πολλαπλασιάζει κάθε στήλη του state με έναν σταθερό πίνακα στο σώμα Galois GF(2^8), δημιουργώντας εξάρτηση κάθε byte εξόδου από όλα τα τέσσερα byte εισόδου της στήλης. Το AddRoundKey εφαρμόζει το επόμενο κλειδί γύρου, που λαμβάνεται από το αρχικό κλειδί μέσω της διαδικασίας Key Expansion. Ο τελευταίος γύρος διαφέρει λόγω απουσίας της πράξης MixColumns. Η αποκρυπτογράφηση χρησιμοποιεί τις αντίστροφες πράξεις InvSubBytes, InvShiftRows, InvMixColumns και AddRoundKey με αντίστροφη σειρά. Για προγραμματιστές κινητών, η κατανόηση της εσωτερικής δομής του AES δεν απαιτείται — αρκεί να γνωρίζουν πώς να καλούν σωστά τα ενσωματωμένα API της πλατφόρμας με τις κατάλληλες παραμέτρους.
Το βασικό χαρακτηριστικό του AES που εξασφαλίζει την κρυπτογραφική του αντοχή είναι το φαινόμενο της χιονοστιβάδας (avalanche effect). Η αλλαγή ενός bit στο απλό κείμενο ή στο κλειδί οδηγεί σε αλλαγή περίπου του 50% των bit του κρυπτοκειμένου, καθιστώντας το AES εξαιρετικά ανθεκτικό στη διαφορική και γραμμική κρυπτανάλυση. Ο συνδυασμός των πράξεων SubBytes (μη γραμμικότητα μέσω S-box) και MixColumns (διάχυση μέσω πολλαπλασιασμού στο σώμα Galois) δημιουργεί μια μαθηματική πολυπλοκότητα όπου ακόμη και η γνώση μέρους του κρυπτοκειμένου δεν επιτρέπει την ανάκτηση του κλειδιού γρηγορότερα από την πλήρη αναζήτηση. Σύμφωνα με ανάλυση του NIST (2018), η καλύτερη γνωστή επίθεση στο AES-128 — biclique attack — μειώνει το ενεργό μήκος κλειδιού μόνο κατά 2 bit (στα 126,2 bit), που δεν δίνει πρακτικό πλεονέκτημα στον επιτιθέμενο. Για το AES-256 δεν υπάρχει καμία πρακτικά εφικτή επίθεση που να υπερβαίνει την πλήρη αναζήτηση.
Το AES υποστηρίζει τρία μεγέθη κλειδιού, καθένα από τα οποία αντιστοιχεί σε ένα συγκεκριμένο επίπεδο κρυπτογραφικής αντοχής. Η επιλογή μεγέθους κλειδιού επηρεάζει την ασφάλεια, την απόδοση και τις απαιτήσεις πόρων της συσκευής.
| Μέγεθος κλειδιού | Αριθμός γύρων | Επίπεδο ασφαλείας | Εφαρμογή |
|---|---|---|---|
| AES-128 | 10 | 128 bit | Εμπορικές εφαρμογές, TLS |
| AES-192 | 12 | 192 bit | Κυβερνητικά συστήματα (SECRET) |
| AES-256 | 14 | 256 bit | TOP SECRET, χρηματοπιστωτικός τομέας |
Πρακτικός κανόνας: σε εφαρμογές για κινητά χρησιμοποιήστε AES-256 από προεπιλογή. Η διαφορά απόδοσης μεταξύ AES-128 και AES-256 σε σύγχρονες συσκευές με υποστήριξη AES-NI δεν υπερβαίνει το 10–15%, αλλά το επίπεδο ασφαλείας διπλασιάζεται. Σύμφωνα με κβαντική ανάλυση (Grassl et al., 2016), για το σπάσιμο του AES-128 απαιτούνται 2^77 κβαντικές πράξεις μέσω του αλγορίθμου Grover, και για το AES-256 — 2^149, καθιστώντας το AES-256 ανθεκτικό σε κβαντικές επιθέσεις για τα επόμενα 20–30 χρόνια. Ακόμη και το AES-128 παρέχει επαρκή προστασία για τη συντριπτική πλειοψηφία των εμπορικών σεναρίων: για πλήρη αναζήτηση ενός κλειδιού 128 bit απαιτείται περισσότερη ενέργεια από όση υπάρχει στο σύμπαν σύμφωνα με εκτίμηση του Bruce Schneier. Ωστόσο, τα πρότυπα ασφαλείας (GDPR, HIPAA, PCI DSS) συχνά απαιτούν ρητά AES-256, γι’ αυτό σε παραγωγικά έργα συνιστάται η χρήση του μέγιστου μήκους κλειδιού.
Το AES ως κρυπτογράφημα μπλοκ κρυπτογραφεί μπλοκ σταθερού μεγέθους (128 bit). Για την κρυπτογράφηση δεδομένων αυθαίρετου μήκους χρησιμοποιούνται λειτουργίες (modes of operation). Η επιλογή λειτουργίας επηρεάζει κρίσιμα την ασφάλεια: μια λανθασμένη λειτουργία μπορεί να ακυρώσει την αντοχή του AES.
Για έργα κινητών χρησιμοποιήστε AES-256-GCM με nonce 12 byte. Το GCM λύνει δύο προβλήματα ταυτόχρονα: κρυπτογράφηση δεδομένων και επαλήθευση αυθεντικότητας, αποτρέποντας επιθέσεις padding oracle και chosen ciphertext. Τα Android Keystore και iOS CryptoKit υποστηρίζουν AES-GCM out-of-the-box χωρίς ανάγκη υλοποίησης πρόσθετων κρυπτογραφικών πρωτογενών στοιχείων. Κατά την εργασία με GCM, είναι σημαντικό να μην επαναλαμβάνετε ποτέ το nonce με το ίδιο κλειδί — αυτό καταστρέφει εντελώς την ασφάλεια κρυπτογράφησης. Δημιουργήστε νέο τυχαίο nonce για κάθε κρυπτογράφηση και αποθηκεύστε το μαζί με το κρυπτοκείμενο.
Ας εξετάσουμε ένα παράδειγμα ασφαλούς υλοποίησης του AES-256-GCM σε Android χρησιμοποιώντας Jetpack Security. Ο παρακάτω κώδικας δείχνει τον πλήρη κύκλο: δημιουργία κλειδιού AES-256 μέσω MasterKey, κρυπτογράφηση και αποκρυπτογράφηση μιας συμβολοσειράς με πρόσθετα αυθεντικοποιημένα δεδομένα (AAD).
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val securePrefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
fun storeSecureData(key: String, value: String) {
securePrefs.edit().putString(key, value).apply()
}
fun readSecureData(key: String): String? {
return securePrefs.getString(key, null)
}
Το βασικό χαρακτηριστικό αυτής της λύσης είναι η χρήση του AES-256-GCM σε δύο επίπεδα: για την κρυπτογράφηση ζευγών κλειδιού-τιμής (PrefValueEncryptionScheme) και για την προστασία των ίδιων των ονομάτων κλειδιών (το PrefKeyEncryptionScheme χρησιμοποιεί AES-256-SIV, ανθεκτικό σε επανάληψη nonce). Το MasterKey δημιουργείται με τον αλγόριθμο AES-256-GCM και αποθηκεύεται στο Android Keystore, το οποίο προστατεύεται υλικοτεχνικά σε συσκευές με Trusted Execution Environment. Σε συσκευές χωρίς υποστήριξη υλικού (TEE), το κλειδί κρυπτογραφείται μέσω Bouncy Castle, που είναι ακόμα πιο ασφαλές από την αποθήκευση σε SharedPreferences.
Για άμεση κρυπτογράφηση μεγάλου όγκου δεδομένων (π.χ. εικόνες ή αρχεία) χρησιμοποιήστε AES-256-GCM μέσω EncryptedFile από το AndroidX Security. Για εξαγωγή κλειδιών (π.χ. για αντίγραφα ασφαλείας) χρησιμοποιήστε πρόσθετη κρυπτογράφηση με κωδικό πρόσβασης χρήστη μέσω PBKDF2 με 100000+ επαναλήψεις.
Στο iOS, η εργασία με AES οργανώνεται μέσω του πλαισίου CryptoKit (Swift 5.0+). Το κλειδί AES-256 δημιουργείται μέσω SymmetricKey(size: .bits256) και αποθηκεύεται στο Secure Enclave — έναν κρυπτοεπεξεργαστή υλικού απομονωμένο από την κύρια CPU και το λειτουργικό σύστημα. Το CryptoKit παρέχει δύο υλοποιήσεις AES: AES.GCM (συνιστάται) και AES.CBC (για συμβατότητα προς τα πίσω με παλαιές μορφές). Η κρυπτογράφηση γίνεται μέσω της μεθόδου seal(), η οποία λαμβάνει δεδομένα, κλειδί και nonce (12 byte) και επιστρέφει ένα AES.GCM.SealedBox — μια δομή που περιέχει το κρυπτοκείμενο και την ετικέτα αυθεντικοποίησης. Αποκρυπτογράφηση — μέσω open(). Η Apple δεν συνιστά τη χρήση CommonCrypto: το CryptoKit επιλέγει αυτόματα τις βέλτιστες παραμέτρους, προστατεύει από επιθέσεις side-channel και χρησιμοποιεί επιτάχυνση υλικού AES-NI σε επεξεργαστές Apple Silicon. Σε συσκευές με Secure Enclave, τα κλειδιά δεν εγκαταλείπουν ποτέ τη μονάδα υλικού, καθιστώντας την κλοπή τους αδύνατη ακόμα και με πλήρη παραβίαση της εφαρμογής. Για σειριοποίηση του κλειδιού χρησιμοποιείται η μέθοδος withUnsafeBytes με επακόλουθη αποθήκευση στο Keychain μέσω SecItemAdd με το χαρακτηριστικό kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
Συχνές Ερωτήσεις
AES είναι ένας αλγόριθμος που μετατρέπει αναγνώσιμα δεδομένα σε μια μη αναγνώσιμη συλλογή byte με τη βοήθεια ενός μυστικού κλειδιού. Το ίδιο κλειδί χρειάζεται για να επαναφέρει τα δεδομένα στην αρχική τους μορφή. Το AES είναι τόσο αξιόπιστο που χρησιμοποιείται για την κρυπτογράφηση μυστικών εγγράφων της κυβέρνησης των ΗΠΑ.
AES-128 χρησιμοποιεί κλειδί 128 bit και εκτελεί 10 γύρους κρυπτογράφησης. Το AES-256 χρησιμοποιεί κλειδί 256 bit και 14 γύρους, καθιστώντας το 2^128 φορές πιο δύσκολο να σπάσει. Για εφαρμογές κινητών συνιστάται το AES-256 λόγω της ελάχιστης διαφοράς στην απόδοση.
AES-256-GCM — η πιο ασφαλής και συνιστώμενη λειτουργία. Το GCM παρέχει αυθεντικοποιημένη κρυπτογράφηση (κρυπτογράφηση + έλεγχος ακεραιότητας). Η λειτουργία ECB απαγορεύεται, το CBC απαιτεί ξεχωριστό MAC. Το GCM είναι το de facto πρότυπο για εφαρμογές κινητών.
Θεωρητικά, το AES μπορεί να σπάσει με πλήρη αναζήτηση, αλλά για το AES-256 απαιτούνται 2^256 προσπάθειες — περισσότερες από τα άτομα στο ορατό σύμπαν. Πρακτικές επιθέσεις στο AES-256 δεν υπάρχουν. Οι επιθέσεις side-channel (Spectre, Meltdown) δεν σπάνε το AES, αλλά κλέβουν κλειδιά από τη μνήμη, γι’ αυτό η αποθήκευση κλειδιών σε υλικό είναι κρίσιμα σημαντική.
Χρησιμοποιήστε τη βιβλιοθήκη AndroidX Security: το MasterKey.Builder με KeyScheme.AES256_GCM δημιουργεί ένα προστατευμένο κλειδί στο Android Keystore, και το EncryptedSharedPreferences κρυπτογραφεί αυτόματα όλα τα δεδομένα μέσω AES-256-GCM. Καμία χειροκίνητη κρυπτογραφία — το API είναι ασφαλές από προεπιλογή, χωρίς κίνδυνο σφαλμάτων προγραμματιστή.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης