Άρα είναι χασίς. Κρυπτογραφική συνάρτηση κατακερματισμού

Ηλεκτρονική 06.07.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

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

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

Ο κατακερματισμός είναι ένα καλό παράδειγμα της ισορροπίας μεταξύ χρόνου και μνήμης. Εάν δεν υπήρχε όριο στην ποσότητα της χρησιμοποιούμενης μνήμης, οποιαδήποτε αναζήτηση θα μπορούσε να πραγματοποιηθεί με μία μόνο πρόσβαση στη μνήμη, χρησιμοποιώντας απλώς το κλειδί ως διεύθυνση μνήμης, όπως σε μια αναζήτηση διανομής. Ωστόσο, αυτή η ιδανική περίπτωση συνήθως δεν είναι εφικτή επειδή τα μεγάλα πλήκτρα μπορεί να απαιτούν τεράστια ποσότητα μνήμης. Από την άλλη, αν δεν υπήρχαν περιορισμοί στο χρόνος παράδοσης, θα ήταν δυνατό να τα βγάλετε πέρα ​​με μια ελάχιστη ποσότητα μνήμης χρησιμοποιώντας τη μέθοδο διαδοχικής αναζήτησης. Ο κατακερματισμός είναι ένας τρόπος χρήσης μιας λογικής ποσότητας μνήμης και χρόνου, και επίτευξης ισορροπίας μεταξύ αυτών των δύο άκρων. Συγκεκριμένα, μπορείτε να διατηρήσετε οποιαδήποτε ισορροπία απλώς αλλάζοντας το μέγεθος του πίνακα, αντί να ξαναγράψετε τον κώδικα ή επιλέγοντας διαφορετικούς αλγόριθμους.

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

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

Λειτουργίες κατακερματισμού

Πρώτα απ 'όλα, είναι απαραίτητο να λυθεί το πρόβλημα του υπολογισμού μιας συνάρτησης κατακερματισμού που μετατρέπει τα κλειδιά σε διευθύνσεις πίνακα. Συνήθως, η εφαρμογή αυτού του αριθμητικού υπολογισμού δεν είναι δύσκολη, αλλά πρέπει να προσέχετε να μην συναντήσετε διάφορες ανεπαίσθητες παγίδες. Εάν έχετε έναν πίνακα που μπορεί να περιέχει στοιχεία M, χρειάζεστε μια συνάρτηση που μετατρέπει τα κλειδιά σε ακέραιους αριθμούς στην περιοχή. Μια ιδανική συνάρτηση κατακερματισμού θα πρέπει να είναι εύκολο να υπολογιστεί και θα πρέπει να είναι παρόμοια με μια τυχαία συνάρτηση: για κάθε δεδομένο όρισμα, τα αποτελέσματα πρέπει να είναι κατά κάποιο τρόπο εξίσου πιθανά.

Η συνάρτηση κατακερματισμού εξαρτάται από τον τύπο του κλειδιού. Αυστηρά μιλώντας, κάθε πιθανός τύπος κλειδιού απαιτεί ξεχωριστή συνάρτηση κατακερματισμού. Για να βελτιωθεί η αποτελεσματικότητα, είναι συνήθως επιθυμητό να αποφεύγεται η ρητή μετατροπή τύπων, στρέφοντας αντ' αυτού στην ιδέα της αντιμετώπισης της δυαδικής αναπαράστασης κλειδιών σε μια λέξη μηχανής ως ακέραιο που μπορεί να χρησιμοποιηθεί σε αριθμητικούς υπολογισμούς. Ο κατακερματισμός προηγείται των γλωσσών υψηλού επιπέδου - στους πρώιμους υπολογιστές ήταν συνηθισμένο να αντιμετωπίζεται μια τιμή είτε ως κλειδί συμβολοσειράς είτε ως ακέραιος αριθμός. Ορισμένες γλώσσες υψηλού επιπέδου καθιστούν δύσκολη τη σύνταξη προγραμμάτων που εξαρτώνται από την αναπαράσταση των κλειδιών σε έναν συγκεκριμένο υπολογιστή, επειδή τέτοια προγράμματα εξαρτώνται από τη μηχανή εγγενώς και επομένως είναι δύσκολο να μεταφερθούν σε άλλον υπολογιστή. Συνήθως οι συναρτήσεις κατακερματισμού εξαρτώνται από τη διαδικασία μετατροπής κλειδιών σε ακέραιους αριθμούς, επομένως μπορεί να είναι δύσκολο για τις υλοποιήσεις κατακερματισμού να είναι τόσο ανεξάρτητες από τη μηχανή όσο και αποτελεσματικές. Γενικά, τα απλά πλήκτρα ακέραιου αριθμού ή πλήκτρων κινητής υποδιαστολής μπορούν να μετατραπούν με μία μόνο λειτουργία του μηχανήματος, αλλά τα πλήκτρα συμβολοσειράς και άλλοι τύποι σύνθετων κλειδιών απαιτούν μεγαλύτερη επιβάρυνση και μεγαλύτερη προσοχή στην αποτελεσματικότητα.

Πιθανώς η απλούστερη κατάσταση είναι όταν τα πλήκτρα είναι αριθμοί κινητής υποδιαστολής από ένα σταθερό εύρος. Για παράδειγμα, εάν τα κλειδιά είναι αριθμοί μεγαλύτεροι από 0 και μικρότεροι από 1, μπορείτε απλά να τους πολλαπλασιάσετε με το M, να στρογγυλοποιήσετε το αποτέλεσμα στον χαμηλότερο ακέραιο αριθμό και να λάβετε μια διεύθυνση στην περιοχή μεταξύ 0 και M - 1. ένα τέτοιο παράδειγμα φαίνεται στο Σχ.


