<?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[Binärdatei verschlüsseln und ausgeben]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich möchte eine Binärdatei einlesen, dann mit RC4 verschlüsseln und dann in eine andere Datei ausgeben.<br />
Das Problem ist allerdings folgendes:<br />
Ursprünglich liegt die Datei binär vor, also wenn ich sie im Notepad aufmache, sehe ich fast nur eckige Kästchen.<br />
Wenn ich die Datei dann allerdings einlese, verschlüssle und gleich wieder entschlüssle und in eine andere Datei ausgebe, dann sieht die ausgegebene Datei nicht so aus, wie die Originale .. also es stehen nicht mehr lauter eckige Kästchen drinnen, sondern praktisch ASCII-Code. Anfangen tut dies in meinem Fall mit &quot;CWS&lt;eckiges Kästchen&gt;ón&lt;eckiges Kästchen&gt;....&quot; (ist eine SWF-Datei).<br />
Ich möchte nun natürlich, dass die ausgegebene Datei wieder genau so wie die originale, also binär, aussieht.</p>
<p>Der Code:</p>
<pre><code class="language-cpp">void rc4(unsigned char * ByteInput, int size, unsigned char * pwd,
		   unsigned char * &amp;ByteOutput){
	unsigned char * temp;
	int i,j=0,t,tmp,tmp2,s[256], k[256];
	for (tmp=0;tmp&lt;256;tmp++){
		s[tmp]=tmp;
		k[tmp]=pwd[(tmp % strlen((char *)pwd))];
	}
		for (i=0;i&lt;256;i++){
		j = (j + s[i] + k[i]) % 256;
		tmp=s[i];
		s[i]=s[j];
		s[j]=tmp;
	}
	temp = new unsigned char [ size ] ;
	i=j=0;
	for (tmp=0;tmp&lt;size;tmp++){
	    i = (i + 1) % 256;
        j = (j + s[i]) % 256;
		tmp2=s[i];
		s[i]=s[j];
		s[j]=tmp2;
        t = (s[i] + s[j]) % 256;
		if (s[t]==ByteInput[tmp])
			temp[tmp]=ByteInput[tmp];
		else
			temp[tmp]=s[t]^ByteInput[tmp];
		}
	ByteOutput=temp;
}
</code></pre>
<p>Aufrufen tu ich es so:</p>
<pre><code class="language-cpp">unsigned char *Buffer = NULL;
int size = 123;
ReadFile ( &quot;u1.swf&quot;, &amp;Buffer, &amp;size); // lest einfach die ganze Datei in den Buffer und gibt die Länge zurück

unsigned char * message;
unsigned char * pwd;
unsigned char * encrypted;
unsigned char * decrypted;
message=Buffer;
pwd=(unsigned char *)&quot;asdf&quot;;
rc4(message,size,pwd,encrypted);
rc4(encrypted,size,pwd,decrypted);

