Στεγανογραφία LSB

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

Σήμερα θα προσπαθήσουμε να σκάψουμε λίγο πιο βαθιά και να δούμε τον αλγόριθμο LSB. Αν σας ενδιαφέρει, είστε ευπρόσδεκτοι κάτω από τη γάτα. (Κάτω από την περικοπή είναι κίνηση: περίπου ένα megabyte.)

Πρώτα απ 'όλα, είναι απαραίτητο να κάνουμε μια σύντομη εισαγωγή. Όλοι γνωρίζουν ότι ο σκοπός της κρυπτογραφίας είναι να καταστήσει αδύνατη την ανάγνωση μυστικών πληροφοριών. Φυσικά, η κρυπτογραφία έχει τις εφαρμογές της, αλλά υπάρχει μια άλλη προσέγγιση για την προστασία των δεδομένων. Δεν χρειάζεται να κρυπτογραφήσουμε τις πληροφορίες, αλλά προσποιούμαστε ότι δεν τις έχουμε. Γι' αυτό ακριβώς εφευρέθηκε η στεγανογραφία. Η Wikipedia μας διαβεβαιώνει ότι «η στεγανογραφία (από το ελληνικό στεγανοσ - κρυφό και το ελληνικό γράφω - γράφω, κυριολεκτικά «μυστική γραφή») είναι η επιστήμη της κρυφής μετάδοσης πληροφοριών κρατώντας μυστικό το ίδιο το γεγονός της μετάδοσης.

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

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

Τα δύο πρώτα byte της κεφαλίδας είναι η υπογραφή BM, μετά το μέγεθος αρχείου σε byte γράφεται με διπλή λέξη, τα επόμενα 4 byte δεσμεύονται και πρέπει να περιέχουν μηδενικά και τέλος, μια άλλη διπλή λέξη περιέχει τη μετατόπιση από την αρχή του αρχείο στα πραγματικά byte της εικόνας. Σε ένα αρχείο bmp 24-bit, κάθε pixel κωδικοποιείται με τρία byte BGR.

Τώρα ξέρουμε πώς να φτάσουμε στην εικόνα, το μόνο που μένει είναι να καταλάβουμε πώς μπορούμε να γράψουμε εκεί τις πληροφορίες που χρειαζόμαστε. Για αυτό θα χρειαστούμε τη μέθοδο LSB. Η ουσία της μεθόδου είναι η εξής: αντικαθιστούμε τα λιγότερο σημαντικά bit στα byte που είναι υπεύθυνα για την κωδικοποίηση χρώματος. Ας πούμε εάν το επόμενο byte του μυστικού μας μηνύματος είναι 11001011 και τα byte στην εικόνα είναι...11101100 01001110 01111100 0101100111..., τότε η κωδικοποίηση θα μοιάζει με αυτό. Θα χωρίσουμε το byte του μυστικού μηνύματος σε 4 μέρη δύο bit: 11, 00, 10, 11 και θα αντικαταστήσουμε τα bit χαμηλής τάξης της εικόνας με τα τμήματα που προκύπτουν: ...11101111 01001100 01111110 0101100111…. Μια τέτοια αντικατάσταση γενικά δεν είναι αισθητή στο ανθρώπινο μάτι. Επιπλέον, πολλές παλαιότερες συσκευές εξόδου δεν θα μπορούν καν να εμφανίσουν τέτοιες μικρές αλλαγές.

Είναι σαφές ότι μπορείτε να αλλάξετε όχι μόνο τα 2 λιγότερο σημαντικά bit, αλλά οποιονδήποτε αριθμό από αυτά. Υπάρχει το ακόλουθο μοτίβο: όσο περισσότερα bits αλλάζουμε, τόσο περισσότερες πληροφορίες μπορούμε να αποκρύψουμε και τόσο περισσότερες παρεμβολές θα προκαλέσει αυτό στην αρχική εικόνα. Για παράδειγμα, εδώ είναι δύο εικόνες:

Στεγανογραφία LSB
Στεγανογραφία LSB

Παρά τις προσπάθειές μου, δεν μπόρεσα να δω τη διαφορά μεταξύ τους, αλλά παρόλα αυτά, στη δεύτερη εικόνα, χρησιμοποιώντας την περιγραφόμενη μέθοδο, κρύβεται το ποίημα του Lewis Carroll «The Hunting of the Snark». Εάν έχετε διαβάσει μέχρι εδώ, τότε μάλλον ενδιαφέρεστε να μάθετε για την εφαρμογή. Είναι αρκετά απλό, αλλά θα σας προειδοποιήσω αμέσως ότι όλα γίνονται στους Δελφούς. Υπάρχουν δύο λόγοι για αυτό: 1. Νομίζω ότι οι Δελφοί είναι μια καλή γλώσσα. 2. Αυτό το πρόγραμμα γεννήθηκε στη διαδικασία προετοιμασίας ενός μαθήματος για τα βασικά της όρασης υπολογιστών και τα παιδιά στα οποία διδάσκω αυτό το μάθημα δεν γνωρίζουν ακόμη τίποτα άλλο εκτός από τους Δελφούς. Για όσους δεν είναι εξοικειωμένοι με τη σύνταξη, ένα πράγμα πρέπει να εξηγηθεί: shl x είναι μια μετατόπιση bit προς τα αριστερά κατά x, shr x είναι μια μετατόπιση bit προς τα δεξιά κατά x.

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

για i:=1 έως μήκος(str) do
    αρχίζουν
      l1:=byte(str[i]) shr 6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      στ.Θέση:=στ.Θέση-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      στ.Θέση:=στ.Θέση-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      στ.Θέση:=στ.Θέση-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      στ.Θέση:=στ.Θέση-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    τέλος?

κωδικός για ανάγνωση:

για το i:=1 έως το MsgSize do
    αρχίζουν
      f.ReadBuffer(tmp,1);
      l1:=tmp shl 6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      str:=str+char(l1+l2+l3+l4);
    τέλος?

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

Σας ευχαριστώ.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο