64 κρυπτογράφηση. Ρωσικό "μάγμα"

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

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

Αναγνώρισαν μόνο το τρέχον σύστημα κρυπτογράφησης 64-bit GSM ως ανασφαλές, αλλά ακόμα και τώρα κάνουν μόνο στροφές για να στραφούν σε πιο ασφαλείς αλγόριθμους. Αν και, όπως έχει δείξει η εμπειρία, δεν αποτελούν πανάκεια. Μάλιστα, παραβιάστηκε και ο καλύτερος αλγόριθμος ασφαλείας, το σύστημα 128-bit A5/3 (KASUMI), που χρησιμοποιείται σε δίκτυα 3G. Επιπλέον, το hack χρειάστηκε μόνο 2 ώρες.

Το χακάρισμα πραγματοποιήθηκε από καθηγητές από τα τμήματα μαθηματικών και υπολογιστών του Επιστημονικού Ινστιτούτου Weizmann στο Ισραήλ. Το έργο περιελάμβανε τους Orr Dunkelman, Nathan Keller και Adi Shamir, ο οποίος είναι γνωστός για τη συμμετοχή του στην ανάπτυξη του διάσημου συστήματος κρυπτογράφησης δημόσιου κλειδιού RSA (το γράμμα "S" στο όνομα του συστήματος κρυπτογράφησης είναι προς τιμήν του Shamir). Πραγματοποίησαν μια επίθεση με το λεγόμενο «συνδεδεμένο κλειδί». Την ίδια στιγμή, οι ερευνητές ονόμασαν την τεχνική τους επίθεση «σάντουιτς», επειδή αποτελείται από τρία μέρη, δύο από τα οποία βρίσκονται στο πάνω και κάτω μέρος και το τρίτο λεπτό είναι στη μέση.

Σύμφωνα με τους ερευνητές, χρησιμοποιώντας αυτή την τεχνική μπορούν να αποκτήσουν το πλήρες κλειδί Kasumi 128-bit χρησιμοποιώντας μόνο 4 συσχετισμένα κλειδιά, 226 μονάδες δεδομένων, 230 byte μνήμης και 232 μονάδες χρόνου. Όλες αυτές οι απαιτήσεις είναι τόσο μικροσκοπικές που μπόρεσαν να μιμηθούν με επιτυχία την επίθεση σε έναν υπολογιστή σε λιγότερο από δύο ώρες.

Την ίδια στιγμή, σύμφωνα με τον Karsten Nohl, τον καθηγητή πίσω από το πρόσφατο hack της κρυπτογράφησης 64-bit GSM, η νέα επίθεση είναι λιγότερο αποτελεσματική από την πρόσφατη εισβολή A5/1. Για να αποκτήσετε ένα μόνο κλειδί, η νέα μέθοδος απαιτεί τη συλλογή πολλών εκατομμυρίων γνωστών απλών κειμένων. Το απλό κείμενο μεταδίδεται περίπου κάθε δευτερόλεπτο, επομένως η παραβίαση της κρυπτογράφησης ενός συγκεκριμένου παρόχου επικοινωνιών μπορεί να απαιτεί χρονοβόρα συλλογή δεδομένων. Επιπλέον, σε έναν υπολογιστή, αυτή η μέθοδος θα πάρει 2 ώρες για να χακάρει μια συγκεκριμένη κλήση. Αν και, σύμφωνα με τον επιστήμονα, η χρήση ενός συμπλέγματος υπολογιστών μπορεί να μειώσει τον χρόνο που απαιτείται στο ελάχιστο.

Επιπλέον, σύμφωνα με τον Nole, τα hacks θα πρέπει να είναι μια υπενθύμιση ότι η κρυπτογράφηση A5/3, όπως και κάθε άλλος κρυπτογράφηση, πρέπει να αντικατασταθεί αμέσως. Ο Knowle ελπίζει ότι το hacking θα ληφθεί υπόψη κατά την αναβάθμιση του GSM.

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

Ιστορία

