Verstecke dich ohne dich zu verstecken. Noch einmal ĂŒber LSB-Steganographie, Chi-Quadrat und ... SingularitĂ€t?

Heute werden wir wieder das alte Nest aufschlagen und darĂŒber sprechen, wie man mit der Katze ein paar Teile im Bild versteckt, verschiedene verfĂŒgbare Werkzeuge ansieht und die beliebtesten Angriffe analysiert. Und es scheint, was hat die SingularitĂ€t damit zu tun?

Wie sie sagen, wenn Sie etwas herausfinden wollen, dann schreiben Sie einen Artikel darĂŒber auf Habr! (Achtung, viel Text und Bilder)



Steganographie (wörtlich aus der griechischen "Kryptographie") ist die Wissenschaft der Übertragung versteckter Daten (Stego-Nachrichten) in andere offene Daten (Stegocontainer), wĂ€hrend die Tatsache der DatenĂŒbertragung verborgen bleibt. Seien Sie nicht beunruhigt, in der Tat ist nicht alles so kompliziert.

Wo im Bild können Sie die Nachricht verstecken, damit niemand es bemerkt?

Und es gibt nur zwei Stellen: Metadaten und das Bild selbst. Letzteres ist ganz einfach, geben Sie einfach "exif" bei Google ein. Beginnen wir also gleich mit dem zweiten.

Am wenigsten bedeutendes StĂŒck


Das beliebteste Farbmodell ist RGB, bei dem die Farbe in Form von drei Komponenten dargestellt wird: Rot, GrĂŒn und Blau . Jede Komponente wird in der klassischen Version mit 8 Bit codiert, dh sie kann einen Wert von 0 annehmen
Hier verbirgt sich das niedrigstwertige Bit. Es ist wichtig zu verstehen, dass eine solche RGB-Farbe drei solcher Bits ausmacht.

Um sie klarer darzustellen, werden wir einige kleine Manipulationen vornehmen.

Machen Sie wie versprochen ein Foto von einer Katze im PNG-Format.



Wir teilen es in drei KanĂ€le auf und nehmen in jedem Kanal das niedrigstwertige Bit. Erstellen Sie drei neue Bilder, wobei jedes Pixel fĂŒr NZB steht. Null - das Pixel ist weiß, die Einheit ist jeweils schwarz.

Wir bekommen das.

Roter Kanal


GrĂŒner Kanal


Blauer Kanal


In der Regel befindet sich das Bild jedoch in der "zusammengesetzten Form". Um die NZB von drei Komponenten in einem Bild darzustellen, reicht es aus, die Komponente in einem Pixel zu ersetzen, in dem die NZB Eins ist, sie durch 255 zu ersetzen und sie ansonsten durch 0 zu ersetzen.

Dann stellt sich heraus, dass

Kann ich hier etwas einfĂŒgen?

Aber nicht weniger bedeutsam


Stellen Sie sich vor, alles, was wir auf dem letzten Bild gesehen haben, gehört uns und wir haben das Recht, alles damit zu tun. Dann nehmen wir es als einen Strom von Bits, von wo aus wir lesen und wo wir schreiben können.

Wir nehmen die Daten, die wir in das Bild einstreuen möchten, prÀsentieren sie in Form von Bits und schreiben sie anstelle der vorhandenen auf.

Um diese Daten zu extrahieren, lesen wir die NZB als Bitstrom und bringen sie in die gewĂŒnschte Form. Um herauszufinden, wie viele Bits gezĂ€hlt werden mĂŒssen, wird in der Regel die NachrichtengrĂ¶ĂŸe an den Anfang geschrieben. Dies sind jedoch Implementierungsdetails.

Es ist zu beachten, dass in etwa 50% der FĂ€lle das Bit, das wir schreiben möchten, und das Bit im Bild zusammenfallen und wir nichts Ă€ndern mĂŒssen.

Das ist alles, die Methode endet hier.

Warum funktioniert es?


Schauen Sie sich die Bilder unten an.

Dies ist ein leerer Stegocontainer:



Und das ist zu 95% voll:



Sehen Sie den Unterschied? Aber sie ist es. Warum so?

Schauen wir uns zwei Farben an: (0, 0, 0) und (1, 1, 1), dh Farben, die sich nur durch die NZB in jeder Komponente unterscheiden.



