<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Steganografie]]></title><description><![CDATA[<p>Hi @ all!</p>
<p>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.<br />
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.</p>
<p>Hir die wichtigsten Source-Teile:</p>
<p>In der Struktur TStegaHeader werden der Dateiname, die länge der Datei und die Art der Datei mitgegeben und auch versteckt.</p>
<pre><code class="language-cpp">struct TStegaHeader        
	{char ID[4];
	 int Length;
	 char FileName[32];
	};
</code></pre>
<p>Hier wird dann dieser Header und die zweite Datei in die erste Datei geschrieben:</p>
<pre><code class="language-cpp">void TForm1::encode()
{
	 if(Stream2==NULL)  //Abfrage ob Daten in Stream2 sind
	 {
		Application-&gt;MessageBoxA(&quot;No File to hide!&quot;,&quot;Error&quot;,MB_OK);
		return;
	 }
	 else if(Stream3==NULL)  //Abfrage ob Daten in Stream3 sind
	 {
		Application-&gt;MessageBoxA(&quot;No File to hide!&quot;,&quot;Error&quot;,MB_OK);
		return;
	 }

	 BYTE sByte=0;      
	 BYTE sBit=0;
	 BYTE iByte=0;
	 BYTE hByte=0;
	 BYTE hBit=0;

	 for(int i=0; i&lt;sizeof(sf); i++)  //Starten der Schleife, um HeaderDatei zu verstecken
	 {
	   Stream3-&gt;Read(&amp;hByte,sizeof(BYTE));
	   for(int k=0; k&lt;8; k++)
	   {
		  hBit=hByte&amp;128;                        //Ausmaskieren des MSB
		  hBit=hBit&gt;&gt;7;                               //MSB wird zum LSB
		  Stream1-&gt;Read(&amp;iByte, sizeof(BYTE));   //Lesen des zu beschreibenden Byte
		  iByte=iByte|hBit;                      //Hinzufügen des geheimen Bits
		  Stream1-&gt;Position-=sizeof(BYTE);       //Zurücksetzen des DatenPointers auf die ursprüngliche stelle des Bits
		  Stream1-&gt;Write(&amp;iByte,sizeof(BYTE));   //Schreiben des Bytes mit dem geheimen Bit als LSB
		  hByte=hByte &lt;&lt;1 ;                            //ShiftLeft, damit das zu versteckende Bit immer das MSB ist
	   }
	 }

	 for(int i=0; i&lt;ssize1; i++)   //Starten der Schleife, um Datei zu verstecken
	 {
	   Stream2-&gt;Read(&amp;sByte, sizeof(BYTE));  //Auslesen des zu versteckenden Bytes

	   for(int k=0; k&lt;8; k++)
	   {
		  sBit=sByte&amp;128;                        //Ausmaskieren des MSB
		  sBit=sBit&gt;&gt;7;                               //MSB wird zum LSB
		  Stream1-&gt;Read(&amp;iByte, sizeof(BYTE));   //Lesen des zu beschreibenden Bytes
		  iByte=iByte|sBit;                      //Hinzufügen des geheimen Bits
		  Stream1-&gt;Position-=sizeof(BYTE);       //Zurücksetzen des DatenPointers auf die ursprüngliche stelle des Bits
		  Stream1-&gt;Write(&amp;iByte,sizeof(BYTE));   //Schreiben des Bytes mit dem geheimen Bit als LSB
		  sByte=sByte &lt;&lt;1 ;                            //ShiftLeft, damit das zu versteckende Bit immer das MSB ist
	   }
	 }
	 return;
}
</code></pre>
<p>Im MemoryStream Stream1 befindet sich die Datei, in die geschrieben wird. Stream2 enthält die zu versteckende Datei und Stream3 enthält den Header.</p>
<p>Danach wird das veränderte Bitmap wieder abgespeichert.<br />
Wenn ich dieses veränderte Bitmap nun lade, wird dieses Programm aufgerufen:</p>
<pre><code class="language-cpp">bool TForm1::HeaderDecode()
{ //Auslesen des Headers
  bool flag;                //Deklaration der Variablen
  BYTE hByte=0;
  BYTE hBit=0;
  TStegaHeader tmp;

  Stream5-&gt;Position=0;
  Stream4-&gt;Position+=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

  for(int i=0; i&lt;sizeof(TStegaHeader); i++)       //Starten der Schleifen
  {
	 for(int k=0;k&lt;8;k++)
	 {
		Stream4-&gt;Read(&amp;hBit,sizeof(BYTE));       //Auslesen des ersten Bytes aus dem Bild
		hBit=hBit&amp;1;                             //Ausmaskieren des LSB
		hByte=hByte|hBit;                        //Hinzufügen des LSB an die Variable hByte
		hByte=hByte&lt;&lt;1;                          //Freimachen des LSB, um nächstes LSB dazuzuschreiben
		hBit=0;
	 }

	 Stream5-&gt;Write(&amp;hByte,sizeof(BYTE));        //Schreiben der Variable hByte in einen Stream
  }

  Stream5-&gt;Position=0;
  Stream5-&gt;Read(&amp;tmp,sizeof(TStegaHeader));     //Auslesen des Headers

  if((tmp.ID[0]=='b')&amp;&amp;(tmp.ID[1]=='m'))        //Auslesen der ID und schreiben des Flags
  {
	 flag=1;
  }
  else if((tmp.ID[0]=='w')&amp;&amp;(tmp.ID[1]=='a'))
  {
	 flag=1;
  }
  else if((tmp.ID[0]=='t')&amp;&amp;(tmp.ID[1]=='x'))
  {
	 flag=1;
  }
  else if((tmp.ID[0]=='t')&amp;&amp;(tmp.ID[1]=='e'))
  {
	 flag=1;
  }
  else
   flag=0;

  return flag;            //Rückgabe des Flags
}
</code></pre>
<p>In Stream4 befindet sich die Datei, in der sich die geheime Datei befindet. In Stream5 wird der Header, der hier ausgelesen werden sollte, abgespeichert.<br />
Nun schickt er als flag aber immer dieses verfluchte 0 zurück, was bedeutet, dass nichts in dieser Datei zu finden ist.</p>
<p>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.</p>
<p>mfg<br />
zillertaler</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203154/steganografie</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 10:29:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203154.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Jan 2008 14:10:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Steganografie on Sat, 19 Jan 2008 14:10:15 GMT]]></title><description><![CDATA[<p>Hi @ all!</p>
<p>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.<br />
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.</p>
<p>Hir die wichtigsten Source-Teile:</p>
<p>In der Struktur TStegaHeader werden der Dateiname, die länge der Datei und die Art der Datei mitgegeben und auch versteckt.</p>
<pre><code class="language-cpp">struct TStegaHeader        
	{char ID[4];
	 int Length;
	 char FileName[32];
	};
</code></pre>
<p>Hier wird dann dieser Header und die zweite Datei in die erste Datei geschrieben:</p>
<pre><code class="language-cpp">void TForm1::encode()
{
	 if(Stream2==NULL)  //Abfrage ob Daten in Stream2 sind
	 {
		Application-&gt;MessageBoxA(&quot;No File to hide!&quot;,&quot;Error&quot;,MB_OK);
		return;
	 }
	 else if(Stream3==NULL)  //Abfrage ob Daten in Stream3 sind
	 {
		Application-&gt;MessageBoxA(&quot;No File to hide!&quot;,&quot;Error&quot;,MB_OK);
		return;
	 }

	 BYTE sByte=0;      
	 BYTE sBit=0;
	 BYTE iByte=0;
	 BYTE hByte=0;
	 BYTE hBit=0;

	 for(int i=0; i&lt;sizeof(sf); i++)  //Starten der Schleife, um HeaderDatei zu verstecken
	 {
	   Stream3-&gt;Read(&amp;hByte,sizeof(BYTE));
	   for(int k=0; k&lt;8; k++)
	   {
		  hBit=hByte&amp;128;                        //Ausmaskieren des MSB
		  hBit=hBit&gt;&gt;7;                               //MSB wird zum LSB
		  Stream1-&gt;Read(&amp;iByte, sizeof(BYTE));   //Lesen des zu beschreibenden Byte
		  iByte=iByte|hBit;                      //Hinzufügen des geheimen Bits
		  Stream1-&gt;Position-=sizeof(BYTE);       //Zurücksetzen des DatenPointers auf die ursprüngliche stelle des Bits
		  Stream1-&gt;Write(&amp;iByte,sizeof(BYTE));   //Schreiben des Bytes mit dem geheimen Bit als LSB
		  hByte=hByte &lt;&lt;1 ;                            //ShiftLeft, damit das zu versteckende Bit immer das MSB ist
	   }
	 }

	 for(int i=0; i&lt;ssize1; i++)   //Starten der Schleife, um Datei zu verstecken
	 {
	   Stream2-&gt;Read(&amp;sByte, sizeof(BYTE));  //Auslesen des zu versteckenden Bytes

	   for(int k=0; k&lt;8; k++)
	   {
		  sBit=sByte&amp;128;                        //Ausmaskieren des MSB
		  sBit=sBit&gt;&gt;7;                               //MSB wird zum LSB
		  Stream1-&gt;Read(&amp;iByte, sizeof(BYTE));   //Lesen des zu beschreibenden Bytes
		  iByte=iByte|sBit;                      //Hinzufügen des geheimen Bits
		  Stream1-&gt;Position-=sizeof(BYTE);       //Zurücksetzen des DatenPointers auf die ursprüngliche stelle des Bits
		  Stream1-&gt;Write(&amp;iByte,sizeof(BYTE));   //Schreiben des Bytes mit dem geheimen Bit als LSB
		  sByte=sByte &lt;&lt;1 ;                            //ShiftLeft, damit das zu versteckende Bit immer das MSB ist
	   }
	 }
	 return;
}
</code></pre>
<p>Im MemoryStream Stream1 befindet sich die Datei, in die geschrieben wird. Stream2 enthält die zu versteckende Datei und Stream3 enthält den Header.</p>
<p>Danach wird das veränderte Bitmap wieder abgespeichert.<br />
Wenn ich dieses veränderte Bitmap nun lade, wird dieses Programm aufgerufen:</p>
<pre><code class="language-cpp">bool TForm1::HeaderDecode()
{ //Auslesen des Headers
  bool flag;                //Deklaration der Variablen
  BYTE hByte=0;
  BYTE hBit=0;
  TStegaHeader tmp;

  Stream5-&gt;Position=0;
  Stream4-&gt;Position+=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

  for(int i=0; i&lt;sizeof(TStegaHeader); i++)       //Starten der Schleifen
  {
	 for(int k=0;k&lt;8;k++)
	 {
		Stream4-&gt;Read(&amp;hBit,sizeof(BYTE));       //Auslesen des ersten Bytes aus dem Bild
		hBit=hBit&amp;1;                             //Ausmaskieren des LSB
		hByte=hByte|hBit;                        //Hinzufügen des LSB an die Variable hByte
		hByte=hByte&lt;&lt;1;                          //Freimachen des LSB, um nächstes LSB dazuzuschreiben
		hBit=0;
	 }

	 Stream5-&gt;Write(&amp;hByte,sizeof(BYTE));        //Schreiben der Variable hByte in einen Stream
  }

  Stream5-&gt;Position=0;
  Stream5-&gt;Read(&amp;tmp,sizeof(TStegaHeader));     //Auslesen des Headers

  if((tmp.ID[0]=='b')&amp;&amp;(tmp.ID[1]=='m'))        //Auslesen der ID und schreiben des Flags
  {
	 flag=1;
  }
  else if((tmp.ID[0]=='w')&amp;&amp;(tmp.ID[1]=='a'))
  {
	 flag=1;
  }
  else if((tmp.ID[0]=='t')&amp;&amp;(tmp.ID[1]=='x'))
  {
	 flag=1;
  }
  else if((tmp.ID[0]=='t')&amp;&amp;(tmp.ID[1]=='e'))
  {
	 flag=1;
  }
  else
   flag=0;

  return flag;            //Rückgabe des Flags
}
</code></pre>
<p>In Stream4 befindet sich die Datei, in der sich die geheime Datei befindet. In Stream5 wird der Header, der hier ausgelesen werden sollte, abgespeichert.<br />
Nun schickt er als flag aber immer dieses verfluchte 0 zurück, was bedeutet, dass nichts in dieser Datei zu finden ist.</p>
<p>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.</p>
<p>mfg<br />
zillertaler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439456</guid><dc:creator><![CDATA[zillertaler]]></dc:creator><pubDate>Sat, 19 Jan 2008 14:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to Steganografie on Sun, 20 Jan 2008 11:08:07 GMT]]></title><description><![CDATA[<p>Kann mir hier keiner helfen? Ich bin wirklich verzweifelt...</p>
<p>mfg<br />
zillertaler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439817</guid><dc:creator><![CDATA[zillertaler]]></dc:creator><pubDate>Sun, 20 Jan 2008 11:08:07 GMT</pubDate></item></channel></rss>