Πριν από το Blowfish, οι υπάρχοντες αλγόριθμοι ήταν είτε αποκλειστικοί είτε αναξιόπιστοι και μερικοί κρατούνταν μυστικοί (για παράδειγμα, Skipjack). Ο αλγόριθμος αναπτύχθηκε το 1993 από τον Bruce Schneier ως μια γρήγορη και δωρεάν εναλλακτική λύση στο παλαιού τύπου DES και στην αποκλειστική IDEA. Σύμφωνα με τον συγγραφέα, τα κριτήρια σχεδιασμού για το Blowfish ήταν:

  • ταχύτητα (η κρυπτογράφηση σε επεξεργαστές 32 bit διαρκεί 26 κύκλους).
  • απλότητα (λόγω της χρήσης απλών πράξεων που μειώνουν την πιθανότητα σφαλμάτων κατά την υλοποίηση του αλγορίθμου).
  • συμπαγές;
  • προσαρμόσιμη αντοχή.

Περιγραφή του αλγορίθμου

Επιλογές

  • μυστικό κλειδί K (32 έως 448 bit)
  • Κλειδιά κρυπτογράφησης 32 bit P1-P18
  • Πίνακες αντικατάστασης 32 bit S1-S4: S1 S1 .. S1 S2 S2 .. S2 S3 S3 .. S3 S4 S4 .. S4

Συνάρτηση F(x)

Αλγόριθμος κρυπτογράφησης για μπλοκ 64 bit με γνωστό πίνακα P και F(x)

Δίκτυο Feistel όταν είναι κρυπτογραφημένο

Αλγόριθμος Blowfish

Χωρίζεται σε 2 στάδια:

  1. Προπαρασκευαστική - δημιουργία κλειδιών κρυπτογράφησης με χρήση μυστικού κλειδιού.
    • Εκκίνηση πινάκων P και S χρησιμοποιώντας το μυστικό κλειδί K
      1. Αρχικοποιήστε το P1-P18 με μια σταθερή συμβολοσειρά που αποτελείται από τα δεκαεξαδικά ψηφία του mantissa του pi.
      2. Εκτελείται μια λειτουργία XOR στο P1 με τα πρώτα 32 bit του κλειδιού K, στο P2 με τα δεύτερα 32 bit και ούτω καθεξής.
        Εάν το κλειδί K είναι πιο κοντό, τότε εφαρμόζεται κυκλικά.
    • Κρυπτογράφηση κλειδιών και πίνακες αντικατάστασης
      1. Ο αλγόριθμος κρυπτογράφησης μπλοκ 64 bit, χρησιμοποιώντας τα αρχικοποιημένα κλειδιά P1-P18 και τον πίνακα αντικατάστασης S1-S4, κρυπτογραφεί τη μηδενική συμβολοσειρά 64 bit (0x00000000000000000). Το αποτέλεσμα γράφεται στο P1, P2.
      2. Τα P1 και P2 είναι κρυπτογραφημένα με αλλαγμένες τιμές κλειδιών και πίνακες αντικατάστασης. Το αποτέλεσμα γράφεται στα P3 και P4.
      3. Η κρυπτογράφηση συνεχίζεται έως ότου αλλάξουν όλα τα κλειδιά P1-P18 και οι πίνακες αντικατάστασης S1-S4.
  2. Κρυπτογράφηση κειμένου με τα ληφθέντα κλειδιά και F(x), με προκαταρκτική διαίρεση σε μπλοκ των 64 bit. Εάν δεν είναι δυνατός ο διαχωρισμός του αρχικού κειμένου ακριβώς σε μπλοκ 64-bit, χρησιμοποιούνται διάφοροι τρόποι κρυπτογράφησης για την κατασκευή ενός μηνύματος που αποτελείται από έναν ακέραιο αριθμό μπλοκ. Συνολική απαιτούμενη μνήμη 4168 byte: P1-P18: 18 μεταβλητές των 32 bit η καθεμία. S1-S4: 4x256 μεταβλητές των 32 bit.

Η αποκρυπτογράφηση γίνεται με τον ίδιο τρόπο, μόνο τα P1-P18 εφαρμόζονται με αντίστροφη σειρά.

Επιλογή της αρχικής τιμής του πίνακα P και του πίνακα αντικατάστασης