14.1. Εάν τα πλήκτρα είναι μεγαλύτερα από s και μικρότερα από t, μπορούν να κλιμακωθούν αφαιρώντας το s και διαιρώντας με t-s, φέρνοντάς τα στο εύρος τιμών μεταξύ 0 και 1 και, στη συνέχεια, πολλαπλασιάζοντας με το M για να λάβετε τη διεύθυνση στον πίνακα .

Ρύζι. 14.1.

Εάν τα κλειδιά είναι ακέραιοι αριθμοί w-bit, μπορούν να μετατραπούν σε floats και να διαιρεθούν με 2 w για να παράγουν πλωτήρες στην περιοχή μεταξύ 0 και 1 και στη συνέχεια να πολλαπλασιαστούν με το M όπως στην προηγούμενη παράγραφο. Εάν οι πράξεις κινητής υποδιαστολής διαρκούν πολύ και οι αριθμοί δεν είναι αρκετά μεγάλοι για να προκαλέσουν υπερχείλιση, το ίδιο αποτέλεσμα μπορεί να ληφθεί χρησιμοποιώντας ακέραια αριθμητική αριθμητική: πολλαπλασιάστε το κλειδί με το M και, στη συνέχεια, μετατοπίστε τα bits w προς τα δεξιά για να διαιρέσετε με 2 w (ή, εάν ο πολλαπλασιασμός οδηγεί σε υπερχείλιση, κάντε μια μετατόπιση και μετά έναν πολλαπλασιασμό). Τέτοιες μέθοδοι είναι άχρηστες για κατακερματισμό εκτός εάν τα κλειδιά κατανέμονται ομοιόμορφα σε όλο το εύρος, καθώς η τιμή κατακερματισμού καθορίζεται μόνο από τα αρχικά ψηφία του κλειδιού.

Μια απλούστερη και πιο αποτελεσματική μέθοδος για ακέραιους αριθμούς w-bit είναι ίσως μια από τις πιο συχνά χρησιμοποιούμενες μεθόδους κατακερματισμού - επιλέγοντας έναν πρώτο αριθμό ως το μέγεθος M του πίνακα και υπολογίζοντας το υπόλοιπο κατά τη διαίρεση του k με το M, δηλ. h(k) = k mod M για οποιοδήποτε ακέραιο κλειδί k. Αυτή η συνάρτηση ονομάζεται αρθρωτή συνάρτηση κατακερματισμού. Είναι πολύ εύκολο να υπολογιστεί (k % M σε C++) και είναι αποτελεσματικό στην επίτευξη ομοιόμορφης κατανομής βασικών τιμών μεταξύ τιμών μικρότερων από το M. Ένα μικρό παράδειγμα φαίνεται στο Σχήμα 1.


14.2.

Ρύζι. 14.2.

Οι τρεις στήλες στα δεξιά δείχνουν το αποτέλεσμα του κατακερματισμού των πλήκτρων 16-bit που εμφανίζονται στα αριστερά χρησιμοποιώντας τις ακόλουθες λειτουργίες:

v% 97 (αριστερά)

v% 100 (κέντρο) και

(int) (a * v) % 100 (δεξιά),

όπου a = .618033. Τα μεγέθη του πίνακα για αυτές τις συναρτήσεις είναι αντίστοιχα 97, 100 και 100. Οι τιμές εμφανίζονται τυχαίες (επειδή τα πλήκτρα είναι τυχαία). Η δεύτερη συνάρτηση (v % 100) χρησιμοποιεί μόνο τα δύο δεξιά ψηφία των πλήκτρων και επομένως μπορεί να εμφανίζει κακή απόδοση για μη τυχαία πλήκτρα.

Ο αρθρωτός κατακερματισμός χρησιμοποιείται σε όλες τις περιπτώσεις όπου υπάρχει πρόσβαση στα bit που αποτελούν τα κλειδιά, είτε πρόκειται για ακέραιους αριθμούς που αντιπροσωπεύονται από μια λέξη μηχανής, μια ακολουθία χαρακτήρων συσκευασμένη σε μια λέξη μηχανής ή αντιπροσωπεύονται από οποιαδήποτε άλλη πιθανή παραλλαγή. Μια ακολουθία τυχαίων χαρακτήρων που συσκευάζονται σε μια λέξη μηχανής δεν είναι ακριβώς η ίδια με τα τυχαία ακέραια πλήκτρα, καθώς δεν χρησιμοποιούνται όλα τα bit για κωδικοποίηση. Αλλά και οι δύο αυτοί τύποι (και οποιοσδήποτε άλλος τύπος κλειδιού κωδικοποιημένος για να ταιριάζει σε μια λέξη μηχανής) μπορούν να φαίνονται ως τυχαία ευρετήρια σε ένα μικρό τραπέζι.

Ο κύριος λόγος για την επιλογή ενός πίνακα κατακερματισμού πρώτων αριθμών μεγέθους M για αρθρωτό κατακερματισμό φαίνεται στο Σχήμα.

14.3. Σε αυτό το παράδειγμα δεδομένων χαρακτήρων 7 bit, το κλειδί αντιμετωπίζεται ως βασικός αριθμός 128 - ένα ψηφίο για κάθε χαρακτήρα του κλειδιού. Η λέξη αντιστοιχεί πλέον στον αριθμό 1816567, ο οποίος μπορεί να γραφτεί και ως