Geringe Pixelunterschiede auf den ersten, zweiten und dritten Blick sind nicht erkennbar. Tatsache ist, dass unser Auge ungefÀhr 10 Millionen Farben unterscheiden kann und das Gehirn nur ungefÀhr 150. Das RGB-Modell enthÀlt auch 16.777.216 Farben. Sie können versuchen, sie alle hier zu unterscheiden .

Über die Befehlszeile


Es sind nicht viele Open Source-Befehlszeilentools verfĂŒgbar, die die LSB-Steganographie darstellen.

Die beliebtesten finden Sie in der folgenden Tabelle.

TulsaDateitypenBeschreibungVerschleierungExtraktion
openstegoPNGKann verwendet werden
nicht nur zum verstecken
Daten aber auch fĂŒr Wasser
Zeichen. Verwendet
RandomLSB - erweitert
LSB-Algorithmus mit Aufzeichnung
zumindest zufÀllig signifikant
Bit UnterstĂŒtzt die VerschlĂŒsselung.
Es hat auch eine GUI.
openstego einbetten
-mf secret.txt -cf
cover.png -p
Passwort -sf
stego.png
openstego Extrakt
-sf openstego.png
-p abcd -xf
output.txt
SteganoPNGEs funktioniert nicht nur mit
klassisches LSB. Hat
flexible Konfiguration. Mai
verwendet werden als
Python-Modul. Am meisten
attraktiv
(Was mich betrifft).
stegano-lsb
hide --input cover.jpg
-f secret.txt -e
Utf-8 - Ausgabe
stego.png
stegano-lsb enthĂŒllen
-i stego.png -e UTF-8
-o output.txt
CloackedpixelPNG, jpgEinfache Tulsa.
Schlecht umgehen
tolle Nachricht.
(Genauer gesagt gar nichts)
UnterstĂŒtzt die VerschlĂŒsselung.
Cloackedpixel verstecken
cover.jpg secret.txt
Passwort
Cloackedpixel-Extrakt
cover.jpg-stego.png
output.txt Passwort
LSBStegPNG, BMPEin kleines Programm auf
Python mit lesbarem Code.
LSBSteg-Codierung
-i cover.png -o
stego.png -f
secret.txt
LSBSteg-Dekodierung
-i stego.png -o
output.txt

Wo ist die Katze?


Und der erste in der Liste der Angriffe auf die LSB-Steganographie ist ein visueller Angriff. Klingt komisch, nicht wahr? Immerhin hat sich die Katze mit dem Geheimnis auf den ersten Blick nicht als gefĂŒllter Stegocontainer verraten. Hmmm ... Sie mĂŒssen nur wissen, wo Sie suchen mĂŒssen. Es ist leicht zu erraten, dass nur die NZB unsere Aufmerksamkeit verdient.

FĂŒr einen gefĂŒllten Stegocontainer sieht das Bild mit NZB folgendermaßen aus:



Glaubst du nicht? Hier haben Sie NZB von allen drei KanÀlen getrennt:

Roter Kanal


GrĂŒner Kanal


Blauer Kanal


Dies ist eine "Zeichnung", die speziell zum Ausblenden der Nachricht in der NZB dient. Auf den ersten Blick scheint dies ein einfaches GerĂ€usch zu sein. Aber wenn man bedenkt, ist die Struktur sichtbar. Hier sehen Sie, dass der Stegocontainer voll ist. Wenn wir eine Nachricht mit 30% der KapazitĂ€t einer armen Katze aufnehmen wĂŒrden, wĂŒrden wir folgendes Bild erhalten:

BehÀlter


Sein NZB:



~ 70% der Katze bleiben unverÀndert.

Hier lohnt es sich, einen kleinen Exkurs zu machen und ĂŒber GrĂ¶ĂŸen zu sprechen. Was ist eine 30% Katze? Die GrĂ¶ĂŸe der Katze betrĂ€gt 603x433 Pixel. 30% dieser GrĂ¶ĂŸe sind 78459 Pixel. Jedes Pixel enthĂ€lt 3 Informationsbits. Insgesamt 78459 3 = 235377 Bits oder etwas weniger als 30 Kilobyte passen in 30% der Dichtung. Und in die ganze Katze passen etwa 100 Kilobyte. Solche Dinge.

Aber wir sind aus einem bestimmten Grund fĂŒr Sie da. Wie kann man dann die Augen tĂ€uschen?
Erster Gedanke: Stecke die Nachricht in den LĂ€rm. Aber es war nicht da. Als nĂ€chstes folgt ein Fragment des gefĂŒllten Stegocontainers und seines LSB.



Mit ein wenig Aufwand können wir immer noch eine vertraute Struktur erkennen. Verlieren Sie nicht die Hoffnung, meine Herren!

Hee hee hee


Viele Dinge brechen die Statistik, wissen Sie.

Wenn wir etwas im Bild Ă€ndern, Ă€ndern wir seine statistischen Eigenschaften. Es reicht fĂŒr den Analysten aus, einen Weg zu finden, um diese Änderungen zu beheben.

Der gute alte Chi-Platz wurde von Andreas Wesfield und Andreas Pfitzmann von der UniversitĂ€t Dresden in ihrer Arbeit „Attacks on Steganographic Systems“ ins Leben gerufen, die hier zu finden ist.

Im Folgenden werden wir ĂŒber Angriffe innerhalb derselben Farbebene oder im Kontext von RGB ĂŒber Angriffe auf einen Kanal sprechen. Die Ergebnisse jedes Angriffs können auf den Durchschnitt reduziert werden und das Ergebnis fĂŒr das „zusammengesetzte“ Bild erhalten.

Der Chi-Quadrat-Angriff basiert also auf der Annahme, dass die Wahrscheinlichkeit des gleichzeitigen Auftretens benachbarter (durch das niedrigstwertiges Bit unterschiedlicher) Farben (Wertepaare) in einem leeren Stegocontainer Ă€ußerst gering ist. Es ist wirklich so, man kann es glauben. Mit anderen Worten, die Anzahl der Pixel zweier benachbarter Farben unterscheidet sich fĂŒr einen leeren BehĂ€lter erheblich. Wir mĂŒssen lediglich die Anzahl der Pixel jeder Farbe berechnen und einige Formeln anwenden. TatsĂ€chlich ist dies eine einfache Aufgabe, um eine Hypothese unter Verwendung des Chi-Quadrat-Tests zu testen.

Ein bisschen Mathe?

Sei h ein Array an der i-ten Stelle, das die Anzahl der Pixel der i-ten Farbe in dem untersuchten Bild enthÀlt.

Dann:

  1. Gemessene Farbfrequenz i = 2 k ::

    n k = h [ 2 k ] , k i n [ 0 , 127 ] ;  


  2. Theoretisch erwartete Farbfrequenz i = 2 k ::

    n ≀ k = f r a c h [ 2 k ] + h [ 2 k + 1 ] 2 , k i n [ 0 , 127 ] ;   




UPD: Eine kleine ErklÀrung zu den obigen Formeln
Viele werden eine Frage haben: Warum nehmen wir einen solchen Index? Warum genau 2k?
Sie mĂŒssen bedenken, dass wir mit benachbarten Farben arbeiten, dh mit Farben (Zahlen), die sich nur im niedrigstwertigen Bit unterscheiden. Sie gehen paarweise nacheinander:

[0(00),1(01)] [2(10),3(11)] und usw.



Wenn die Anzahl der Pixel in Farbe 2k und 2k + 1 sehr unterschiedlich ist, ist die gemessene Frequenz und theoretisch erwartet unterschiedlich, was fĂŒr einen leeren Stegocontainer normal ist.


Wenn Sie dies in Python ĂŒbersetzen, erhalten Sie ungefĂ€hr Folgendes:

for k in range(0, len(histogram) // 2): expected.append(((histogram[2 * k] + histogram[2 * k + 1]) / 2)) observed.append(histogram[2 * k]) 

Wobei das Histogramm die Anzahl der Pixel der Farbe i im Bild ist, i i n [ 0 , 255 ] 

Das Chi-Quadrat-Kriterium fĂŒr die Anzahl der Freiheitsgrade k-1 wird wie folgt berechnet (k ist die Anzahl verschiedener Farben, d. H. 256):

 chi2k−1= sumki=1 frac(nk−n∗k)2n∗k;



Und schließlich ist P die Wahrscheinlichkeit, dass die Verteilungen ni und n∗i Unter diesen Bedingungen sind sie gleich (die Wahrscheinlichkeit, dass wir einen gefĂŒllten Stegocontainer haben). Sie wird durch Integration der GlĂ€ttungsfunktion berechnet:

P=1− frac12 frack−12 Gamma( frack−12) int chi2k−10e− fracx2x frack−12−1dx;



Am effektivsten ist es, ein Chi-Quadrat nicht auf das gesamte Bild anzuwenden, sondern nur auf seine Teile, beispielsweise auf die Linien. Wenn die berechnete Wahrscheinlichkeit fĂŒr die Linie grĂ¶ĂŸer als 0,5 ist, fĂŒllen Sie die Linie im Originalbild mit Rot. Wenn weniger, dann grĂŒn. Bei einer Katze mit 30% FĂŒlle sieht das Bild wie folgt aus:



Ganz richtig, nicht wahr?

Nun, wir haben einen mathematisch fundierten Angriff, Sie können die Mathematik nicht tÀuschen! Oder ... ??

Mische Tanz


Die Idee ist ganz einfach: Schreiben Sie die Bits nicht in der richtigen Reihenfolge, sondern an zufĂ€lligen Stellen. Dazu mĂŒssen Sie das PRSP nehmen und so konfigurieren, dass es denselben zufĂ€lligen Stream mit derselben Seite (auch als Passwort bezeichnet) ausgibt. Ohne Kenntnis des Passworts können wir das PRNG nicht konfigurieren und die Pixel finden, in denen die Nachricht versteckt ist. Wir werden es an einer Katze testen.

KĂ€tzchen (32% Abschluss):



Sein LSB:



Das Bild sieht laut aus, ist aber fĂŒr einen unerfahrenen Analysten nicht verdĂ€chtig. Was sagt Chi-Quadrat?

Was sagt Chi-Quadrat?


Es scheint, der schwarze Hut hat gewonnen !? Egal wie ...

RegelmĂ€ĂŸigkeit-SingularitĂ€t


Eine weitere statistische Methode war 2001 Jessica Friedrich, Miroslav Golyan und Andreas Pfitzman. Es wurde als RS-Methode bezeichnet. Der Originalartikel kann hier genommen werden.

Das Verfahren enthÀlt mehrere vorbereitende Schritte.

Das Bild ist in Gruppen von n Pixeln unterteilt. Zum Beispiel 4 aufeinanderfolgende Pixel in einer Reihe. Solche Gruppen enthalten in der Regel benachbarte Pixel.
FĂŒr unsere Katze mit sequentieller FĂŒllung im roten Kanal sind die ersten fĂŒnf Gruppen:

  • [78, 78, 79, 78]
  • [78, 78, 78, 78]
  • [78, 79, 78, 79]
  • [79, 76, 79, 76]
  • [76, 76, 76, 77]

(Alle Messungen sind in der klassischen Version von RGB)

Dann definieren wir die sogenannte Diskriminanzfunktion oder GlĂ€ttungsfunktion, die jede Pixelgruppe einer reellen Zahl zuordnet. Der Zweck dieser Funktion besteht darin, die GlĂ€tte oder "RegelmĂ€ĂŸigkeit" der Pixelgruppe G zu erfassen. Je lauter die Pixelgruppe ist G=(x1,...,xn) desto wichtiger wird die Diskriminanzfunktion sein. Am hĂ€ufigsten wird eine "Variation" einer Gruppe von Pixeln gewĂ€hlt, oder einfacher die Summe der Unterschiede benachbarter Pixel in einer Gruppe. Es können aber auch statistische Annahmen ĂŒber das Bild berĂŒcksichtigt werden.

f(x1,x2,...,xn)= sumn−1i=1|xi+1−xi|



Die Werte der GlĂ€ttungsfunktion fĂŒr eine Gruppe von Pixeln aus unserem Beispiel:

  • f (78, 78, 79, 78) = 2
  • f (78, 78, 78, 78) = 0
  • f (78, 79, 78, 79) = 3
  • f (79, 76, 79, 76) = 9
  • f (76, 76, 76, 77) = 1

Als nÀchstes wird die Klasse der Flip-Funktionen von einem Pixel bestimmt.

Sie mĂŒssen einige Eigenschaften haben.

1. ~~~ \ forall x \ in P: ~ F (F (x)) = x, ~~ P = \ {0, ~ 255 \};


2.   F1:0 leftrightarrow1, 2 leftrightarrow3, ...,254 leftrightarrow255;


3    forallx inP: F−1(x)=F1(x+1)−1;



Wo F - jede Funktion aus einer Klasse, F1 Ist eine direkte Flip-Funktion und F−1 - umkehren. Außerdem wird ĂŒblicherweise die identische Flip-Funktion bezeichnet F0 das Ă€ndert das Pixel nicht.

Die Python-Flip-Funktionen könnten ungefĂ€hr so ​​aussehen:

 def flip(val): if val & 1: return val - 1 return val + 1 def invert_flip(val): if val & 1: return val + 1 return val - 1 def null_flip(val): return val 

FĂŒr jede Pixelgruppe wenden wir eine der Flip-Funktionen an und bestimmen basierend auf dem Wert der Diskriminanzfunktion vor und nach dem Flip den Typ der Pixelgruppe: normal (regelmĂ€ĂŸig), einzeln / ungewöhnlich (singulĂ€r) und unbrauchbar unbrauchbar. Da der letztere Typ nicht weiter verwendet wird, wurde die Methode nach den ersten Buchstaben der SchlĂŒsseltypen benannt. Das ist das ganze Geheimnis des Namens, die SingularitĂ€t hat nichts damit zu tun :)



Möglicherweise möchten wir unterschiedliche Pixel auf verschiedene Pixel anwenden. Dazu definieren wir eine Maske M mit n Werten von -1, 0 oder 1.

FM(G)=(FM(1)(x1),FM(2)(x2),...,FM(n)(xn))



Die Maske fĂŒr unser Beispiel sei klassisch - [1, 0, 0, 1]. Es wurde experimentell festgestellt, dass symmetrische Masken, die nicht enthalten F−1 . Ebenfalls erfolgreiche Optionen wĂ€ren: [0, 1, 0, 1], [0, 1, 1, 0], [1, 0, 1, 0]. Wir wenden das Spiegeln fĂŒr die Gruppen aus dem Beispiel an, berechnen den GlĂ€ttungswert und bestimmen den Typ der Pixelgruppe:

  • Fm (78, 78, 79, 78) = [79, 78, 79, 79];
    f (79, 78, 79, 79) = 2 = 2 = f (78, 78, 79, 78)
    Nicht verwendbare Gruppe

  • Fm (78, 78, 78, 78) = [79, 78, 78, 79];
    f (79, 78, 78, 79) = 2> 0 = f (78, 78, 78, 78)
    RegelmĂ€ĂŸige Gruppe

  • Fm (78, 79, 78, 79) = [79, 79, 78, 78];
    f (79, 79, 78, 78) = 1 <3 = f (78, 79, 78, 79) SingulÀre Gruppe

  • Fm (79, 76, 79, 76) = [78, 76, 79, 77];
    f (78, 76, 79, 77) = 7 <9 = f (79, 76, 79, 76) SingulÀre Gruppe

  • Fm (76, 76, 76, 77) = [77, 76, 76, 76];
    f (77, 76, 76, 76) = 1 = 1 = f (76, 76, 76, 77)
    Nicht verwendbare Gruppe


Wir bezeichnen die Anzahl der regulĂ€ren Gruppen fĂŒr die Maske M als RM (in Prozent aller Gruppen) und SM fĂŒr einzelne Gruppen.

Dann RM+SM leq1 und R−M+S−M leq1 fĂŒr eine negative Maske (alle Maskenkomponenten werden mit -1 multipliziert), weil RM+SM+UM=1 , dabei UM kann leer sein. Ähnliches gilt fĂŒr eine negative Maske.

Die wichtigste statistische Hypothese ist, dass in einem typischen Bild der erwartete Wert RM gleich R−M und das gleiche gilt fĂŒr SM und S−M . Dies wird durch experimentelle Daten und einige TĂ€nze mit einem Tamburin um die letzte Eigenschaft der Flip-Funktion bewiesen.

RM congSM    R−M congS−M



Schauen wir uns unser kleines Beispiel an. Angesichts der geringen StichprobengrĂ¶ĂŸe können wir diese Hypothese möglicherweise nicht bestĂ€tigen. Mal sehen, was mit der invertierten Maske passiert: [-1, 0, 0, -1].

  • F_M (78, 78, 79, 78) = [77, 78, 79, 77];
    f (77, 78, 79, 77) = 4> 2 = f (77, 78, 79, 77)
    RegelmĂ€ĂŸige Gruppe

  • F_M (78, 78, 78, 78) = [77, 78, 78, 77];
    f (77, 78, 78, 77) = 2> 0 = f (78, 78, 78, 78)
    RegelmĂ€ĂŸige Gruppe

  • F_M (78, 79, 78, 79) = [77, 79, 78, 80];
    f (77, 79, 78, 80) = 5> 3 = f (78, 79, 78, 79)
    RegelmĂ€ĂŸige Gruppe

  • F_M (79, 76, 79, 76) = [80, 76, 79, 75];
    f (80, 76, 79, 75) = 11> 9 = f (79, 76, 79, 76)
    RegelmĂ€ĂŸige Gruppe

  • F_M (76, 76, 76, 77) = [75, 76, 76, 78];
    f (75, 76, 76, 78) = 3> 1 = f (76, 76, 76, 77)
    RegelmĂ€ĂŸige Gruppe


Nun, alles ist offensichtlich.

Allerdings ist der Unterschied zwischen RM und SM neigen zu Null, wenn die LĂ€nge m der eingebetteten Nachricht zunimmt und wir das bekommen RM congSM .

Es ist lustig, dass die Randomisierung der LSB-Ebene den gegenteiligen Effekt hat R−M und S−M . Ihre Differenz nimmt mit der LĂ€nge m der eingebetteten Nachricht zu. Eine ErklĂ€rung dieses PhĂ€nomens finden Sie im Originalartikel.

Hier ist der Zeitplan RM , SM , R−M und S−M AbhĂ€ngig von der Anzahl der Pixel mit invertierten LSBs wird es als RS-Diagramm bezeichnet. Die x-Achse ist der Prozentsatz der Pixel mit invertierten LSBs, die y-Achse ist die relative Anzahl der regulĂ€ren und singulĂ€ren Gruppen mit den Masken M und -M. M=[0 1 1 0] .



Die RS-Steganalyse besteht im Wesentlichen darin, die vier Kurven des RS-Diagramms auszuwerten und ihren Schnittpunkt mithilfe von Extrapolation zu berechnen. Angenommen, wir haben einen Stegocontainer mit einer Nachricht unbekannter LĂ€nge p (als Prozentsatz der Pixel), die in die unteren Bits zufĂ€llig ausgewĂ€hlter Pixel eingebettet ist (d. H. Unter Verwendung von RandomLSB). Unsere ersten Messungen der Anzahl der Gruppen R und S entsprechen Punkten RM(p/2) , SM(p/2) , R−M(p/2) und S−M(p/2) . Wir nehmen Punkte von genau der halben LĂ€nge der Nachricht, da die Nachricht ein zufĂ€lliger Bitstrom ist und im Durchschnitt, wie bereits erwĂ€hnt, nur die HĂ€lfte der Pixel durch Einbetten der Nachricht geĂ€ndert wird.

Wenn wir das LSB aller Pixel im Bild invertieren und die Anzahl der R- und S-Gruppen berechnen, erhalten wir vier Punkte RM(1−p/2) , SM(1−p/2) , R−M(1−p/2) und S−M(1−p/2) . Da diese beiden Punkte von der spezifischen Randomisierung des LSB abhĂ€ngen, mĂŒssen wir diesen Vorgang viele Male wiederholen und bewerten RM(1/2) und SM(1/2) aus statistischen Stichproben.

Wir können bedingt Linien durch Punkte ziehen R−M(p/2) , R−M(1−p/2) und S−M(p/2) , S−M(1−p/2) .

Punkte RM(p/2) , RM(1/2) , RM(1−p/2) und SM(p/2) , SM(1/2) , SM(1−p/2) Definieren Sie zwei Parabeln. Jede Parabel und die entsprechende Linie schneiden sich links. Das arithmetische Mittel der x-Koordinaten beider Schnittpunkte ermöglicht es uns, die unbekannte NachrichtenlĂ€nge p abzuschĂ€tzen.

Um eine lange statistische SchĂ€tzung der Mittelpunkte RM (1/2) und SM (1/2) zu vermeiden, können einige weitere Überlegungen angestellt werden:

  1. Kurvenschnittpunkt RM und R−M hat die gleiche x-Koordinate wie der Schnittpunkt fĂŒr die Kurven SM und S−M . Dies ist im Wesentlichen eine strengere Version unserer statistischen Hypothese. (siehe oben)
  2. Die RM- und SM-Kurven schneiden sich bei m = 50% oder RM(1/2)=SM(1/2) .

Diese beiden Annahmen liefern eine einfache Formel fĂŒr die LĂ€nge der geheimen Nachricht p. Nachdem die x-Achse so skaliert wurde, dass p / 2 zu 0 und 1 - p / 2 zu 1 wird, ist die x-Koordinate des Schnittpunkts die Wurzel der folgenden quadratischen Gleichung



Dann kann die NachrichtenlÀnge durch die Formel berechnet werden:

p= fracxx− frac12



Hier betritt unsere Katze die Szene. (Ist es nicht Zeit, ihm einen Namen zu geben?)

Also haben wir:

  • RegelmĂ€ĂŸige RM-Gruppen (p / 2): 23121 Stk.
  • SingulĂ€re SM-Gruppen (p / 2): 14124 Stk.
  • RegelmĂ€ĂŸige Gruppen mit umgekehrter Maske RM (p / 2): 37191 Stk.
  • Einzelgruppen mit umgekehrter Maske SM (p / 2): 8440 Stk.
  • RegelmĂ€ĂŸige Gruppen mit invertiertem LSB RM (1-p / 2): 20298 Stk.
  • Einzelgruppen mit invertiertem LSB SM (1-p / 2): 16206 Stk.
  • RegelmĂ€ĂŸige Gruppen mit invertiertem LSB und invertierter Maske RM (1-p / 2): 40603 Stk.
  • Einzelne Gruppen mit invertiertem LSB und mit invertierter Maske SM (1-p / 2): 6947 Stk.

(Wenn Sie viel Freizeit haben, können Sie diese selbst berechnen, aber ich schlage vor, Sie glauben meinen Berechnungen.)

Auf der Tagesordnung haben wir eine bloße Mathematik gelassen. Erinnern Sie sich noch daran, wie man quadratische Gleichungen löst?

d0=8997


d−0=$2875


d1=4092


d−1=33656



Wenn wir alle d in der obigen Formel einsetzen, erhalten wir eine quadratische Gleichung, die wir wie in der Schule gelehrt lösen.

26178x2−35988x−19754=0


D=(−35988)2−426178∗(−19754)=$336361699


x1=1.7951        x2=−0.4204



Nehmen Sie eine Wurzel mit kleinerem Modul, d.h. x2 . Dann ist die ungefĂ€hre SchĂ€tzung fĂŒr die in die Katze eingebaute Nachricht folgende:

p= frac−0,4204−0,4204−0,5=0,4567



Ja, diese Methode hat ein großes Plus und ein großes Minus. Der Vorteil ist, dass die Methode sowohl mit der gewöhnlichen LSB-Steganographie als auch mit der RandomLSB-Steganographie funktioniert. Ein Chi-Quadrat kann sich einer solchen Gelegenheit nicht rĂŒhmen. Die Methode erkannte unsere zufĂ€llig aussehende Katze genau und schĂ€tzte die NachrichtenlĂ€nge auf 0,3256, was sehr, sehr genau ist.

Das Minus liegt im großen (sehr großen) Fehler dieser Methode, der mit der langen Nachricht mit sequentieller Einbettung wĂ€chst. Zum Beispiel ergibt meine Implementierung der Methode fĂŒr eine Katze mit einer Belegung von 30% eine ungefĂ€hre durchschnittliche SchĂ€tzung fĂŒr drei KanĂ€le von 0,4633 oder 46% der GesamtkapazitĂ€t bei einer Belegung von mehr als 95% - 0,8597. Aber fĂŒr eine leere Katze bis zu 0,0054. Und dies ist ein allgemeiner Trend, der unabhĂ€ngig von der Umsetzung ist. Die genauesten Ergebnisse mit der normalen LSB-Methode ergeben eine integrierte NachrichtenlĂ€nge von 10% + - 5%.

Plus oder Minus



Um nicht erwischt zu werden, muss man unerwartet sein und ± 1 Codierung verwenden. Anstatt das niedrigstwertige Bit im Farbbyte zu Àndern, erhöhen oder verringern wir das gesamte Byte um eins. Es gibt nur zwei Ausnahmen:

  • wir können Null nicht reduzieren, deshalb werden wir sie erhöhen,
  • Wir können 255 auch nicht erhöhen, daher werden wir diesen Wert immer verringern.