Δεν υπάρχει τίποτα ιδιαίτερο στα ψηφία του pi. Αυτή η επιλογή είναι να αρχικοποιήσετε μια ακολουθία που δεν σχετίζεται με τον αλγόριθμο που θα μπορούσε να αποθηκευτεί ως μέρος του αλγόριθμου ή να ανακτηθεί όπως απαιτείται (Pi (αριθμός)). Όπως επισημαίνει ο Schneier: "Οποιαδήποτε σειρά τυχαίων bits των ψηφίων του e, ένας πίνακας RAND ή τυχαία δημιουργημένα ψηφία θα κάνει."

Κρυπτογραφική δύναμη

  • ένα αδύναμο S-box (και το αδύναμο κλειδί που το δημιουργεί) σημαίνει ότι υπάρχουν i, j, N=(1,2,3,4) : SN[i]==SN[j]

Η κρυπτογραφική ισχύς εξαρτάται κυρίως από το F(x). Αυτό επεσήμανε ο Serge Vaudenay, μιλώντας για την παρουσία μιας μικρής κατηγορίας αδύναμων πλήκτρων (δημιουργώντας αδύναμα S-box): η πιθανότητα εμφάνισης ενός αδύναμου S-box είναι ίση με . Εξέτασε επίσης μια απλοποιημένη έκδοση του Blowfish, με τη γνωστή συνάρτηση F(x) και ένα αδύναμο πλήκτρο. Αυτή η επιλογή απαιτεί επιλεγμένα απλά κείμενα (t είναι ο αριθμός των γύρων και τα σύμβολα υποδεικνύουν τη λειτουργία λήψης του ακέραιου μέρους του αριθμού). Αυτή η επίθεση μπορεί να χρησιμοποιηθεί μόνο για τον αλγόριθμο με . Απαιτεί απλά κείμενα και για την επιλογή με γνωστό F(x) και τυχαίο κλειδί, απαιτούνται απλά κείμενα. Αλλά αυτή η επίθεση δεν είναι αποτελεσματική για το Blowfish με 16 γύρους.

Ο John Kelsey ανέπτυξε μια επίθεση που θα μπορούσε να σπάσει το Blowfish 3 επαναλήψεων. Βασίζεται στο γεγονός ότι οι λειτουργίες προσθήκης modulo και XOR δεν είναι ανταλλάξιμες.

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

Η κρυπτογραφική ισχύς μπορεί να ρυθμιστεί αλλάζοντας τον αριθμό των γύρων κρυπτογράφησης (αυξάνοντας το μήκος του πίνακα P) και τον αριθμό των S-boxes που χρησιμοποιούνται. Με τη μείωση των S-boxes που χρησιμοποιούνται, η πιθανότητα αδύναμων πλήκτρων αυξάνεται, αλλά η μνήμη που χρησιμοποιείται μειώνεται. Προσαρμόζοντας το Blowfish σε μια αρχιτεκτονική 64 bit, μπορείτε να αυξήσετε τον αριθμό και το μέγεθος των S-box (και επομένως τη μνήμη για τους πίνακες P και S), καθώς και να περιπλέκετε το F(x) και για έναν αλγόριθμο με μια τέτοια συνάρτηση F(x) οι παραπάνω επιθέσεις είναι αδύνατες.

Τροποποίηση F(x): ένα μπλοκ 64 bit παρέχεται στην είσοδο, το οποίο χωρίζεται σε οκτώ μπλοκ 8 bit (X1-X8). Το αποτέλεσμα υπολογίζεται χρησιμοποιώντας τον τύπο, όπου
Μέχρι σήμερα (Νοέμβριος 2008) δεν υπάρχουν επιθέσεις που να μπορούν να ολοκληρωθούν σε εύλογο χρονικό διάστημα. Οι επιτυχείς επιθέσεις είναι δυνατές μόνο λόγω σφαλμάτων εφαρμογής.

Παράδειγμα για το πώς λειτουργεί ο αλγόριθμος

Ένα παράδειγμα μιας ελεύθερα διανεμημένης έκδοσης του αλγορίθμου Blowfish.
Παράμετροι:Μέγεθος κλειδιού: 448 bitΜέγεθος μπλοκ: 64 bitΑριθμός γύρων: 16 τρόπος: ΕΚΤ