γιατί στον κώδικα ASCII οι χαρακτήρες n, o και w αντιστοιχούν στους αριθμούς 1568 = 110, 1578 = 111 και 1678 = 119. Η επιλογή μεγέθους πίνακα M = 64 για αυτόν τον τύπο κλειδιού είναι ατυχής, επειδή η προσθήκη πολλαπλασίων του 64 (ή του 128) στο x δεν αλλάζει την τιμή του x mod 64 - για οποιοδήποτε κλειδί, η τιμή κατακερματισμού είναι η τιμή των τελευταίων 6 ψηφίων αυτού του κλειδιού. Φυσικά, μια καλή συνάρτηση κατακερματισμού πρέπει να λαμβάνει υπόψη όλα τα bit του κλειδιού, ειδικά για τα πλήκτρα χαρακτήρων. Παρόμοιες καταστάσεις μπορεί να προκύψουν όταν το M περιέχει έναν παράγοντα που είναι δύναμη 2. Ο απλούστερος τρόπος για να αποφευχθεί αυτό είναι να επιλέξετε έναν πρώτο αριθμό για τον M.

Ρύζι. 14.3.

Ο αρθρωτός κατακερματισμός είναι πολύ απλός στην εφαρμογή, εκτός από το ότι το μέγεθος του πίνακα πρέπει να είναι πρώτος αριθμός. Για ορισμένες εφαρμογές, μπορείτε να αρκεστείτε σε έναν μικρό γνωστό πρώτο αριθμό ή μπορείτε να πραγματοποιήσετε αναζήτηση στη λίστα των γνωστών πρώτων αριθμών για έναν που είναι κοντά στο απαιτούμενο μέγεθος πίνακα. Για παράδειγμα, αριθμοί ίσοι με 2 t - 1 είναι πρώτοι όταν t = 2, 3, 5, 7, 13, 17, 19 και 31(και για καμία άλλη τιμή του t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не единственная причина, по которой размер таблицы стоит сделать простым числом; еще одна причина рассматривается в разделе 14.4.


Ρύζι. 14.4.

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

Μια άλλη επιλογή για το χειρισμό ακέραιων κλειδιών είναι ο συνδυασμός των πολλαπλασιαστικών και σπονδυλωτών μεθόδων: πολλαπλασιάζετε το κλειδί με μια σταθερά μεταξύ 0 και 1 και, στη συνέχεια, διαιρείτε το modulo M. Με άλλα λόγια, πρέπει να χρησιμοποιήσετε τη συνάρτηση . Υπάρχει μια σχέση μεταξύ των τιμών του, M και της αποτελεσματικής ρίζας του κλειδιού που θα μπορούσε θεωρητικά να οδηγήσει σε ανώμαλη συμπεριφορά, αλλά εάν χρησιμοποιηθεί μια αυθαίρετη τιμή του a, είναι απίθανο να προκύψει κάποιο πρόβλημα σε μια πραγματική εφαρμογή. Συχνά η τιμή φ = 0,618033... (χρυσή αναλογία) επιλέγεται ως α.

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

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

Στον κώδικα ASCII 7-bit, αυτή η λέξη αντιστοιχεί σε έναν αριθμό 84-bit \begin(align*) 97 \cdot 128^(11) &+ 118 \cdot 128^(10) + 101 \cdot 128^(9) + 114 \ cdot 128^(8) + 121 \cdot 128^(7)\\ &+ 108 \cdot 128^(6) + 111 \cdot 128^(5) + 110 \cdot 128^(4) + 103 \ cdot 128 ^(3)\\ &+ 107 \cdot 128^(2) + 101 \cdot 128^(1) + 121 \cdot 128^(0), \end(align*),

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

Για τον υπολογισμό μιας αρθρωτής συνάρτησης κατακερματισμού για μεγάλα πλήκτρα, μετατρέπονται κομμάτι προς θραύσμα. Μπορείτε να επωφεληθείτε από τις αριθμητικές ιδιότητες της συνάρτησης συντελεστή και να χρησιμοποιήσετε τον αλγόριθμο του Horner (βλ. Ενότητα 4.9 «Αφηρημένοι τύποι δεδομένων»). Αυτή η μέθοδος βασίζεται σε έναν άλλο τρόπο εγγραφής αριθμών που αντιστοιχούν σε κλειδιά. Για το υπό εξέταση παράδειγμα, γράφουμε την ακόλουθη έκφραση: \begin(align*) ((((((((97 \cdot 128^(11) &+ 118) \cdot 128^(10) + 101) \ cdot 128^( 9) + 114) \cdot 128^(8) + 121) \cdot 128^(7)\\ &+ 108) \cdot 128^(6) + 111) \cdot 128^(5) + 110) \cdot 128^(4) + 103) \cdot 128^(3)\\ &+ 107) \cdot 128^(2) + 101) \cdot 128^(1) + 121. \end(align* )

Δηλαδή, ο δεκαδικός αριθμός που αντιστοιχεί στην κωδικοποίηση χαρακτήρων μιας συμβολοσειράς μπορεί να υπολογιστεί σαρώνοντάς την από αριστερά προς τα δεξιά, πολλαπλασιάζοντας τη συσσωρευμένη τιμή επί 128 και στη συνέχεια προσθέτοντας την τιμή κωδικοποίησης του επόμενου χαρακτήρα. Στην περίπτωση μιας μεγάλης συμβολοσειράς, αυτή η μέθοδος υπολογισμού θα οδηγήσει τελικά σε έναν αριθμό μεγαλύτερο από αυτόν που μπορεί γενικά να αναπαρασταθεί σε έναν υπολογιστή. Ωστόσο, αυτός ο αριθμός δεν χρειάζεται, αφού απαιτείται μόνο το (μικρό) υπόλοιπο της διαίρεσης του με το M Το αποτέλεσμα μπορεί να ληφθεί χωρίς καν να αποθηκεύσετε μια μεγάλη συσσωρευμένη τιμή, γιατί σε οποιοδήποτε σημείο του υπολογισμού, μπορούμε να απορρίψουμε ένα πολλαπλάσιο του M - κάθε φορά που εκτελούμε πολλαπλασιασμό και πρόσθεση, χρειάζεται μόνο να αποθηκεύουμε το υπόλοιπο του modulo διαίρεσης M. Το αποτέλεσμα θα είναι το ίδιο σαν να είχαμε την ευκαιρία να υπολογίσουμε έναν μεγάλο αριθμό και μετά εκτελέστε διαίρεση (βλ. άσκηση 14.10). Αυτή η παρατήρηση οδηγεί σε μια απλή αριθμητική μέθοδο για τον υπολογισμό των αρθρωτών συναρτήσεων κατακερματισμού για μεγάλες συμβολοσειρές - βλέπε Πρόγραμμα 14.1. Αυτό το πρόγραμμα χρησιμοποιεί ένα τελευταίο τέχνασμα: αντί να χρησιμοποιεί τη βάση 128, χρησιμοποιεί τον πρώτο αριθμό 127. Ο λόγος για αυτήν την αλλαγή συζητείται στην επόμενη παράγραφο.

