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

Το σύμπτωμα: αργό δεν είναι το κρυπτογραφημένο προφίλ

Ας υποθέσουμε ότι μια παλιά δοκιμή συγκρίνει έναν κρυπταλγόριθμο AEAD με μια λειτουργία «χωρίς κρυπτογράφηση» που εξακολουθεί να υπολογίζει ξεχωριστό κωδικό επαλήθευσης ανά πακέτο. Το δεύτερο προφίλ κρύβει το περιεχόμενο του ωφέλιμου φορτίου αλλά διατηρεί κατακερματισμό ανά πακέτο, και σε επεξεργαστή χωρίς επιτάχυνση για αυτόν τον κατακερματισμό μπορεί να κοστίζει περισσότερο από τη συνδυασμένη κατασκευή που έπρεπε να ξεπεράσει.

Η ετικέτα στη διαμόρφωση λέει «κρυπτογράφηση», και η ετικέτα είναι το μόνο που κοιτάζουν οι περισσότερες συγκρίσεις. Η διαδρομή του πακέτου λέει κάτι διαφορετικό: το ένα προφίλ εκτελεί μια συνδυασμένη πράξη για την οποία η CPU έχει εντολές, και το άλλο μια ξεχωριστή για την οποία δεν έχει. Η ανάγνωση μόνο του αρχείου διαμόρφωσης δεν θα αποκαλύψει ποτέ αυτή τη διαφορά, γιατί και οι δύο καταχωρίσεις μοιάζουν με μία γραμμή. Μόνο η διαπραγματευμένη λειτουργία και η διαδρομή κώδικα πίσω της εξηγούν το αποτέλεσμα.

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

Μετρήστε πράξεις, όχι ετικέτες

Μια κατασκευή AEAD, όπως περιγράφεται στο RFC 5116, δίνει στην υλοποίηση ένα ενιαίο interface που επιστρέφει το κρυπτοκείμενο και την ετικέτα μαζί. Το AES-GCM είναι ένα παράδειγμα: κρυπτογράφηση λειτουργίας μετρητή συνδυασμένη με πιστοποιητή Galois. Το interface δεν κάνει την ακεραιότητα δωρεάν, κάνει τον συνδυασμό καλά ορισμένο, και αυτό επιτρέπει σε μια υλοποίηση να βελτιστοποιήσει το ζεύγος ως ενότητα.

Separate authentication path:
  payload -> independent HMAC -> framed packet

AEAD path:
  payload -> authenticated encryption with tag -> framed packet

Αυτά είναι σκίτσα επεξεργασίας και όχι συμβουλές διαμόρφωσης. Το πρώτο δεν έχει εμπιστευτικότητα αλλά εξακολουθεί να ξοδεύει CPU στην επαλήθευση, και γι’ αυτό ακριβώς το «απενεργοποίησε την κρυπτογράφηση» δεν είναι συνώνυμο του «απενεργοποίησε την κρυπτογραφική εργασία».

Το δεύτερο μπορεί να είναι φθηνότερο γιατί οι επεξεργαστές παρέχουν εντολές και για τα δύο μισά: γύρους AES και τον πολλαπλασιασμό χωρίς κρατούμενο που χρησιμοποιεί το πεδίο Galois. Οι βιβλιοθήκες επεξεργάζονται επίσης ανεξάρτητα buffers παράλληλα, κάτι που κρατά αυτές τις εντολές απασχολημένες αντί να περιμένουν τη μνήμη.

Τι επιτρέπει στην πραγματικότητα η διαπραγματευμένη λειτουργία

Με το Community OpenVPN, ένας κρυπταλγόριθμος δεδομένων AEAD σημαίνει ότι η επιλογή auth δεν συνεισφέρει πλέον δικό της ξεχωριστό HMAC καναλιού δεδομένων. Η αναφορά της επιλογής κρυπτογράφησης περιγράφει αυτό το εύρος, και γι’ αυτό δύο διαμορφώσεις που μοιάζουν σε ένα αρχείο κειμένου μπορούν να διαφέρουν στην εργασία ανά πακέτο.