FILE *pFile1 = fopen ( &quot;u2.swf&quot;, &quot;wb&quot; );
fwrite(decrypted, sizeof(unsigned char), size, pFile1);
fclose(pFile1);
</code></pre>
<p>Die RC4-Funktion hab ich aus dem Internet, ich habe sie nur so verändert, dass ich ihr den Size-Paramter übergeben kann, falls mal mittendrin ein Nullcharacter is, damit er da halt nicht abbricht.</p>
<p>Meine Vermutung ist, dass es an der Zeile mit dem XOR liegt, ich weiß aber nicht was ich ändern muss, damit es funktioniert.</p>
<p>Kann mir da wer weiterhelfen?</p>
<p>lg<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191191/binärdatei-verschlüsseln-und-ausgeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 22:43:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191191.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Aug 2007 08:36:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 08:39:57 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich möchte eine Binärdatei einlesen, dann mit RC4 verschlüsseln und dann in eine andere Datei ausgeben.<br />
Das Problem ist allerdings folgendes:<br />
Ursprünglich liegt die Datei binär vor, also wenn ich sie im Notepad aufmache, sehe ich fast nur eckige Kästchen.<br />
Wenn ich die Datei dann allerdings einlese, verschlüssle und gleich wieder entschlüssle und in eine andere Datei ausgebe, dann sieht die ausgegebene Datei nicht so aus, wie die Originale .. also es stehen nicht mehr lauter eckige Kästchen drinnen, sondern praktisch ASCII-Code. Anfangen tut dies in meinem Fall mit &quot;CWS&lt;eckiges Kästchen&gt;ón&lt;eckiges Kästchen&gt;....&quot; (ist eine SWF-Datei).<br />
Ich möchte nun natürlich, dass die ausgegebene Datei wieder genau so wie die originale, also binär, aussieht.</p>
<p>Der Code:</p>
<pre><code class="language-cpp">void rc4(unsigned char * ByteInput, int size, unsigned char * pwd,
		   unsigned char * &amp;ByteOutput){
	unsigned char * temp;
	int i,j=0,t,tmp,tmp2,s[256], k[256];
	for (tmp=0;tmp&lt;256;tmp++){
		s[tmp]=tmp;
		k[tmp]=pwd[(tmp % strlen((char *)pwd))];
	}
		for (i=0;i&lt;256;i++){
		j = (j + s[i] + k[i]) % 256;
		tmp=s[i];
		s[i]=s[j];
		s[j]=tmp;
	}
	temp = new unsigned char [ size ] ;
	i=j=0;
	for (tmp=0;tmp&lt;size;tmp++){
	    i = (i + 1) % 256;
        j = (j + s[i]) % 256;
		tmp2=s[i];
		s[i]=s[j];
		s[j]=tmp2;
        t = (s[i] + s[j]) % 256;
		if (s[t]==ByteInput[tmp])
			temp[tmp]=ByteInput[tmp];
		else
			temp[tmp]=s[t]^ByteInput[tmp];
		}
	ByteOutput=temp;
}
</code></pre>
<p>Aufrufen tu ich es so:</p>
<pre><code class="language-cpp">unsigned char *Buffer = NULL;
int size = 123;
ReadFile ( &quot;u1.swf&quot;, &amp;Buffer, &amp;size); // lest einfach die ganze Datei in den Buffer und gibt die Länge zurück

unsigned char * message;
unsigned char * pwd;
unsigned char * encrypted;
unsigned char * decrypted;
message=Buffer;
pwd=(unsigned char *)&quot;asdf&quot;;
rc4(message,size,pwd,encrypted);
rc4(encrypted,size,pwd,decrypted);