FĂŒr alle anderen Bytewerte wĂ€hlen wir entweder zufĂ€llig eine Erhöhung um eins oder eine Verringerung aus. ZusĂ€tzlich zu dieser Manipulation Ă€ndert sich das LSB wie zuvor. FĂŒr eine höhere ZuverlĂ€ssigkeit ist es besser, zufĂ€llige Bytes zum Aufzeichnen einer Nachricht zu verwenden.

Hier ist unsere Freundin Katze:



Äußerlich ist die Einleitung aus demselben Grund unmerklich genau, warum die Unterschiede zwischen (0, 0, 0) und (1, 1, 1) nicht sichtbar waren.



Das LSB-Slice bleibt aufgrund der Aufnahme an zufÀlligen Stellen einfach verrauscht.



Das Chi-Quadrat ist immer noch blind und die RS-Methode ergibt eine grobe SchÀtzung von 0,0036 .

Um nicht sehr glĂŒcklich zu sein, lesen Sie diesen Artikel hier.

Die aufmerksamsten fragen sich möglicherweise, wie wir eine Nachricht erhalten können, wenn ganze Bytes zufĂ€llig geĂ€ndert werden, und wir haben kein Passwort zum Festlegen des PRNG (es ist besser, verschiedene Seeds, auch bekannt als den Status des Generators oder Passwörter, fĂŒr die Arbeit mit RandomLSB und ± 1-Codierung zu verwenden). Die Antwort ist so einfach wie möglich. Wir erhalten die Nachricht genauso wie ohne ± 1 Codierung. Wir wissen möglicherweise nicht einmal ĂŒber seine Verwendung. Ich wiederhole, wir verwenden diesen Trick nur, um automatische Erkennungswerkzeuge zu umgehen . Beim Einbetten / Abrufen einer Nachricht arbeiten wir nur mit ihrem LSB und nicht mehr. Bei der Erkennung mĂŒssen wir jedoch den Implementierungskontext berĂŒcksichtigen, dh alle Bytes des Bildes, um statistische SchĂ€tzungen zu erstellen. Dies ist genau der gesamte Erfolg der ± 1-Codierung.

Anstelle einer Schlussfolgerung


Ein weiterer sehr guter Versuch, Statistiken gegen die LSB-Steganographie zu verwenden, wurde mit einer Methode namens Sample Pairs unternommen. Sie finden es hier. Seine Anwesenheit hier wĂŒrde den Artikel zu akademisch machen, deshalb lasse ich ihn fĂŒr das außerschulische Lesen interessiert. Aber im Vorgriff auf die Fragen des Publikums werde ich sofort antworten: Nein, er fĂ€ngt keine ± 1-Codierung ab.

Und natĂŒrlich maschinelles Lernen. Moderne Methoden, die auf ML basieren, liefern sehr gute Ergebnisse. Sie können hier und hier darĂŒber lesen.

Basierend auf diesem Artikel wurde (vorerst) ein kleines Tool geschrieben. Es kann Daten generieren, einen visuellen Angriff separat auf die KanĂ€le ausfĂŒhren, die RS-, SPA-Bewertung berechnen und die Ergebnisse des Chi-Quadrats visualisieren. Und sie wird dort nicht aufhören.

Zusammenfassend möchte ich ein paar Tipps geben:

  • Betten Sie die Nachricht in zufĂ€llige Bytes ein.
  • Reduzieren Sie die Menge der eingebetteten Informationen so weit wie möglich (denken Sie an Onkel Hamming).
  • Verwenden Sie ± 1 Codierung.
  • WĂ€hlen Sie Bilder mit verrauschtem LSB.
  • Remdalps UPD: Verwenden Sie Bilder, die nirgendwo erscheinen.
  • Sei nett!

Ich freue mich ĂŒber Ihre VorschlĂ€ge, ErgĂ€nzungen, Korrekturen und sonstigen RĂŒckmeldungen!

PS Ich möchte mich ganz besonders bei PavelMSTU fĂŒr die Beratungen und Motivationskicks bedanken .

Source: https://habr.com/ru/post/de422593/


All Articles