Διαβάστε τη διαπραγματευμένη λειτουργία και όχι τη λίστα επιθυμιών. Μια λίστα επιτρεπόμενων κρυπταλγορίθμων και ένα όνομα σουίτας TLS δεν σας λένε ποιες πράξεις εκτελούνται στο ωφέλιμο φορτίο, και μια παλιά γραμμή cipher μπορεί να μην περιγράφει τι επέλεξε η τρέχουσα σύνδεση.

openvpn --show-ciphers | head -20
sudo grep -E 'cipher|auth' /etc/openvpn/server.conf

Η πρώτη εντολή απαριθμεί τους κρυπταλγόριθμους που υποστηρίζει το δυαδικό, δηλαδή μια λίστα δυνατοτήτων και όχι το διαπραγματευμένο αποτέλεσμα. Η δεύτερη δείχνει τι ζητά στην πραγματικότητα ο διακομιστής. Το αρχείο καταγραφής σύνδεσης είναι το μέρος για να επιβεβαιώσετε την τελική επιλογή, γιατί ένας πελάτης μπορεί να πέσει σε κάτι που ο διακομιστής επιτρέπει αλλά κανείς δεν είχε κατά νου.

Μετρήστε τον φόρτο που εκτελείτε πραγματικά

Ένα κρυπτογραφικό μικρομέτρημα μετρά μια πρωτόγονη υπό τις δικές της συνθήκες. Μια μεταφορά VPN επίσης αντιγράφει buffers, προγραμματίζει νήματα ή διακοπές, ελέγχει πολιτική και διασχίζει το δίκτυο. Αυτά τα μέρη συχνά κυριαρχούν, και γι’ αυτό μια ταχύτερη πρωτόγονη δεν παράγει πάντα ταχύτερο τούνελ.

openssl speed -evp aes-256-gcm
openssl speed -evp sha1

Αυτές οι δύο εντολές σας δίνουν μια πρόχειρη τοπική σύγκριση των πρωτόγονων στο μηχάνημα μπροστά σας, και είναι ειλικρινείς ότι είναι μικρομετρήματα. Δεν λένε τίποτα για τη διεκπεραίωση του τούνελ σας, και δεν θα έπρεπε ποτέ να αναφέρονται ως τέτοια.

Στη συνέχεια μετρήστε τον φόρτο που έχει σημασία, κρατώντας όλα τα άλλα σταθερά: ίδιο τελικό σημείο, ίδια μεγέθη πακέτων, ίδια μεταφορά, ίδια πολιτική συμπίεσης. Αν η αλλαγή προφίλ άλλαξε και τη μεταφορά ή τη θέση επεξεργασίας, το αποτέλεσμα περιγράφει αυτή τη δέσμη και όχι την κρυπτογραφία.

Κρατήστε και τον στόχο στο οπτικό σας πεδίο. Μια διαδρομή δεδομένων με ελεύθερη κρυπτογραφική χωρητικότητα μπορεί να παραμένει περιορισμένη από καθυστέρηση, γιατί η εφαρμογή περιμένει ταξίδια μετ’ επιστροφής, και τα κέρδη σε χονδρική χωρητικότητα δεν διορθώνουν ένα φλύαρο πρωτόκολλο. Μετρήστε τη διαμόρφωση που υποστηρίζεται και έχει εγκριθεί από την πολιτική ως σύνολο, και αντιμετωπίστε το «λιγότερα κουτιά πρέπει να είναι ταχύτερα» ως την υπόθεση που είναι. Το χρήσιμο ερώτημα δεν είναι αν η κρυπτογράφηση κοστίζει κάτι, αλλά αν το κόστος εμφανίζεται στη μέτρηση που πραγματικά σας ενδιαφέρει.

Σχετικά άρθρα