Announcement

Collapse
No announcement yet.

Versteckte Botschaften in Bildern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Versteckte Botschaften in Bildern

    <pre>
    Hallo,

    Dass man versteckte Botschaften in Bildern unterbringen kann ist wohl nicht nur mir bekannt. Strings in Bilddateien zu verschlüsseln soll angeblich eine der sichersten Methoden sein.

    1. Ich habe schon mal ein Beispiel gesehen - hat aber nicht so ganz
    funktioniert.

    2. Wie funktioniert es richtig?

    3. Ist diese Verschlüsselungsmethode wirklich so sicher, wie gesagt wird?

  • #2
    Hi,

    Die Sicherheit der Steganographie beruht zum grossen Teil darauf, dass der Angreifer gar nicht erkennt, dass die Datei eine dechiffrierbare Nachricht enthält. Weiss er dass, dann rückt man dem Problem mit einer visuellen oder besser statistischen Methode zu Leibe, um die Nachricht aus der Datei zu extrahieren.

    Um sich einen Überblick zu verschaffen empfehle ich einen Artikel in der c't 09/01, S.170 ff. Dort gibt es auch weitere Literaturverweise.

    Gruß
    Gsein

    Comment


    • #3
      Steganographie ist auch keine Verschlüsselung, sondern "Steganographie" das Verstecken und Verschleiern von Informationen. Einfachstes Beispiel is wenn ich sage "Komm wir treffen uns wie jedes Jahr am bekannten Platz".

      Natürlich sollten die Daten vor dem anwenden von Steganographie komprimiert und verschlüsselt werden. Ein guter Stegano. Algortihmus ist nicht einfach zu designen, da er z.B. bei Bildern auch nach Veränderung des Bildes noch die daten lesen sollte. Einfachstes Beispiel: Im 2. Weltkrieg wurde von der Nazis massenhaft die Briefe von verdächtigen geöffnet und von Sekretärinnen neu mit anderen Worten umgeschrieben. Das Gleiche kann man auch mit solchen Bild/Ton -Stegano. Algortihmen machen. Einfach ein verdächtiges Bild nachbearbeiten und schon ist die zus. Info zerstört. Darum sollte ein wirklich guter Algorithmus auch leicht geänderte Bilder noch erkennen können, und das ist schon wesentlich schwieriger. Ähnliches Thema sind die digitalen Wasserzeichen, und wenn Du im WEB danach suchst findest Du eine Handvoll von teueren Algortihmen !!

      Gruß Hage

      Comment


      • #4
        Das ist alles sehr interessant. Danke für den Hinweis mit der c't, ich werde sie mir morgen zulegen. Die Geschichte der Steganographie ist übrigens auch sehr markant. ( Es gibt doch so ein Programm mit Namen Steganos, das arbeitet jedoch nicht mit Bildern als Verschlüsselung, soweit ich weiß). Was gehört alles zur Steganographie? Das Verstecken von Daten in Ton-Dateien würde mich auch interessieren. Könnte mir jemand einmal einen solchen Algorithmus zeigen, der Daten in einem Bild/Ton versteckt (muß nicht viel sein)

        Comment


        • #5
          Hi

          Steganos versteckt die Info's so wie ich es weis nur in 24Bit Bitmaps, also Bildern.

          Die einfachste Methode sind Bitmaps im 24 Bit Format. Es wird nun das unterste Bit jeder Farbe eines Pixels als Behälter benutzt. Pro Prixel = 3 Farbwerte (RGB) = 3 Bits per Pixel. Fürs Auge ist eine Manipulation dieser Pixel (also der Farbunterschied) nicht sichtbar.

          Gruß Hage

          Comment


          • #6
            <html>
            <head>
            <title>Untitled</title>
            </head>
            <!-- Generated by ConTEXT HTML exporter -->
            <body text="#000000" bgcolor="#D0D0D0">
            <pre>
            <code><font face="Courier New"><font color="#000000"><b>procedure </b></font>EncodeStegano<font color="#000000">(</font>BMP<font color="#000000">: </font>TBitmap<font color="#000000">; <b>const </b></font>Text<font color="#000000">: <b>String</b>);
            <b>var
            </b></font>I<font color="#000000">,</font>J<font color="#000000">,</font>X<font color="#000000">,</font>Y<font color="#000000">: </font>Integer<font color="#000000">;
            </font>B<font color="#000000">: </font>Byte<font color="#000000">;
            </font>S<font color="#000000">: </font>PByteArray<font color="#000000">;
            <b>begin
            if </b></font>BMP<font color="#000000">.</font>PixelFormat <font color="#000000">&lt;&gt; </font>pf24Bit <font color="#000000"><b>then raise </b></font>Exception<font color="#000000">.</font>Create<font color="#000000">(</font><font color="#0000FF">'ung&uuml;ltiges Bitmapformat'</font><font color="#000000">);
            </font>I <font color="#000000">:= </font>BMP<font color="#000000">.</font>Width <font color="#000000">* </font>BMP<font color="#000000">.</font>Height <font color="#000000">* </font><font color="#0000FF">3</font><font color="#000000">;
            </font>J <font color="#000000">:= </font>Length<font color="#000000">(</font>Text<font color="#000000">) * </font><font color="#0000FF">8 </font><font color="#000000">+ </font><font color="#0000FF">8</font><font color="#000000">;
            <b>if </b></font>I <font color="#000000">&lt; </font>J <font color="#000000"><b>then raise </b></font>Exception<font color="#000000">.</font>Create<font color="#000000">(</font><font color="#0000FF">'nicht gen&uuml;gend Platz in der Bitmap'</font><font color="#000000">);
            </font>I <font color="#000000">:= </font><font color="#0000FF">0</font><font color="#000000">;
            <b>for </b></font>Y <font color="#000000">:= </font><font color="#0000FF">0 </font><font color="#000000"><b>to </b></font>BMP<font color="#000000">.</font>Height <font color="#000000">-</font><font color="#0000FF">1 </font><font color="#000000"><b>do
            begin
            </b></font>S <font color="#000000">:= </font>BMP<font color="#000000">.</font>ScanLine<font color="#000000">[</font>Y<font color="#000000">];
            <b>for </b></font>X <font color="#000000">:= </font><font color="#0000FF">0 </font><font color="#000000"><b>to </b></font>BMP<font color="#000000">.</font>Width <font color="#000000">* </font><font color="#0000FF">3 </font><font color="#000000">-</font><font color="#0000FF">1 </font><font color="#000000"><b>do
            begin
            </b></font>Char<font color="#000000">(</font>B<font color="#000000">) := </font>Text<font color="#000000">[</font><font color="#0000FF">1 </font><font color="#000000">+ (</font>I <font color="#000000"><b>div </b></font><font color="#0000FF">8</font><font color="#000000">)];
            </font>B <font color="#000000">:= (</font>B <font color="#000000"><b>shr </b>(</font>I <font color="#000000"><b>mod </b></font><font color="#0000FF">8</font><font color="#000000">)) <b>and </b></font><font color="#0000FF">1</font><font color="#000000">;
            </font>S<font color="#000000">[</font>X<font color="#000000">] := </font>S<font color="#000000">[</font>X<font color="#000000">] <b>and </b></font><font color="#0000FF">$FE </font><font color="#000000"><b>or </b></font>B<font color="#000000">;
            </font><font color="#008080"><i>// S[X] := S[X] and $7F or (B shl 7);
            </i></font>Inc<font color="#000000">(</font>I<font color="#000000">);
            <b>if </b></font>I <font color="#000000">&gt;= </font>J <font color="#000000"><b>then </b></font>Exit<font color="#000000">;
            <b>end</b>;
            <b>end</b>;
            <b>end</b>;

            </font></font>
            </code></pre>
            </body>
            </html&gt

            Comment


            • #7
              <html>
              <head>
              <title>Untitled</title>
              </head>
              <!-- Generated by ConTEXT HTML exporter -->
              <body text="#000000" bgcolor="#D0D0D0">
              <pre>
              <code><font face="Courier New"><font color="#000000"><b>function </b></font>DecodeStegano<font color="#000000">(</font>BMP<font color="#000000">: </font>TBitmap<font color="#000000">): <b>String</b>;
              <b>var
              </b></font>I<font color="#000000">,</font>J<font color="#000000">,</font>X<font color="#000000">,</font>Y<font color="#000000">: </font>Integer<font color="#000000">;
              </font>S<font color="#000000">: </font>PByteArray<font color="#000000">;
              </font>B<font color="#000000">: </font>Byte<font color="#000000">;
              <b>begin
              if </b></font>BMP<font color="#000000">.</font>PixelFormat <font color="#000000">&lt;&gt; </font>pf24Bit <font color="#000000"><b>then raise </b></font>Exception<font color="#000000">.</font>Create<font color="#000000">(</font><font color="#0000FF">'ung&uuml;ltiges Bitmapformat'</font><font color="#000000">);
              </font>SetLength<font color="#000000">(</font>Result<font color="#000000">, (</font>BMP<font color="#000000">.</font>Width <font color="#000000">* </font>BMP<font color="#000000">.</font>Height <font color="#000000">* </font><font color="#0000FF">3 </font><font color="#000000">+ </font><font color="#0000FF">7</font><font color="#000000">) <b>div </b></font><font color="#0000FF">8</font><font color="#000000">);
              </font>I <font color="#000000">:= </font><font color="#0000FF">0</font><font color="#000000">;
              </font>J <font color="#000000">:= </font><font color="#0000FF">1</font><font color="#000000">;
              </font>B <font color="#000000">:= </font><font color="#0000FF">0</font><font color="#000000">;
              <b>for </b></font>Y <font color="#000000">:= </font><font color="#0000FF">0 </font><font color="#000000"><b>to </b></font>BMP<font color="#000000">.</font>Height <font color="#000000">-</font><font color="#0000FF">1 </font><font color="#000000"><b>do
              begin
              </b></font>S <font color="#000000">:= </font>BMP<font color="#000000">.</font>ScanLine<font color="#000000">[</font>Y<font color="#000000">];
              <b>for </b></font>X <font color="#000000">:= </font><font color="#0000FF">0 </font><font color="#000000"><b>to </b></font>BMP<font color="#000000">.</font>Width <font color="#000000">* </font><font color="#0000FF">3 </font><font color="#000000">-</font><font color="#0000FF">1 </font><font color="#000000"><b>do
              begin
              </b></font>B <font color="#000000">:= (</font>B <font color="#000000"><b>shr </b></font><font color="#0000FF">1</font><font color="#000000">) <b>or </b>(</font>S<font color="#000000">[</font>X<font color="#000000">] <b>shl </b></font><font color="#0000FF">7</font><font color="#000000">);
              </font><font color="#008080"><i>// B := (B shr 1) or (S[X] and $80);
              </i></font>Inc<font color="#000000">(</font>I<font color="#000000">);
              <b>if </b></font>I <font color="#000000">= </font><font color="#0000FF">8 </font><font color="#000000"><b>then
              begin
              </b></font>I <font color="#000000">:= </font><font color="#0000FF">0</font><font color="#000000">;
              </font>Result<font color="#000000">[</font>J<font color="#000000">] := </font>Char<font color="#000000">(</font>B<font color="#000000">);
              <b>if </b></font>B <font color="#000000">= </font><font color="#0000FF">0 </font><font color="#000000"><b>then
              begin
              </b></font>SetLength<font color="#000000">(</font>Result<font color="#000000">, </font>J<font color="#000000">);
              </font>Exit<font color="#000000">;
              <b>end</b>;
              </font>Inc<font color="#000000">(</font>J<font color="#000000">);
              <b>end</b>;
              <b>end</b>;
              <b>end</b>;
              <b>end</b>;

              </font></font>
              </code></pre>
              </body>
              </html&gt

              Comment


              • #8
                <html>
                <head>
                <title>Untitled</title>
                </head>
                <!-- Generated by ConTEXT HTML exporter -->
                <body text="#000000" bgcolor="#D0D0D0">
                <pre>
                <code><font face="Courier New"><font color="#000000"><b>procedure </b></font>TForm1<font color="#000000">.</font>Button1Click<font color="#000000">(</font>Sender<font color="#000000">: </font>TObject<font color="#000000">);
                <b>var
                </b></font>S<font color="#000000">,</font>D<font color="#000000">: </font>TBitmap<font color="#000000">;
                <b>begin
                </b></font>S <font color="#000000">:= </font>TBitmap<font color="#000000">.</font>Create<font color="#000000">;
                <b>try
                </b></font>S<font color="#000000">.</font>Assign<font color="#000000">(</font>Image1<font color="#000000">.</font>Picture<font color="#000000">.</font>Bitmap<font color="#000000">);
                </font>S<font color="#000000">.</font>PixelFormat <font color="#000000">:= </font>pf24Bit<font color="#000000">;
                </font>Image1<font color="#000000">.</font>Picture<font color="#000000">.</font>Bitmap<font color="#000000">.</font>Assign<font color="#000000">(</font>S<font color="#000000">);

                </font>EncodeStegano<font color="#000000">(</font>S<font color="#000000">, </font>Memo1<font color="#000000">.</font>Text<font color="#000000">);
                </font>Image2<font color="#000000">.</font>Picture<font color="#000000">.</font>Bitmap<font color="#000000">.</font>Assign<font color="#000000">(</font>S<font color="#000000">);
                </font>Memo2<font color="#000000">.</font>Text <font color="#000000">:= </font>DecodeStegano<font color="#000000">(</font>S<font color="#000000">);
                <b>finally
                </b></font>S<font color="#000000">.</font>Free<font color="#000000">;
                <b>end</b>;
                <b>end</b>;

                </font></font>
                </code></pre>
                </body>
                </html&gt

                Comment


                • #9
                  So, Du nimmst ein Form, klatscht zwei TImage und TMemos und einen Button drauf (Image1, Image2, Memo1, Memo2, Button1);

                  Im Image1 eine Bitmap als Picture zugewiesen, und vom Button1 das OnClick Event siehste ja oben.

                  Zum test kannste ja mal die zwei auskommentierten Zeilen aktivieren. Dann wird statt dem untersten Farbbit das obersten manipuliert.

                  Gruß Hage

                  Comment


                  • #10
                    Achso, als zweiten Test kannste ja mal die Source Bitmap vollständig weiß oder schwarz ausfüllen um zu sehen ob Du die Veränderungen bemerkst.

                    Gruß Hage

                    Comment


                    • #11
                      Hallo,
                      ich habe gerade den oben vorgestellten Code ausprobiert ich bin überwältigt, es klappt prima. Den Quelltext habe ich mir im einzelnen noch nicht angeschaut, aber scheint insgesamt gut zu verstehen. Danke für eure Hilfe! Ich habe bei dem Programm Steganos noch nie Bitmap-Dateien gefunden (ich habs im Moment auch nicht installiert), aber wenn ich sie finde, kann ich ja versuchen sie zu knacken (grins). Da werden aber wohl schwierigere Alghorithmen verwendet?! Wenn ich das richtig verstehe werden in jedem Pixel 3 Zeichen gespeichert, also kann man max. 3*Pixelanzahl Zeichen speichern. Wenn man jedoch mehrere der Bits manipulierte, würde der Farbwert dann zuweit abweichen??
                      Hagen, wie du ganz oben sagtest ist es auch möglich noch nach leichten Veränderungen der Bitmap die verschlüsselten Zeichen noch richtig zu decodieren. Wie funktioniert das ( wenns noch mehr Quelltext ist als oben bitte nur in etwa erklären)? Außerdem habe ich noch die Frage wie man Zeichen in einer Audiodatei verschlüsseln kann? Das geht??

                      Comment


                      • #12
                        Jetzt bin ich aber baff. Entweder vertuh ich mich da oder irgendwas stimmt nicht: Ich habs mit ner ganz ganz weißen Bitmap ausprobiert. 6627 Zeichen habe ich zum encodieren eingegeben und man sieht mit bloßem Auge nichts, überhaupt kein unterschied. Ich glaube ich setz' mich erst mal mit der Lupe dran. Ich habe gerade Stichproben mit den Farben gemacht. Der Farbwert aller geprüften Pixel hatte sowohl vor, als auch nach dem Encodieren den gleichen Farbwert. Kann das bei allen so sein? Aber wie? Das erstaunliche finde ich, dass eine fast unermeßliche Anzahl von bits gespeichert werden kann, wenn man das z.B. nur bei einer Bitmap mit 400*100 täte. Ich verstehe jetzt auch, warum Steganos gerade diese Verschlüsselungsmetode gewählt hat

                        Comment


                        • #13
                          Hallo Affligem,

                          mit dem Algo von Hagen sind max. (Pixelanzahl * 3 / 8) Zeichen zu speichern.

                          Tschüß

                          Torste

                          Comment


                          • #14
                            Naja man merkt, dass ich kein Mathematiker bin . Also muß man durch acht teilen, weil man nur 1 Bit pro Pixel makiert oder warum?? Wenn man doch pro Farbe ein Bit benutzt sind das doch 3 Werte pro Pixel oder irre ich mich da irgendwie?
                            Aber du hast wohl recht, weil in dem Algo von Hagen auch die Prüfung J:=Length(Text) * 8 + 8 durchgeführt wird. Das die acht für die Bits steht ist mir klar, aber warum durch 8.
                            Es ist aber immer noch genug Speicherplatz: Bei den 6627 Zeichen, die ich eingegeben habe hat das Programm kein Alarm geschlagen :

                            Comment


                            • #15
                              hi

                              1 Pixel = 3 Farben bei a 8 Bit = 24 Bit pro Pixel. Wir nutzen nur das unterste Bit jeder Farbe. Also 1 Pixel = 3 farben = 3 Bit. Ein Zeichen eines Strings = Char = Byte = 8 Bit. Wenn eine 24Bit Bitmap eine Dimension von 100 * 100 Pixeln hat, dann stehen 100 * 100 * 3 Bits zur Verfügung. 100 * 100 * 3 / 8 Bit per Zeichen = maximale Stringlänge in Bytes.

                              Nochmals: Steganographie IST KEINE Verschlüsselung sondern das verstecken von Daten in anderen daten. Als Beispiel: Du versteckst Dich auf einem Marktplatz voller Menschen = Steganograpie. Du wirst vollständig in alle Atome zerlegt und danach mit einem Passwort und Algortihmus komplett anders wieder zusammengesetzt = Verschlüsselung.

                              Dschingis-Kahn, der große Mongolenfürst nutzte folgende Art der Steganographie. Um seine Angriffspläne seinen entfernten Generälen zu schicken, und damals spielte ein Jahr keine Rolle, lies er dem Kurier die Haare scheren. Dann gings ab zum Tätowierer, der auf der Kopfhaut den Angriffsplan eintätowierte. Nach 3-4 Wochen, wir wissen das alle, waren die Haare nachgewachsen. Das zeigt: Steganographie verschlüsselt nichts, sondern versteckt Informationen und nur diejenigen die wissen wie und wo diese Info's versteckt wurden finden sie dann auch wieder. Nebenbei, diese Kuriere taten ihren Job gut und nach Überbringung der Nachricht wurden sie verbrannt ! Das heist, wichtige Informationen sollten nach dem lesen unwiederuflich zerstört werden.

                              So noch eines. Mir ist im obigen Source ein Fehler unterlaufen. Nachdem Image1.Picture.Bitmap.Assign(S); MUSS ein S.FreeImage eingefügt werden, ansonsten enthält Image1 das gleiche Bild wie Image2 nach der Manipluation. Tatsächlich kann man dann wirklich keinerlei Unterschiede entdecken da in fact beide Bilder identisch sind. Das problem liegt in BMP.Scanlines und der internen Referenzverwaltung von gemeinsam genutzten Bitmaps. Zumindest beim D3 wars so.

                              Gruß Hage

                              Comment

                              Working...
                              X