Υπάρχουν πολλοί τρόποι υπολογισμού συναρτήσεων κατακερματισμού με περίπου το ίδιο κόστος με το αρθρωτό κατακερματισμό χρησιμοποιώντας τη μέθοδο του Horner (μία ή δύο αριθμητικές πράξεις για κάθε χαρακτήρα στο κλειδί). Για τα τυχαία κλειδιά, αυτές οι μέθοδοι είναι πρακτικά οι ίδιες, αλλά τα πραγματικά κλειδιά σπάνια είναι τυχαία. Η δυνατότητα τυχαιοποίησης πραγματικών κλειδιών με χαμηλό κόστος μάς οδηγεί να εξετάσουμε τυχαιοποιημένους αλγόριθμους κατακερματισμού, καθώς απαιτούμε συναρτήσεις κατακερματισμού που δημιουργούν τυχαίους δείκτες σε έναν πίνακα ανεξάρτητα από την κατανομή του κλειδιού. Η τυχαιοποίηση δεν είναι δύσκολο να οργανωθεί, καθώς δεν είναι καθόλου απαραίτητο να τηρήσουμε κυριολεκτικά τον ορισμό του αρθρωτού κατακερματισμού - είναι απαραίτητο μόνο στον υπολογισμό ενός ακέραιου αριθμού μικρότερου από M, να χρησιμοποιούνται όλα τα bit του κλειδιού.

Πρόγραμμα 14.1. Λειτουργία κατακερματισμού για πλήκτρα συμβολοσειράς

M = 96 και a = 128 (πάνω),

M = 97 και a = 128 (κέντρο) και

M=96 και a=127 (κάτω)

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

Το πρόγραμμα 14.1 δείχνει έναν τρόπο για να το κάνετε αυτό: χρησιμοποιώντας έναν βασικό πρώτο αντί για δύναμη 2 και έναν ακέραιο που αντιστοιχεί στην αναπαράσταση ASCII της συμβολοσειράς. Στο Σχ. 14.5 Εικ.

Θεωρητικά, μια ιδανική καθολική συνάρτηση κατακερματισμού είναι αυτή για την οποία η πιθανότητα σύγκρουσης μεταξύ δύο διαφορετικών κλειδιών σε έναν πίνακα μεγέθους M είναι ακριβώς 1/M. Μπορεί να αποδειχθεί ότι η χρήση μιας ακολουθίας τυχαίων διακριτών τιμών ως συντελεστής a στο Πρόγραμμα 14.1, αντί για μια σταθερή αυθαίρετη τιμή, μετατρέπει τον αρθρωτό κατακερματισμό σε μια καθολική συνάρτηση κατακερματισμού. Ωστόσο, το κόστος δημιουργίας ενός νέου τυχαίου αριθμού για κάθε χαρακτήρα στο κλειδί είναι συνήθως απαράδεκτο. Στην πράξη, ο συμβιβασμός που φαίνεται στο Πρόγραμμα 14.1 μπορεί να επιτευχθεί με το να μην αποθηκεύεται ένας πίνακας διαφορετικών τυχαίων αριθμών για κάθε βασικό χαρακτήρα, αλλά μεταβάλλοντας τους συντελεστές δημιουργώντας μια απλή ψευδοτυχαία ακολουθία.

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

κατακερματισμός κατά την επίλυση προβλημάτων σε C++.

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

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

Κατακερματισμόςκατακερματισμός, αγγλικά κατακερματισμός) είναι ένας μετασχηματισμός ενός πίνακα δεδομένων εισόδου συγκεκριμένου τύπου και αυθαίρετου μήκους σε μια συμβολοσειρά bit εξόδου σταθερού μήκους. Τέτοιοι μετασχηματισμοί ονομάζονται επίσης συναρτήσεις κατακερματισμούή συνάρτηση συνέλιξης, και τα αποτελέσματά τους καλούνται hash, hash κωδικός, hash πίνακαςή σύνοψημηνύματα (Αγγλικά) σύνοψη μηνύματος).

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

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

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

Εάν όλα τα δεδομένα ήταν τυχαία, τότε οι συναρτήσεις κατακερματισμού θα ήταν πολύ απλές (για παράδειγμα, μερικά bits πλήκτρων). Ωστόσο, στην πράξη, τα τυχαία δεδομένα είναι αρκετά σπάνια ώστε να πρέπει να δημιουργήσετε μια συνάρτηση που εξαρτάται από ολόκληρο το κλειδί. Αν μια συνάρτηση κατακερματισμού κατανέμει έναν πληθυσμό πιθανά κλειδιάομοιόμορφα σε πολλά ευρετήρια, ο κατακερματισμός διαχωρίζει αποτελεσματικά πολλά κλειδιά. Η χειρότερη περίπτωση είναι όταν όλα τα κλειδιά κατακερματίζονται σε ένα ευρετήριο.

