Steganografie



  • Hi @ all!

    Dieses Forum ist echt super, es hat mir schon viel geholfen. Aber jetzt hab ich ein Problem, bei dem mir auch die Suche nichts gebracht hat. Wir müssen von der Schule aus ein Steganografie Programm schreiben. Dabei wird bei einem Bitmap bei jedem Byte das LSB mit den zu versteckenden Daten überschrieben.
    Dieses Programm ist schon recht weit fortgeschritten, jetzt hab ich nur das Problem dass er beim Auslesen aus einem bereits bearbeiteten Bitmap nichts findet. Ich habe das Programm schon durchgestept, aber es wird alles gemacht. Er bringt mir auch keine Warnungen und keine Fehler.

    Hir die wichtigsten Source-Teile:

    In der Struktur TStegaHeader werden der Dateiname, die länge der Datei und die Art der Datei mitgegeben und auch versteckt.

    struct TStegaHeader        
    	{char ID[4];
    	 int Length;
    	 char FileName[32];
    	};
    

    Hier wird dann dieser Header und die zweite Datei in die erste Datei geschrieben:

    void TForm1::encode()
    {
    	 if(Stream2==NULL)  //Abfrage ob Daten in Stream2 sind
    	 {
    		Application->MessageBoxA("No File to hide!","Error",MB_OK);
    		return;
    	 }
    	 else if(Stream3==NULL)  //Abfrage ob Daten in Stream3 sind
    	 {
    		Application->MessageBoxA("No File to hide!","Error",MB_OK);
    		return;
    	 }
    
    	 BYTE sByte=0;      
    	 BYTE sBit=0;
    	 BYTE iByte=0;
    	 BYTE hByte=0;
    	 BYTE hBit=0;
    
    	 for(int i=0; i<sizeof(sf); i++)  //Starten der Schleife, um HeaderDatei zu verstecken
    	 {
    	   Stream3->Read(&hByte,sizeof(BYTE));
    	   for(int k=0; k<8; k++)
    	   {
    		  hBit=hByte&128;                        //Ausmaskieren des MSB
    		  hBit=hBit>>7;                               //MSB wird zum LSB
    		  Stream1->Read(&iByte, sizeof(BYTE));   //Lesen des zu beschreibenden Byte
    		  iByte=iByte|hBit;                      //Hinzufügen des geheimen Bits
    		  Stream1->Position-=sizeof(BYTE);       //Zurücksetzen des DatenPointers auf die ursprüngliche stelle des Bits
    		  Stream1->Write(&iByte,sizeof(BYTE));   //Schreiben des Bytes mit dem geheimen Bit als LSB
    		  hByte=hByte <<1 ;                            //ShiftLeft, damit das zu versteckende Bit immer das MSB ist
    	   }
    	 }
    
    	 for(int i=0; i<ssize1; i++)   //Starten der Schleife, um Datei zu verstecken
    	 {
    	   Stream2->Read(&sByte, sizeof(BYTE));  //Auslesen des zu versteckenden Bytes
    
    	   for(int k=0; k<8; k++)
    	   {
    		  sBit=sByte&128;                        //Ausmaskieren des MSB
    		  sBit=sBit>>7;                               //MSB wird zum LSB
    		  Stream1->Read(&iByte, sizeof(BYTE));   //Lesen des zu beschreibenden Bytes
    		  iByte=iByte|sBit;                      //Hinzufügen des geheimen Bits
    		  Stream1->Position-=sizeof(BYTE);       //Zurücksetzen des DatenPointers auf die ursprüngliche stelle des Bits
    		  Stream1->Write(&iByte,sizeof(BYTE));   //Schreiben des Bytes mit dem geheimen Bit als LSB
    		  sByte=sByte <<1 ;                            //ShiftLeft, damit das zu versteckende Bit immer das MSB ist
    	   }
    	 }
    	 return;
    }
    

    Im MemoryStream Stream1 befindet sich die Datei, in die geschrieben wird. Stream2 enthält die zu versteckende Datei und Stream3 enthält den Header.

    Danach wird das veränderte Bitmap wieder abgespeichert.
    Wenn ich dieses veränderte Bitmap nun lade, wird dieses Programm aufgerufen:

    bool TForm1::HeaderDecode()
    { //Auslesen des Headers
      bool flag;                //Deklaration der Variablen
      BYTE hByte=0;
      BYTE hBit=0;
      TStegaHeader tmp;
    
      Stream5->Position=0;
      Stream4->Position+=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
      for(int i=0; i<sizeof(TStegaHeader); i++)       //Starten der Schleifen
      {
    	 for(int k=0;k<8;k++)
    	 {
    		Stream4->Read(&hBit,sizeof(BYTE));       //Auslesen des ersten Bytes aus dem Bild
    		hBit=hBit&1;                             //Ausmaskieren des LSB
    		hByte=hByte|hBit;                        //Hinzufügen des LSB an die Variable hByte
    		hByte=hByte<<1;                          //Freimachen des LSB, um nächstes LSB dazuzuschreiben
    		hBit=0;
    	 }
    
    	 Stream5->Write(&hByte,sizeof(BYTE));        //Schreiben der Variable hByte in einen Stream
      }
    
      Stream5->Position=0;
      Stream5->Read(&tmp,sizeof(TStegaHeader));     //Auslesen des Headers
    
      if((tmp.ID[0]=='b')&&(tmp.ID[1]=='m'))        //Auslesen der ID und schreiben des Flags
      {
    	 flag=1;
      }
      else if((tmp.ID[0]=='w')&&(tmp.ID[1]=='a'))
      {
    	 flag=1;
      }
      else if((tmp.ID[0]=='t')&&(tmp.ID[1]=='x'))
      {
    	 flag=1;
      }
      else if((tmp.ID[0]=='t')&&(tmp.ID[1]=='e'))
      {
    	 flag=1;
      }
      else
       flag=0;
    
      return flag;            //Rückgabe des Flags
    }
    

    In Stream4 befindet sich die Datei, in der sich die geheime Datei befindet. In Stream5 wird der Header, der hier ausgelesen werden sollte, abgespeichert.
    Nun schickt er als flag aber immer dieses verfluchte 0 zurück, was bedeutet, dass nichts in dieser Datei zu finden ist.

    Ich bin mir sicher dass ich hier irgendeinen dummen Anfängerfehler fabriziert habe. Es wäre schön wenn ihr mir helfen könntet. Vielen Dank im voraus.

    mfg
    zillertaler



  • Kann mir hier keiner helfen? Ich bin wirklich verzweifelt...

    mfg
    zillertaler


Log in to reply