Εφαρμογές

  • κατακερματισμός κωδικού πρόσβασης
  • προστασία ηλεκτρονικού ταχυδρομείου και αρχείων
    • GnuPG (Ασφαλής αποθήκευση και μεταφορά)
  • σε γραμμές επικοινωνίας: πακέτο ElGamal (μη κατοχυρωμένο με δίπλωμα ευρεσιτεχνίας) ή RSA (η πατέντα έληξε το 2000) και Blowfish αντί για IDEA
    • σε δρομολογητή Intel Express 8100 με κλειδί 144 bit
  • διασφάλιση της ασφάλειας στα πρωτόκολλα του επιπέδου δικτύου και μεταφοράς
    • PuTTY (επίπεδο δικτύου)
    • SSH (επίπεδο μεταφοράς)
    • OpenVPN (δημιουργία κρυπτογραφημένων καναλιών)

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

Η ταχύτητα κρυπτογράφησης του αλγορίθμου εξαρτάται σε μεγάλο βαθμό από την τεχνολογία που χρησιμοποιείται και το σύστημα εντολών. Σε διαφορετικές αρχιτεκτονικές, ένας αλγόριθμος μπορεί να είναι σημαντικά ταχύτερος από τους ανταγωνιστές του σε ταχύτητα, ενώ σε έναν άλλο η κατάσταση μπορεί να είναι ίση ή ακόμη και να αλλάξει προς την αντίθετη κατεύθυνση. Επιπλέον, η υλοποίηση του λογισμικού εξαρτάται σημαντικά από τον μεταγλωττιστή που χρησιμοποιείται. Η χρήση κώδικα συναρμολόγησης μπορεί να βελτιώσει την ταχύτητα κρυπτογράφησης. Η ταχύτητα κρυπτογράφησης επηρεάζεται από τον χρόνο εκτέλεσης των λειτουργιών mov, add, xor και ο χρόνος εκτέλεσης των λειτουργιών αυξάνεται κατά την πρόσβαση στη μνήμη RAM (για επεξεργαστές της σειράς Pentium κατά περίπου 5 φορές). Το Blowfish δείχνει καλύτερα αποτελέσματα όταν χρησιμοποιεί μια προσωρινή μνήμη για την αποθήκευση όλων των δευτερευόντων κλειδιών. Σε αυτή την περίπτωση, είναι μπροστά από τους αλγόριθμους DES και IDEA. Η καθυστέρηση του IDEA επηρεάζεται από τη λειτουργία πολλαπλασιασμού modulo. Η ταχύτητα του Twofish μπορεί να είναι κοντά σε αξία με το Blowfish λόγω του μεγαλύτερου κρυπτογραφημένου μπλοκ.

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

Δείτε επίσης

Εδαφος διά παιγνίδι γκολφ

  • Serge Vaudenay.On the ασθενή Keys of Blowfish (Αγγλικά)
  • Dieter Schmidt.Kaweichel, μια επέκταση του Blowfish για αρχιτεκτονικές 64-bit (Αγγλικά)

Οι «διαστροφές μας με την υποκατάσταση εισαγωγής» (ήταν πολύ καιρό πριν, ο Evgeniy εργάζεται για τη διδακτορική του διατριβή και όλοι περιμένουμε την ώρα που θα μπορέσουμε να υπογράψουμε τα άρθρα του ως «καθηγητής». 😉 - Εκδ. ), γνωρίσαμε λεπτομερώς τον αλγόριθμο κρυπτογράφησης "Grasshopper", ο οποίος ορίζεται στο GOST 34.12-2015. Εκτός από αυτόν τον αλγόριθμο, ο GOST περιγράφει έναν άλλο, με κρυπτογραφημένο μήκος μπλοκ 64 bit, ο οποίος ονομάζεται "Magma".

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

Όπως ήδη αναφέρθηκε, το μήκος του κρυπτογραφημένου μπλοκ στον αλγόριθμο Magma είναι 64 bit. Το μήκος του κλειδιού κρυπτογράφησης είναι 256 bit.

ΠΡΟΕΙΔΟΠΟΙΗΣΗ

Κατά την ανάγνωση του GOST, λάβετε υπόψη ότι σε όλες τις σειρές 8 byte των ακολουθιών δοκιμής, το μηδενικό byte βρίσκεται στο τέλος του πίνακα και το έβδομο, αντίστοιχα, στην αρχή (αν διαβάσετε προσεκτικά τα άρθρα σχετικά με το "Stribog" και "Grasshopper", τότε αυτό το χαρακτηριστικό των προτύπων κρυπτογράφησης θα σας βοηθήσει να είστε εξοικειωμένοι).