Όταν συμβαίνουν συγκρούσεις, είναι απαραίτητο να βρείτε μια νέα θέση για την αποθήκευση των κλειδιών που διεκδικούν το ίδιο κελί πίνακα κατακερματισμού. Επιπλέον, εάν επιτρέπονται συγκρούσεις, τότε ο αριθμός τους πρέπει να ελαχιστοποιηθεί. Σε ορισμένες ειδικές περιπτώσεις είναι δυνατό να αποφευχθούν εντελώς οι συγκρούσεις. Για παράδειγμα, εάν όλα τα κλειδιά στοιχείων είναι γνωστά εκ των προτέρων (ή αλλάζουν πολύ σπάνια), τότε μπορεί να βρεθεί κάποια συνάρτηση κατακερματισμού με ένεση που θα τα κατανείμει στα κελιά του πίνακα κατακερματισμού χωρίς συγκρούσεις. Οι πίνακες κατακερματισμού που χρησιμοποιούν παρόμοιες συναρτήσεις κατακερματισμού δεν χρειάζονται μηχανισμό επίλυσης σύγκρουσης και ονομάζονται πίνακες κατακερματισμού με απευθείας διευθυνσιοδότηση.

Οι πίνακες κατακερματισμού πρέπει να ταιριάζουν με τα ακόλουθα σκηνικά θέατρου.

  • Η εκτέλεση μιας λειτουργίας σε έναν πίνακα κατακερματισμού ξεκινά με τον υπολογισμό της συνάρτησης κατακερματισμού του κλειδιού. Η τιμή κατακερματισμού που προκύπτει είναι ένα ευρετήριο στον αρχικό πίνακα.
  • Ο αριθμός των αποθηκευμένων στοιχείων πίνακα διαιρούμενος με τον αριθμό των πιθανών τιμών κατακερματισμού ονομάζεται παράγοντας πλήρωσης πίνακα κατακερματισμού (συντελεστής φορτίου) και είναι μια σημαντική παράμετρος από την οποία εξαρτάται ο μέσος χρόνος εκτέλεσης των πράξεων.
  • Οι λειτουργίες αναζήτησης, εισαγωγής και διαγραφής θα πρέπει να ολοκληρώνονται σε χρόνο O(1) κατά μέσο όρο. Ωστόσο, αυτή η εκτίμηση δεν λαμβάνει υπόψη το πιθανό κόστος υλικού για την ανακατασκευή του ευρετηρίου κατακερματισμού πίνακα που σχετίζεται με την αύξηση της τιμής του μεγέθους του πίνακα και την προσθήκη ενός νέου ζεύγους στον πίνακα κατακερματισμού.
  • Ο μηχανισμός επίλυσης σύγκρουσης είναι ένα σημαντικό στοιχείο οποιουδήποτε πίνακα κατακερματισμού.

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

Μέθοδοι επίλυσης σύγκρουσης

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

  • μέθοδος αλυσίδας (εξωτερικός ή ανοιχτός κατακερματισμός).
  • ανοικτή μέθοδος διευθυνσιοδότησης (κλειστός κατακερματισμός).

Μέθοδος αλυσίδας. Η τεχνολογία πρόσφυσης στοιχείων είναι αυτή στοιχεία του συνόλου, που αντιστοιχούν στην ίδια τιμή κατακερματισμού, συνδέονται σε μια λίστα αλυσίδας. Ο αριθμός θέσης i αποθηκεύει έναν δείκτη στην κορυφή της λίστας των στοιχείων των οποίων η τιμή κατακερματισμού κλειδιού είναι ίση με i. Εάν δεν υπάρχουν τέτοια στοιχεία στο σύνολο, το NULL γράφεται στη θέση i. Στο Σχ.


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

Ρύζι. 38.1.

Κάθε κελί πίνακα είναι ένας δείκτης σε μια συνδεδεμένη λίστα (αλυσίδα) ζευγών κλειδιού-τιμής που αντιστοιχούν στην ίδια τιμή κατακερματισμού του κλειδιού. Οι συγκρούσεις καταλήγουν απλώς σε αλυσίδες μεγαλύτερες από ένα στοιχείο.

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

Με την υπόθεση ότι κάθε στοιχείο μπορεί να καταλήξει σε οποιαδήποτε θέση του πίνακα με ίση πιθανότητα και ανεξάρτητα από το πού καταλήγει οποιοδήποτε άλλο στοιχείο, Σχόλιο:

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

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

Η έννοια της συνάρτησης κατακερματισμούΛειτουργία κατακερματισμού

όπου M είναι το αρχικό μήνυμα, που μερικές φορές ονομάζεται πρωτότυπο, και το h είναι το αποτέλεσμα, που ονομάζεται τιμή κατακερματισμού (και επίσης κωδικός κατακερματισμούή σύνοψη μηνύματος(από τα αγγλικά σύνοψη μηνύματος)).

Η έννοια της συνάρτησης κατακερματισμού είναι να προσδιοριστεί το χαρακτηριστικό γνώρισμα της προεικόνας - η τιμή της συνάρτησης κατακερματισμού. Αυτή η τιμή έχει συνήθως κάποιο σταθερό μέγεθος, όπως 64 ή 128 bit. Ο κωδικός κατακερματισμού μπορεί να αναλυθεί περαιτέρω για να λυθεί οποιοδήποτε πρόβλημα. Για παράδειγμα, ο κατακερματισμός μπορεί να χρησιμοποιηθεί για τη σύγκριση δεδομένων: εάν δύο πίνακες δεδομένων έχουν διαφορετικούς κωδικούς κατακερματισμού, οι πίνακες είναι εγγυημένο ότι είναι διαφορετικοί. αν είναι ίδιοι, οι πίνακες είναι πιθανότατα ίδιοι. Γενικά, δεν υπάρχει αντιστοιχία ένα προς ένα μεταξύ των δεδομένων πηγής και του κωδικού κατακερματισμού, λόγω του γεγονότος ότι ο αριθμός των τιμών συνάρτησης κατακερματισμού είναι πάντα μικρότερος από τον αριθμό των επιλογών δεδομένων εισαγωγής. Κατά συνέπεια, υπάρχουν πολλά μηνύματα εισόδου που δίνουν τους ίδιους κωδικούς κατακερματισμού (τέτοιες καταστάσεις ονομάζονται συγκρούσεις). Η πιθανότητα συγκρούσεων παίζει σημαντικό ρόλο στην αξιολόγηση της ποιότητας των συναρτήσεων κατακερματισμού.

