2016-03-28 11 views
0

Dies ist mein erstes Mal hier eine Frage zu stellen, also ertragen Sie mit mir! Ich habe ein Steganographie-Labor, mit dem ich fast fertig bin. Ich habe ein Programm abgeschlossen, das eine Nachricht in den unteren Bits eines Bildes versteckt, aber das Programm, um das Bild zu extrahieren, ist, wo ich feststecke. Das Bild befindet sich in einer Datei, die als 2D-Matrix, Spaltenhauptordnung, dargestellt wird. Also hier ist der Code, wo ich feststecke.C++ Extrahieren eines Zeichens aus einem Bild mit bitweisen Operationen

void image::reveal_message() 
{ 
    int bitcount = 0; 
    char c; 
    char *msg; 
    while(c != '\0' || bitcount < 1128) 
    { 
     for(int z = 0; z < cols; z++) 
     { 
      for(int k = 0; k < 8; k++) 
      { 
       int i = bitcount % rows ; 
       int j = bitcount/rows ; 
       int b = c & 1; 
       if(img[i][j] % 2 != 0 && b == 0) 
       { 
        c = c & (~1); 
       } 
       else if(img[i][j] % 2 == 0 && b == 1) 
       { 
        c = c | 1; 
       } 
       bitcount++; 
       c = c << 1; 
      } 
      reverse_bits(c); 
      cout << c << endl; 
      //strncat(msg, &c, 1); 
     } 
    } 
    int i = 0; 
    for(int i = 0; i < cols; i++) 
    { 
     if(!isprint(msg[i])) 
     { 
      cout << "There is no hidden message" << endl; 
     } 
    } 
    cout << "This is the hidden message" << endl; 
    cout << msg; 
} 

Der Code ist in der Lage, durchzulaufen und die richtige Zahl für die Bits zu erfassen. Die Bits basieren darauf, ob die Zahl in der Matrix ungerade oder gerade ist. Wo ich Probleme habe, setze ich die Bits des Chars tatsächlich auf die Bits, die ich aus der Matrix extrahiert habe. Ich bin nicht der Beste bei bitweisen Operationen, und wir sollten auch keine Bibliothek dafür verwenden. Die reverse_bits-Funktion funktioniert auch, so dass es scheint, nur meine Verschiebungen und Bit-weise Operationen sind durcheinander. Ich habe auch die strcat() Zeile auskommentiert, weil es viele Fehler aufgrund der Tatsache, dass Char c ist falsch produziert . Auch der Hauptfehler, den ich bekomme, ist Segmentation Dump.

Antwort

0

Mein Verständnis von Ihrem Code ist, dass Sie Ihre Nachricht als 1 Bit pro Pixel Zeile für Zeile eingebettet haben. Zum Beispiel, wenn Sie ein 3x10 Bild haben, mit Pixeln

01 02 03 04 05 06 07 08 09 10 
11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 

das erste Zeichen Ihrer Nachricht in den Pixeln 01-08, die zweite 09 bis 16, usw. Nach der Nachricht befindet, eingebettet Sie eine zusätzliche Nullzeichen, das Sie während der Extraktion verwenden können, um zu wissen, wann Sie anhalten müssen. In diesem Sinne suchst du so etwas.

int bitcount = 0; 
int i = 0; 
int j = 0; 

while(bitcount < 1128) 
{ 
    // this will serve as the ordinal value for the extracted char 
    int b = 0; 
    for(int k = 0; k < 8; k++) 
    { 
     b = (b << 1) | (img[i][j] & 1); 
     j++; 
     if(j == cols) 
     { 
      i++; 
      j = 0; 
     } 
    } 
    bitcount += 8; 
    // do whatever you want with this, print it, store it somewhere, etc 
    c = (char)b; 
    if(c == '\0') 
    { 
     break; 
    } 
} 

Verstehen, wie das Bitshifting funktioniert. b beginnt mit dem Wert 0 oder 00000000, wenn Sie es im Binärformat visualisieren möchten. Jedes Mal verschiebst du es um eins nach links, um Platz für das neue extrahierte Bit zu schaffen, das du ODER. Keine Notwendigkeit zu überprüfen, ob es 1 oder 0 ist, es wird einfach funktionieren.

Also, stellen Sie sich 5 Bits extrahiert habe, so weit, b ist 00010011 und das niedrigstwertige Bit des aktuellen Bildpixel ist 1. passieren wird, was diese

b = (b << 1) | 1 // b = 00100110 | 1 = 00100111 

ist Und so haben Sie extrahiert die 6. Bit.

Nehmen wir an, Sie haben das Zeichen "a" (01100001) in die ersten 8 Pixel eingebettet.

01 02 03 04 05 06 07 08 \\ pixels 
0 1 1 0 0 0 0 1 \\ least significant bit of each pixel 

Wenn Sie die Bits mit dem oben extrahieren, wird b-97 gleich und c werden Sie „a“ geben. Wenn Sie jedoch Ihre Bits in umgekehrter Reihenfolge eingebettet, dh

01 02 03 04 05 06 07 08 \\ pixels 
1 0 0 0 0 1 1 0 \\ least significant bit of each pixel 

sollten Sie das Extrahieren Algorithmus wie folgt ändern, damit Sie nicht später die Bits zu umkehren haben auf

int b = 0; 
for(int k = 7; k <= 0; k--) 
{ 
    b = b | ((img[i][j] & 1) << k); 
    // etc 
} 
+0

Dank einer Tonne hilft das wirklich! –

0

Sie beginnen mit undefinierten Daten in Ihrem char c.

Sie lesen hier int b = c & 1;.

Das ist eindeutig Unsinn.

  c = c <<1; // shift before, not after 
      // if odd clear: 
      if(img[i][j] % 2) 
      { 
       c = c & (~1); 
      } 
      else // if even set: 
      { 
       c = c | 1; 
      } 

die oben genannten möglicherweise nicht die Daten lesen, aber zumindest ist nicht sinnlos.

Die bitweisen Operationen sehen ansonsten gut aus.

char *msg; sollte std::string sein und += anstelle von strncat verwenden.

+0

'msg 'ein initialisierter Zeiger auf char ist wahrscheinlich auch nicht so wie beabsichtigt. Während der Code auskommentiert, suchen Sie, eine Nachricht in "msg" zu erstellen. Wenn Sie verwenden, liest es als C++. Wahrscheinlich möchten Sie auch C++ - String-Typen anstelle von C-String-Funktionen verwenden. Diese strncat ist eine schlechte Idee, da C-String-Funktionen annehmen, null terminierte Strings, die 'c' ist nicht – infixed