FILE *pFile1 = fopen ( &quot;u2.swf&quot;, &quot;wb&quot; );
fwrite(decrypted, sizeof(unsigned char), size, pFile1);
fclose(pFile1);
</code></pre>
<p>Die RC4-Funktion hab ich aus dem Internet, ich habe sie nur so verändert, dass ich ihr den Size-Paramter übergeben kann, falls mal mittendrin ein Nullcharacter is, damit er da halt nicht abbricht.</p>
<p>Meine Vermutung ist, dass es an der Zeile mit dem XOR liegt, ich weiß aber nicht was ich ändern muss, damit es funktioniert.</p>
<p>Kann mir da wer weiterhelfen?</p>
<p>lg<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355869</guid><dc:creator><![CDATA[m0m0]]></dc:creator><pubDate>Fri, 31 Aug 2007 08:39:57 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 08:45:47 GMT]]></title><description><![CDATA[<p>Schreib dir ne Testfunktion die ohne Dateien arbeitet, sondern direkt die zu verschlüssenden Daten enthält. Nimm nen Debugger und schau dir an, was passiert. Geht es immer richtig, wenn du eine Datei verschlüsselst, die nur ein Zeichen enthält? Geht es für Textdateien richtig? ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355873</guid><dc:creator><![CDATA[selber]]></dc:creator><pubDate>Fri, 31 Aug 2007 08:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 09:03:32 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if (s[t]==ByteInput[tmp])
            temp[tmp]=ByteInput[tmp];
        else
            temp[tmp]=s[t]^ByteInput[tmp];
        }
</code></pre>
<p>Ist ByteInput hier nicht uninitialisiert? Das wäre dann allerdings ein Fehler, den man durch Beachtung minimaler Coding-standards (Variablen werden immer initialisiert &amp; erst dann definiert, wenn sie initialisiert werden können) vermeiden konnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355882</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 31 Aug 2007 09:03:32 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 09:12:14 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ist ByteInput hier nicht uninitialisiert? Das wäre dann allerdings ein Fehler, den man durch Beachtung minimaler Coding-standards (Variablen werden immer initialisiert &amp; erst dann definiert, wenn sie initialisiert werden können) vermeiden konnte.</p>
</blockquote>
<p>Das ByteInput wird doch als Parameter übergeben :p</p>
<p>Aber hier noch was, den Speicher von encrypted bzw decrypted musst du wieder freigeben:</p>
<pre><code class="language-cpp">temp = new unsigned char [ size ] ;
ByteOutput=temp;

...
rc4(message,size,pwd,encrypted);
rc4(encrypted,size,pwd,decrypted);
</code></pre>
<p>Kann sein, dass das im Code noch folgt, aber man weiß es ja nicht..</p>
<p>Und eines versteh ich auch noch nicht: Muss man bei dem rc4 zwei mal verschlüsseln? Du liest ja die Datei ein, verschlüsselst zwei mal und schreibst dann die neuen Daten raus. Sicher, dass das nicht nur ein mal getan werden muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355888</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 31 Aug 2007 09:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 09:14:44 GMT]]></title><description><![CDATA[<p>edit: Blöde bezeichnungen - ich hatte einfach ByteInput und ByteOutput verwechselt - da ist optisch kaum ein Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355892</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 31 Aug 2007 09:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 09:27:26 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Und eines versteh ich auch noch nicht: Muss man bei dem rc4 zwei mal verschlüsseln? Du liest ja die Datei ein, verschlüsselst zwei mal und schreibst dann die neuen Daten raus. Sicher, dass das nicht nur ein mal getan werden muss?</p>
</blockquote>
<p>Normalerweie natürlich nur einmal, aber ich will ja nur testen ob meine Verschlüsselung funktioniert, darum verschlüssle ich den text .. und verschlüssle ihn dann gleich nochmal, um ihn wieder zu entschlüsseln (is ja ein symmetrisches verschlüsselungsverfahren).<br />
jetzt müsste ja eigentlich der decrypted-text wieder genau dem original entsprechen .. im debugger tut er das ja auch, nur in der datei dann nicht.</p>
<p>ich hab aber jetzt ne andere entdeckung gemacht: die ursprüngliche datei (die swf-datei) liegt in unicode vor, nach dem ver/entschlüsseln und ausgeben liegt die neue datei aber in ANSI vor.<br />
wie kann ich die datei in unicode einlesen bzw. ausgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355899</guid><dc:creator><![CDATA[m0m0]]></dc:creator><pubDate>Fri, 31 Aug 2007 09:27:26 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 09:30:11 GMT]]></title><description><![CDATA[<p>m0m0 schrieb:</p>
<blockquote>
<p>jetzt müsste ja eigentlich der decrypted-text wieder genau dem original entsprechen .. im debugger tut er das ja auch,</p>
</blockquote>
<p>hätte mal erwähnt werden können...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355901</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 31 Aug 2007 09:30:11 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 09:58:12 GMT]]></title><description><![CDATA[<p>also ich hab jetzt mal überall wo &quot;unsigned char&quot; gestanden is &quot;wchar_t&quot; hingeschrieben, das is doch ein unicode-datentyp, oder?</p>
<p>in der zweiten datei, in der ich den verschlüsselten und wieder entschlüsselten text ausgebe, stehen nun tatsächlich wieder binärzeichen, nur leider einige zuviel. es wird also der originaltext hingeschrieben, und hinten noch einige andere zeichen drangehängt.</p>
<p>Bei</p>
<pre><code class="language-cpp">fwrite(decrypted, sizeof(wchar_t), size, pFile1);
</code></pre>
<p>steht in size zwar der selbe Wert drin, wie am Angang, es werden aber weit mehr Zeichen ausgegeben. Hat jemand eine Ahnung warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355919</guid><dc:creator><![CDATA[m0m0]]></dc:creator><pubDate>Fri, 31 Aug 2007 09:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 12:03:23 GMT]]></title><description><![CDATA[<p>Da du die Dateien binär behandeltst, spielt Unicode<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/2194.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--left-right_arrow"
      title=":left-right_arrow:"
      alt="↔"
    />ANSI keine Rolle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<p>Und dass <code>fwrite(decrypted, sizeof(wchar_t), size, pFile1);</code> doppelt soviel schreibt, ist kein Wunder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Schließlich werden <code>size*sizeof(wchar_t)</code> Bytes geschrieben statt <code>size*sizeof(char)</code> Bytes.</p>
<p>Und was du noch tun könntest: Wenn du mit dem Visual Studio arbeitest, kannst du die Anfangs- und ver-ent-schlüsselte Datei mit der Dateiendung &quot;.bin&quot; versehen und mit dem VS öffnen - hier kannst du dann bequem vergleichen, inwiefern die Dateien unterschiedlich sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356030</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 31 Aug 2007 12:03:23 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 12:13:58 GMT]]></title><description><![CDATA[<p>Lies doch nur mal die Datei ein und speicher sie wieder. ohne verlschüsseln</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356037</guid><dc:creator><![CDATA[Wer bin ich]]></dc:creator><pubDate>Fri, 31 Aug 2007 12:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 13:09:52 GMT]]></title><description><![CDATA[<p>einlesen und ohne verschlüsseln gleich wieder rausschreiben hat vorher schon funktioniert, bevor ich das mit dem wchar_t geändert hab.<br />
doppelt soviel gibt er jetzt auch nicht mehr aus .. allerdings scheint das ganze nur bei kleinen dateien zu funktionieren. keine ahnung warum. wenn ich ne 5 kb datei nehme, funktionierts ohne probleme. bei einer 90 kb datei steht in der ausgabedatei ein paar tausend mal das selbe zeichen (sieht wie ein komisches i aus).<br />
und wie ichs mit einer datei mit einer größe von ca. 30 kbs probiert hab, hats beim ausführen einen fehler gegeben in der zeile<br />
if (s[t]==ByteInput[tmp])</p>
<p>t war bei ca. 80 und tmp bei ein paar tausend, aber noch lange nicht bei size, also irgendwo mitten drinnen. warum hier ein fehler geworfen wurde versteh ich aber nicht. selbst wenn ByteInput[20000] oder was das war NULL gewesen wäre, müsste doch der vergleich ob s[t] gleich null ist funktionieren und keinen fehler erzeugen, der das programm abbricht. wie gesagt, ich verstehs grad nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356073</guid><dc:creator><![CDATA[m0m0]]></dc:creator><pubDate>Fri, 31 Aug 2007 13:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 14:04:26 GMT]]></title><description><![CDATA[<p>m0m0 schrieb:</p>
<blockquote>
<p>selbst wenn ByteInput[20000] oder was das war NULL gewesen wäre, müsste doch der vergleich ob s[t] gleich null ist funktionieren und keinen fehler erzeugen, der das programm abbricht.</p>
</blockquote>
<p>Naja, ByteInput[xx] kann nicht NULL zurückgeben. Zeig doch mal deine <code>ReadFile ( &quot;u1.swf&quot;, &amp;Buffer, &amp;size)</code> -Methode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356123</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 31 Aug 2007 14:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 14:38:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void ReadFile ( char *Filename, wchar_t **Buffer , int *size)
{
	FILE *pFile = fopen ( Filename, &quot;rb&quot; );

	if( pFile != NULL )
	{
		fseek ( pFile, 0, SEEK_END );
		*size = ftell ( pFile );
		*Buffer    = (wchar_t *) malloc ( *size );
		fseek ( pFile, 0, SEEK_SET );
		fread ( *Buffer, sizeof(wchar_t), *size,  pFile );
	}
	fclose ( pFile ); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1356150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356150</guid><dc:creator><![CDATA[m0m0]]></dc:creator><pubDate>Fri, 31 Aug 2007 14:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 14:41:50 GMT]]></title><description><![CDATA[<p>wchar_t sind doch immer 2 Bytes. Ich glaub da gibts Probleme, wenn die Dateigröße nicht durch 2 Teilbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356154</guid><dc:creator><![CDATA[ähm]]></dc:creator><pubDate>Fri, 31 Aug 2007 14:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 14:53:28 GMT]]></title><description><![CDATA[<p>C&amp;P-Programmierung ... und so furchtbar viel (=alles) C drin...</p>
<pre><code class="language-cpp">fread ( *Buffer, sizeof(wchar_t), *size,  pFile );
</code></pre>
<p>das ist jedenfalls unsinn (es sei denn, es ist gerade mal sizeof(wchar_t)==1).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356161</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 31 Aug 2007 14:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 17:17:52 GMT]]></title><description><![CDATA[<p>Davon mal abgesehen das wir hier im C++-Teil sind ... guck dir nochmal den RC4A-Algo an ... <a href="http://de.wikipedia.org/wiki/RC4" rel="nofollow">http://de.wikipedia.org/wiki/RC4</a> hast nen Fehler drin ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356306</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 31 Aug 2007 17:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei verschlüsseln und ausgeben on Fri, 31 Aug 2007 18:54:53 GMT]]></title><description><![CDATA[<p>Interessante Sache, dieser RC4! Wikipedia nennt ihn ja sogar &quot;sicher&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Naja, jedenfalls hab ich ihn einfach mal programmiert, ist ja zum Glück recht simpel:</p>
<pre><code class="language-cpp">void Rc4( const char* input, char* output, unsigned int size, const char* key )
{
    unsigned int keylen = strlen(key);

    unsigned char s[256];
    for ( int i=0; i&lt;256; i++ )
        s[i] = i;

    for ( int i=0, j=0; i&lt;256; i++ )
    {
        j = (j + s[i] + key[i%keylen]) % 256;
        unsigned char c = s[i];
        s[i] = s[j];
        s[j] = c;
    }

    for ( int i=0, j=0, k=0; k&lt;size; k++ )
    {
        i = (i+1) % 256;
        j = (j+s[i]) % 256;
        unsigned char zufall = s[ (s[i]+s[j])%256 ];
        output[k] = zufall ^ input[k];
        unsigned char c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}
</code></pre>
<p>und etwas gekürzt, muss nicht unbedingt stimmen, sollte aber (:D):</p>
<pre><code class="language-cpp">void Rc4( const char* input, char* output, unsigned int size, const char* key )
{
    uint keylen = strlen(key);

    unsigned char s[256];
    for ( int z=0; z&lt;256; ++z )
        s[z] = z;

    unsigned char j = 0;
    for ( int z=0; z&lt;256; ++z )
    {
        j += s[z] + key[z%keylen];
            swap( s[z], s[j] );
    }

    j = 0;
    unsigned char i = 0;
    for ( unsigned int k=0; k&lt;size; ++k )
    {
        j += s[++i];
        unsigned char idx = s[i] + s[j];
        output[k] = s[idx] ^ input[k];
        swap( s[i], s[j] );
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1356381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356381</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 31 Aug 2007 18:54:53 GMT</pubDate></item></channel></rss>