Οι συναρτήσεις κατακερματισμού χρησιμοποιούνται ευρέως στη σύγχρονη κρυπτογραφία.

Η απλούστερη συνάρτηση κατακερματισμού μπορεί να κατασκευαστεί χρησιμοποιώντας τη λειτουργία "sum modulo 2" ως εξής: παίρνουμε τη συμβολοσειρά εισόδου, προσθέτουμε όλα τα byte modulo 2 και επιστρέφουμε το byte αποτέλεσμα ως τιμή κατακερματισμού. Το μήκος της τιμής της συνάρτησης κατακερματισμού σε αυτήν την περίπτωση θα είναι 8 bit, ανεξάρτητα από το μέγεθος του μηνύματος εισόδου.

Για παράδειγμα, ας υποθέσουμε ότι το αρχικό μήνυμα, μεταφρασμένο σε ψηφιακή μορφή, ήταν το εξής (σε δεκαεξαδικό):

Ας μετατρέψουμε το μήνυμα σε δυαδική μορφή, γράψουμε τα byte το ένα κάτω από το άλλο και προσθέτουμε τα bit σε κάθε στήλη modulo 2:

0011 1110 0101 0100 1010 0000 0001 1111 1101 0100 ---------- 0110 0101

Το αποτέλεσμα (0110 0101 (2) ή 65 (16)) θα είναι η τιμή κατακερματισμού.

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

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

Ας διατυπώσουμε τις βασικές απαιτήσεις για κρυπτογραφικές συναρτήσεις κατακερματισμού:

  • η συνάρτηση κατακερματισμού πρέπει να είναι εφαρμόσιμη σε μήνυμα οποιουδήποτε μεγέθους.
  • ο υπολογισμός της τιμής της συνάρτησης πρέπει να εκτελείται αρκετά γρήγορα.
  • Δεδομένης μιας γνωστής τιμής συνάρτησης κατακερματισμού, θα πρέπει να είναι δύσκολο (σχεδόν αδύνατο) να βρεθεί μια κατάλληλη αντίστροφη εικόνα του M.
  • δεδομένου ενός γνωστού μηνύματος M, θα πρέπει να είναι δύσκολο να βρεθεί άλλο μήνυμα M' με την ίδια τιμή κατακερματισμού με το αρχικό μήνυμα.
  • Θα πρέπει να είναι δύσκολο να βρείτε οποιοδήποτε ζεύγος τυχαία διακριτών μηνυμάτων με την ίδια τιμή κατακερματισμού.

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

Επί του παρόντος, στην πράξη, ως συναρτήσεις κατακερματισμού χρησιμοποιούνται συναρτήσεις που επεξεργάζονται το μπλοκ μηνύματος εισόδου κατά μπλοκ και υπολογίζουν την τιμή κατακερματισμού h i για κάθε μπλοκ M i του μηνύματος εισόδου σύμφωνα με τις εξαρτήσεις της φόρμας.

h i =H(M i,h i-1),

όπου h i-1 είναι το αποτέλεσμα που προκύπτει κατά τον υπολογισμό της συνάρτησης κατακερματισμού για το προηγούμενο μπλοκ δεδομένων εισόδου.

Ως αποτέλεσμα, η έξοδος της συνάρτησης κατακερματισμού h n είναι συνάρτηση όλων των n μπλοκ του μηνύματος εισόδου.

Χρήση αλγορίθμων κρυπτογράφησης μπλοκ για τη δημιουργία συνάρτησης κατακερματισμού

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

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

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

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

Η καθορισμένη διαδικασία λήψης και χρήσης απομίμησης ενθέτων περιγράφεται στο εγχώριο πρότυπο GOST 28147-89. Το πρότυπο προτείνει τη χρήση των χαμηλότερων 32 bit του μπλοκ που λαμβάνεται στην έξοδο ολόκληρης της λειτουργίας κρυπτογράφησης μηνυμάτων στη λειτουργία αλυσίδας μπλοκ κρυπτογράφησης για τον έλεγχο της ακεραιότητας του μεταδιδόμενου μηνύματος. Με τον ίδιο τρόπο, μπορείτε να χρησιμοποιήσετε οποιοδήποτε μπλοκ μπλοκ για να σχηματίσετε ένα προσομοιωμένο ένθετο. συμμετρικός αλγόριθμος κρυπτογράφησης.

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

Στην πραγματικότητα, υπάρχουν πολλά άλλα πιθανά σχήματα για τη χρήση ενός μπλοκ κρυπτογράφησης για τη δημιουργία μιας συνάρτησης κατακερματισμού. Έστω M i το μπλοκ του αρχικού μηνύματος, h i η τιμή της συνάρτησης κατακερματισμού στο i-ο στάδιο, f είναι ο αλγόριθμος κρυπτογράφησης μπλοκ που χρησιμοποιείται στην απλή λειτουργία αντικατάστασης και έστω η λειτουργία του modulo πρόσθεσης 2. Στη συνέχεια , για παράδειγμα, είναι δυνατά τα ακόλουθα σχήματα για τη δημιουργία μιας συνάρτησης κατακερματισμού:

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