Λίγη θεωρία

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


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



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

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



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


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

Βασικές λειτουργίες του προτύπου

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

// Το μέγεθος του μπλοκ είναι 4 byte (ή 32 bit) #define BLOCK_SIZE 4 ... // Ορίστε τον τύπο vect ως πίνακα 4 byte typedef uint8_t vect;

Προσθήκη δύο δυαδικών διανυσμάτων modulo 2

Κάθε byte του πρώτου διανύσματος αναμιγνύεται με το αντίστοιχο byte του δεύτερου διανύσματος και το αποτέλεσμα γράφεται στο τρίτο διάνυσμα (εξόδου):

Στατικό κενό GOST_Magma_Add(const uint8_t *a, const uint8_t *b, uint8_t *c) ( int i; for (i = 0; i< BLOCK_SIZE; i++) c[i] = a[i]^b[i]; }

Προσθήκη δύο δυαδικών διανυσμάτων modulo 32

Αυτή η συνάρτηση είναι παρόμοια με τη συνάρτηση που ονομάζεται "προσθήκη στο modulo 2 του υπολειμματικού δακτυλίου στην ισχύ του n" από τον αλγόριθμο Stribog, με τη διαφορά ότι το n στην περίπτωσή μας θα είναι ίσο με 32 και όχι 512, όπως στο πρότυπο Stribog. Τα δύο αρχικά διανύσματα 4 byte αντιπροσωπεύονται ως δύο αριθμοί 32 bit, στη συνέχεια προστίθενται, η υπερχείλιση, εάν υπάρχει, απορρίπτεται:

Στατικό κενό GOST_Magma_Add_32(const uint8_t *a, const uint8_t *b, uint8_t *c) (int i; ανυπόγραφο int εσωτερικό = 0; για (i = 3; i >= 0; i--) ( εσωτερικό = a[i] + b[i] + (εσωτερική >> 8 c[i] = εσωτερική & 0xff;

Μη γραμμικός δις μετασχηματισμός (μετασχηματισμός Τ)

Σε αντίθεση με τους αλγόριθμους Stribog και Grasshopper (παρεμπιπτόντως, αυτός ο μετασχηματισμός ονομάζεται S-transform εκεί), ένας διαφορετικός πίνακας μετάθεσης χρησιμοποιείται εδώ:

Στατικό ανυπόγραφο char Pi= ( (1,7,14,13,0,5,8,3,4,15,10,6,9,12,11,2), (8,14,2,5,6 ,9,1,12,15,4,11,0,13,10,3,7), (5,13,15,6,9,2,12,10,11,7,8,1,4 ,3,14,0), (7,15,5,10,8,1,6,13,0,9,3,14,11,4,2,12), (12,8,2,1 ,13,4,15,6,7,0,10,5,3,14,9,11), (11,3,5,8,2,15,10,13,14,1,7,4 ,12,9,6,0), (6,8,2,3,9,10,5,12,1,14,4,7,11,13,0,15), (12,4,6 ,2,10,5,11,9,14,8,13,7,0,3,15,1) );

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

Ο κώδικας για την ίδια τη συνάρτηση μετατροπής Τ είναι ο εξής:

Στατικό κενό GOST_Magma_T(const uint8_t *in_data, uint8_t *out_data) ( uint8_t first_part_byte, sec_part_byte; int i; for (i = 0; i< 4; i++) { // Извлекаем первую 4-битную часть байта first_part_byte = (in_data[i] & 0xf0) >> 4;<< 4) | sec_part_byte; } }

// Εξαγωγή του δεύτερου τμήματος 4-bit του byte sec_part_byte = (in_data[i] & 0x0f);

// Εκτελέστε την αντικατάσταση σύμφωνα με τον πίνακα αντικατάστασης first_part_byte = Pi;

sec_part_byte = Pi;



// "Κόλλα" και τα δύο μέρη 4-bit πίσω σε ένα byte out_data[i] = (first_part_byte

Χρησιμοποιώντας το Windows Equalizer