Οι DES, 3DES, RC4 και Blowfish εξηγημένοι από το μηδέν
Με μία πρόταση: αυτοί οι τέσσερις κρυπτογράφοι ήταν τα άλογα εργασίας της δεκαετίας του 1990 — το DES και η τριπλή εφαρμογή του, 3DES, ο κρυπτογράφος ροής RC4 και το Blowfish — και ο καθένας τους είναι πλέον αποσυρμένος ή ξεπερασμένος, διατηρούμενος ζωντανός μόνο από παλιά αρχεία, παλιό υλικό και παλιά πρωτόκολλα που πρέπει ακόμη να διαβάζονται.
DES: το πρότυπο του 1977 που τα ξεκίνησε όλα
Τι είναι. Το Πρότυπο Κρυπτογράφησης Δεδομένων (FIPS 46, 1977) είναι κρυπτογράφος Feistel 16 γύρων σε μπλοκ 64 bit με κλειδί 56 bit (αποθηκευμένο σε 8 byte, επειδή ένα bit από κάθε byte είναι bit ισοτιμίας). Σχεδιάστηκε από την IBM με συμβολή της NSA, έγινε το αμερικανικό πρότυπο για δύο δεκαετίες, και «σπάστηκε» εν τοις πράγμασι το 1998, όταν η μηχανή Deep Crack του EFF εξαντλητικά βρήκε κλειδί σε 56 ώρες με υλικό αξίας 250 000 δολαρίων. Το NIST το απέσυρε για κρυπτογράφηση το 2005.
Γιατί το bit ισοτιμίας μπερδεύει τα μήκη κλειδιών. Κάθε όγδοο bit ενός κλειδιού DES υπολογίζεται από τα υπόλοιπα επτά, οπότε ένα κλειδί 8 byte έχει μόνο 56 ανεξάρτητα bit — γι' αυτό εμφανίζεται ως «κλειδί 64 bit» και ως «κλειδί 56 bit» για τον ίδιο κρυπτογράφο. Το 3DES το κληρονομεί: 24 ακατέργαστα byte = 168 bit ακατέργαστα = 112 πραγματικά (το meet-in-the-middle αφαιρεί τα υπόλοιπα).
Πού εξακολουθεί να συναντάται. Μπλοκ PIN τραπεζών (ISO 9564), ορισμένα realms του Kerberos v4, παλιά αντίγραφα ασφαλείας και έξυπνες κάρτες. Αν ένα σύστημα απαιτεί σήμερα DES, είτε διαλειτουργεί με υλικό της δεκαετίας του 1990 είτε είναι απλώς ανασφαλές.
3DES: κρυπτογράφηση, αποκρυπτογράφηση, κρυπτογράφηση
Το τέχνασμα. Το τριπλό DES εκτελεί το DES τρεις φορές σε κάθε μπλοκ: το EDE3 χρησιμοποιεί τρία διαφορετικά κλειδιά (C = Ek3(Dk2(Ek1(P))))· το βήμα αποκρυπτογράφησης στη μέση υπάρχει ώστε μια υλοποίηση 3DES να μπορεί να μιμηθεί το μονό DES θέτοντας k1=k2. Το EDE2 χρησιμοποιεί μόνο δύο κλειδιά (k1=k3), δίνοντας 112 πραγματικά bit. Η κατασκευή ήταν γρήγορη διόρθωση που τριπλασίασε την ασφάλεια ενός ήδη επιτιθέμενου κρυπτογράφου, χωρίς να εφεύρει νέο.
Γιατί τελικά έπαψε να χρησιμοποιείται. Δύο προβλήματα: είναι αργός (τρία πλήρη περάσματα DES ανά μπλοκ, περίπου το 1/20 της ταχύτητας του AES) και διατήρησε το μπλοκ 64 bit. Με 32 GiB δεδομένων υπό ένα κλειδί (το όριο γενεθλίων των 232 μπλοκ), οι συγκρούσεις μπλοκ γίνονται αρκετά πιθανές ώστε να διαρρέουν δομή απλού κειμένου — η επίθεση Sweet32 (2016) το έδειξε σε συνεδρίες TLS 3DES. Το NIST απαγόρευσε την κρυπτογράφηση 3DES μετά το 2023 (SP 800-131A r2)· το PCI DSS απαιτεί την απόσυρσή του σε συστήματα πληρωμών.
RC4 / ARCFOUR: ο κρυπτογράφος ροής του πρώιμου ιστού
Πώς λειτουργεί. Το RC4 (Ron's Code 4, σχεδιάστηκε το 1987, διέρρευσε το 1994) είναι κρυπτογράφος ροής: το κλειδί ορίζει μια μετάθεση 256 byte (KSA), και στη συνέχεια η μετάθεση εκπέμπει μια ψευδοτυχαία ροή byte (PRGA) που γίνεται XOR με το μήνυμα. Χωρίς συμπλήρωση, χωρίς μέγεθος μπλοκ, οποιοδήποτε μήκος μηνύματος, εξαιρετικά γρήγορο σε λογισμικό — γι' αυτό κυριάρχησε στο SSL/TLS και στο WEP τη δεκαετία του 1990. Το «ARCFOUR» είναι το όνομα χωρίς εμπορικό σήμα που χρησιμοποιούν τα περισσότερα έργα ανοιχτού κώδικα.
Πώς έσπασε. Οι Fluhrer-Mantin-Shamir (2001) έδειξαν ότι τα πρώτα byte της ροής κλειδιού έχουν προκατάληψη — θανατηφόρο στο WEP, όπου η κατασκευή κλειδιού ανά πακέτο τροφοδοτούσε αυτά τα byte στους επιτιθέμενους. Μεταγενέστερες επιθέσεις προκατάληψης (2013, AlFardan κ.ά.) ανέκτησαν απλό κείμενο από συνεδρίες TLS με RC4 σε εκατομμύρια συνδέσεις. Το RFC 7465 (2015) απαγορεύει το RC4 στο TLS εντελώς.
Το κλασικό διάνυσμα. Κλειδί "Key" (3 byte), μήνυμα "Plaintext" δίνει κρυπτογραφημένο κείμενο bbf316e8d940af0ad3 — δοκιμή του Δείγματος RC4 και σύγκριση. Ο αυτοέλεγχος αυτής της σελίδας ελέγχει επίσης τη ροή κλειδιού του RFC 6229 για το κλειδί 40 bit 01 02 03 04 05: b2396305f03dc027ccc3524a0a1118a8.
Blowfish: αδιάσπαστος, αλλά με περιορισμένο μπλοκ
Τι είναι. Ο κρυπτογράφος Feistel του Bruce Schneier (1993): μπλοκ 64 bit, κλειδιά από 32 έως 448 bit (4..56 byte), 16 γύροι, και ένας περίφημος αλγόριθμος δημιουργίας κλειδιών που εκτελεί το ίδιο το Blowfish 521 φορές για να κατασκευάσει τα υποκλειδιά του — κάτι που καθιστά τη ρύθμιση κλειδιού αργή, αλλά και τις προσπάθειες brute-force δαπανηρές. Καμία πρακτική κρυπτανάλυση δεν σπάει το πλήρες Blowfish.
Γιατί είναι και εδώ. Το πρόβλημα είναι το μπλοκ 64 bit, όχι ο αλγόριθμος: πέραν των ~32 GiB υπό ένα κλειδί, οι συγκρούσεις γενεθλίων διαρρέουν δεδομένα (το ίδιο όριο με το 3DES, κατά το μοτίβο Sweet32). Ο ίδιος ο Schneier προτείνει τον διάδοχό του Twofish (τελικό υποψήφιο του AES) ή το AES για οτιδήποτε νέο. Το Blowfish ζει μέσα στο bcrypt — ο πίνακας κλειδιού του κατακερματισμού κωδικού πρόσβασης είναι Blowfish — κάτι που είναι εντάξει, επειδή ο κατακερματισμός χρησιμοποιεί μικρές εισόδους, όχι γιγαμπάιτ.
Τα κλασικά διανύσματα. Κλειδί και απλό κείμενο μηδενικά κρυπτογραφούνται σε 4ef997456198dd78 (πρώτο μπλοκ της δειγματικής εξόδου)· το κλειδί "abcdefghijklmnopqrstuvwxyz" στο "BLOWFISH" δίνει 324ed0fef413a203. Και τα δύο προέρχονται από το δημοσιευμένο αρχείο διανυσμάτων του Schneier και ελέγχονται από τον αυτοέλεγχο.
Συνηθισμένα λάθη
- Χρήση αυτών για νέα δεδομένα. Όλοι οι κρυπτογράφοι εδώ είναι αποσυρμένοι, εκτός από το Blowfish (που περιορίζεται από το μέγεθος μπλοκ). Η σωστή σύγχρονη επιλογή είναι το AES-GCM — βλ. Κρυπτογράφηση / αποκρυπτογράφηση AES.
- Κλειδί DES από κωδικό πρόσβασης. Ένας κωδικός 8 χαρακτήρων δεν είναι 56 τυχαία bit· είναι λίγα bit εντροπίας ανά χαρακτήρα. Τα παλιά συστήματα το έκαναν ακριβώς αυτό, και είναι ο συνηθέστερος λόγος για τον οποίο αρχεία «κρυπτογραφημένα με DES» πέφτουν σε επιθέσεις λεξικού μέσα σε λεπτά.
- Επαναχρησιμοποίηση IV στο CBC. Τότε το πρώτο μπλοκ αποκαλύπτει την ισότητα του απλού κειμένου μεταξύ μηνυμάτων με το ίδιο κλειδί. Το κουμπί Τυχαίο IV υπάρχει για αυτόν τον λόγο.
- Επαναχρησιμοποίηση ροής κλειδιού RC4. Το RC4 κάνει XOR με την ίδια ροή για το ίδιο κλειδί: η κρυπτογράφηση δύο μηνυμάτων με ένα κλειδί είναι two-time pad — το XOR των κρυπτογραφημένων κειμένων αποκαλύπτει και τα δύο απλά κείμενα. Η θανατηφόρα αδυναμία του WEP ήταν ακριβώς μια κατασκευή επαναχρησιμοποίησης ροής κλειδιού.
- Η υπόθεση ότι «αποκρυπτογραφείται, άρα είναι σωστό». Τα ECB/CBC εδώ ελέγχουν μόνο τη συμπλήρωση κατά την αποκρυπτογράφηση — ένα λάθος κλειδί συνήθως δίνει σκουπίδια που μπορεί να περάσουν τον έλεγχο συμπλήρωσης. Δεν υπάρχει έλεγχος ακεραιότητας σε καμία παλαιά λειτουργία· αν χρειάζεται, απαιτείται AES-GCM, όχι αυτοί.
- Η καταμέτρηση του 3DES ως «168-bit». Το ακατέργαστο κλειδί είναι 168 bit, αλλά η πραγματική δύναμη είναι 112 — το meet-in-the-middle μειώνει την τριπλή κρυπτογράφηση σε διπλή συν κάτι, όπως ακριβώς και στις προγενέστερες κατασκευές του 3DES.
Συχνές ερωτήσεις
Γιατί διατηρείται ένα εργαλείο για σπασμένους κρυπτογράφους; Συμβατότητα. Κρυπτογραφημένα αντίγραφα ασφαλείας, εξαγόμενα αρχεία παλαιάς μορφής, καταγεγραμμένες κίνησεις πρωτοκόλλων, προκλήσεις CTF και υλικό που δεν μπορεί να αναβαθμιστεί εξακολουθούν όλα να μιλούν αυτούς τους κρυπτογράφους. Η ανάγνωση παλαιών δεδομένων είναι θεμιτή· η εγγραφή νέων δεδομένων με αυτούς δεν είναι.
Κλειδί DES με περιττή ισοτιμία / μη ASCII bytes; Το DES αγνοεί το bit ισοτιμίας κάθε byte κλειδιού, οπότε το πραγματικό κλειδί είναι τα υπόλοιπα 56 bit ούτως ή άλλως. Αυτή η σελίδα δέχεται οποιαδήποτε 8 byte και δεν επιβάλλει ζυγή ισοτιμία.
Γιατί το αποκρυπτογραφημένο κείμενο μοιάζει μερικές φορές με σκουπίδια; Λάθος κλειδί, λάθος λειτουργία, λάθος IV, ή τα δεδομένα δεν κρυπτογραφήθηκαν όπως υποτίθεται. Χωρίς ετικέτα πιστοποίησης δεν υπάρχει καθαρό μήνυμα «λάθος κλειδί» — ο έλεγχος συμπλήρωσης είναι η μόνη ένδειξη, και μπορεί να περάσει τυχαία (το 1 στα 256 των περιπτώσεων).
Είναι το Blowfish ασφαλές για αρχεία; Για μικρά αρχεία, κρυπτογραφικά ναι (καμία πρακτική διάσπαση). Για οτιδήποτε κλίμακας γιγαμπάιτ υπό ένα κλειδί, όχι — το όριο γενεθλίων του μπλοκ 64 bit αφορά τον όγκο δεδομένων, όχι τη δύναμη του κλειδιού. Το Twofish ή το AES αποφεύγουν το πρόβλημα.
Τι γίνεται με τα κλειδιά Blowfish 72 byte που έχουν εμφανιστεί κάπου; Ορισμένες υλοποιήσεις δέχονται έως 72 byte, αλλά η αναφορά του Schneier χρησιμοποιεί 56 και τα επιπλέον byte δεν προσθέτουν διάχυση στον τυπικό πίνακα κλειδιού. Αυτή η σελίδα ακολουθεί την αναφορά: 4..56 byte.