Το κύριο μειονέκτημα των συναρτήσεων κατακερματισμού που έχουν σχεδιαστεί με βάση αλγόριθμους μπλοκ είναι η σχετικά χαμηλή ταχύτητα λειτουργίας. Η απαιτούμενη κρυπτογραφική ισχύς μπορεί να επιτευχθεί με λιγότερες λειτουργίες στα δεδομένα εισόδου. Υπάρχουν ταχύτεροι αλγόριθμοι κατακερματισμού σχεδιασμένοι ανεξάρτητα, από την αρχή, με βάση τις απαιτήσεις κρυπτογραφικής αντοχής (οι πιο συνηθισμένοι από αυτούς είναι οι MD5, SHA-1, SHA-2 και GOST R 34.11-94).

Για την επίλυση του προβλήματος της εύρεσης του απαιτούμενου στοιχείου μεταξύ μεγάλων δεδομένων, προτάθηκε ένας αλγόριθμος κατακερματισμός (κατακερματισμός- μίξη), στα οποία δημιουργούνται κλειδιά που ορίζουν τα δεδομένα του πίνακα και, στη βάση τους, τα δεδομένα εγγράφονται σε έναν πίνακα που ονομάζεται πίνακας κατακερματισμού . Τα πλήκτρα εγγραφής καθορίζονται χρησιμοποιώντας τη λειτουργία i = h(κλειδί) , κάλεσε συνάρτηση κατακερματισμού . Ο αλγόριθμος κατακερματισμού καθορίζει τη θέση του στοιχείου που αναζητήθηκε στον πίνακα κατακερματισμού με βάση την τιμή του κλειδιού του που λαμβάνεται από τη συνάρτηση κατακερματισμού.

Εννοια κατακερματισμός- Αυτή είναι η κατάτμηση ενός κοινού (βασικού) συνόλου μοναδικών κλειδιών στοιχείων δεδομένων σε χωριστά σύνολα με μια συγκεκριμένη ιδιότητα.

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

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

Αν το βασικό σετ περιέχει Νστοιχεία, τότε μπορεί να χωριστεί σε 2 Νδιάφορα υποσύνολα.

Πίνακας κατακερματισμού και συναρτήσεις κατακερματισμού

Μια συνάρτηση που αντιστοιχίζει τα κλειδιά των στοιχείων δεδομένων σε ένα σύνολο ακεραίων αριθμών (ευρετήρια σε πίνακα - πίνακας κατακερματισμού ), κάλεσε λειτουργία κατακερματισμού , ή συνάρτηση κατακερματισμού :

εγώ = η(κλειδί);

Οπου κλειδί– μετατρέψιμο κλειδί, εγώ– το προκύπτον ευρετήριο πίνακα, δηλ. το κλειδί αντιστοιχίζεται σε ένα σύνολο ακεραίων αριθμών ( κατακερματισμένες διευθύνσεις ), τα οποία στη συνέχεια χρησιμοποιούνται για την πρόσβαση στα δεδομένα.

Ωστόσο, μια συνάρτηση κατακερματισμού για πολλαπλές βασικές τιμές μπορεί να παράγει την ίδια τιμή θέσης εγώστον πίνακα. Καλείται η κατάσταση στην οποία δύο ή περισσότερα κλειδιά μοιράζονται το ίδιο ευρετήριο (διεύθυνση κατακερματισμού). σύγκρουση κατά τον κατακερματισμό.

Μια καλή συνάρτηση κατακερματισμού είναι μια συνάρτηση που ελαχιστοποιεί τις συγκρούσεις και κατανέμει τα δεδομένα ομοιόμορφα σε όλο τον πίνακα και μια τέλεια συνάρτηση κατακερματισμού είναι μια συνάρτηση που δεν δημιουργεί συγκρούσεις:

Υπάρχουν δύο μέθοδοι για την επίλυση συγκρούσεων κατακερματισμού:

– ανοικτή μέθοδος διευθυνσιοδότησης με γραμμική δοκιμή.

– μέθοδος αλυσίδας.

Τραπέζι κατακερματισμού

Ένας πίνακας κατακερματισμού είναι ένας κανονικός πίνακας με ασυνήθιστη διευθυνσιοδότηση που καθορίζεται από μια συνάρτηση κατακερματισμού.

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

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

Παραδείγματα συναρτήσεων κατακερματισμού

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

Μέθοδος διαίρεσης. Τα αρχικά δεδομένα είναι κάποιο ακέραιο κλειδί κλειδίκαι μέγεθος τραπεζιού m. Το αποτέλεσμα αυτής της συνάρτησης είναι το υπόλοιπο όταν αυτό το κλειδί διαιρείται με το μέγεθος του πίνακα. Γενική άποψη της λειτουργίας:

int h (πλήκτρο int, int m) (

κλειδί επιστροφής % m; // Αξίες

Για m= 10 συνάρτηση κατακερματισμού επιστρέφει το λιγότερο σημαντικό ψηφίο του κλειδιού.

Για m= 100 συνάρτηση κατακερματισμού επιστρέφει τα λιγότερο σημαντικά δύο ψηφία του κλειδιού.

Προσθετική μέθοδος, στο οποίο το κλειδί είναι μια συμβολοσειρά χαρακτήρων. Σε μια συνάρτηση κατακερματισμού, μια συμβολοσειρά μετατρέπεται σε ακέραιο αθροίζοντας όλους τους χαρακτήρες και επιστρέφοντας το υπόλοιπο μετά τη διαίρεση με m(συνήθως μέγεθος τραπεζιού m= 256).

int h(char *key, int m) (

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

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

int h(char *key, int m) (

int len ​​= strlen(κλειδί), s = 0;

αν (λεν< 2) // Если длина ключа равна 0 или 1,

s = κλειδί; // κλειδί επιστροφής

s = κλειδί + κλειδί;

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

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

Για παράδειγμα, το κλειδί είναι ένας ακέραιος αριθμός 32 bit και η συνάρτηση κατακερματισμού επιστρέφει τα μέσα 10 bit του τετραγώνου της:

int h (κλειδί int) (

κλειδί >>= 11; // Απορρίψτε 11 λιγότερο σημαντικά bit

κλειδί επιστροφής % 1024; // Επιστρέψτε 10 λιγότερο σημαντικά bit

Αποκλειστική μέθοδος ORγια πλήκτρα σειρών (συνήθως μέγεθος πίνακα m=256). Αυτή η μέθοδος είναι παρόμοια με την προσθετική μέθοδο, αλλά διακρίνει παρόμοιες λέξεις. Η μέθοδος είναι ότι η πράξη «αποκλειστικά OR» εφαρμόζεται διαδοχικά στα στοιχεία της συμβολοσειράς.

ΣΕ πολλαπλασιαστική μέθοδος Επιπλέον χρησιμοποιείται ένας τυχαίος πραγματικός αριθμός rαπό το διάστημα . Εάν αυτό το γινόμενο πολλαπλασιαστεί με το μέγεθος του πίνακα m, τότε το ακέραιο μέρος του προϊόντος που προκύπτει θα δώσει μια τιμή στην περιοχή από 0 έως m–1.

int h (πλήκτρο int, int m) (

διπλό r = κλειδί * rnd();

r = r – (int)r; // Επιλέξτε το κλασματικό μέρος

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

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


Τι είναι το hash;Μια συνάρτηση κατακερματισμού είναι ένας μαθηματικός μετασχηματισμός πληροφοριών σε μια μικρή συμβολοσειρά συγκεκριμένου μήκους.

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

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

Ποια χαρακτηριστικά πρέπει να έχει μια συνάρτηση κατακερματισμού;

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

Ποιοι είναι οι δημοφιλείς αλγόριθμοι κατακερματισμού;Επί του παρόντος χρησιμοποιούνται οι ακόλουθες συναρτήσεις κατακερματισμού:

  • CRC – κυκλικός κωδικός πλεονασμού ή άθροισμα ελέγχου. Ο αλγόριθμος είναι πολύ απλός και έχει μεγάλο αριθμό παραλλαγών ανάλογα με το απαιτούμενο μήκος εξόδου. Όχι κρυπτογραφικό!
  • Ο MD 5 είναι ένας πολύ δημοφιλής αλγόριθμος. Όπως και η προηγούμενη έκδοσή του, το MD 4 είναι μια κρυπτογραφική λειτουργία. Το μέγεθος κατακερματισμού είναι 128 bit.
  • Το SHA -1 είναι επίσης μια πολύ δημοφιλής συνάρτηση κρυπτογράφησης. Το μέγεθος κατακερματισμού είναι 160 bit.
  • Το GOST R 34.11-94 είναι ένα ρωσικό κρυπτογραφικό πρότυπο για υπολογισμούς συνάρτησης κατακερματισμού. Το μέγεθος κατακερματισμού είναι 256 bit.

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

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

Τι είναι το ρωσικό;Όπως αναφέρθηκε παραπάνω, στη Ρωσία υπάρχει ένα πρότυπο κατακερματισμού GOST R 34.11-94, το οποίο χρησιμοποιείται ευρέως από πολλούς κατασκευαστές εργαλείων ασφάλειας πληροφοριών. Ένα από αυτά τα εργαλεία είναι το πρόγραμμα επιδιόρθωσης και παρακολούθησης της αρχικής κατάστασης του πακέτου λογισμικού FIX. Αυτό το πρόγραμμα είναι ένα μέσο παρακολούθησης της αποτελεσματικότητας της χρήσης της ασφάλειας πληροφοριών.

ΕΠΙΔΙΟΡΘΩΣΗ (έκδοση 2.0.1) για Windows 9x/NT/2000/XP

  • Υπολογισμός αθροισμάτων ελέγχου καθορισμένων αρχείων χρησιμοποιώντας έναν από τους 5 εφαρμοσμένους αλγόριθμους.
  • Στερέωση και επακόλουθη παρακολούθηση της αρχικής κατάστασης του πακέτου λογισμικού.
  • Σύγκριση εκδόσεων πακέτων λογισμικού.
  • Στερέωση και έλεγχος καταλόγων.
  • Παρακολούθηση αλλαγών σε καθορισμένα αρχεία (καταλόγους).
  • Δημιουργία αναφορών σε μορφές TXT, HTML, SV.
  • Το προϊόν διαθέτει πιστοποιητικό FSTEC για NDV 3 Νο. 913 έως την 1η Ιουνίου 2013.

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

Επί του παρόντος, πολλές εφαρμογές ηλεκτρονικού εμπορίου σάς επιτρέπουν να αποθηκεύετε το μυστικό κλειδί του χρήστη σε μια ιδιωτική περιοχή διακριτικών (ruToken, eToken) χωρίς την τεχνική δυνατότητα να το ανακτήσετε από εκεί. Το ίδιο το διακριτικό έχει μια πολύ περιορισμένη περιοχή μνήμης, μετρημένη σε kilobyte. Για να υπογράψετε ένα έγγραφο, δεν υπάρχει τρόπος να μεταφέρετε το έγγραφο στο ίδιο το διακριτικό, αλλά είναι πολύ απλό να μεταφέρετε τον κατακερματισμό του εγγράφου στο διακριτικό και να λάβετε ως αποτέλεσμα μια ηλεκτρονική ψηφιακή υπογραφή.



Συνιστούμε να διαβάσετε

Κορυφή