<?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[Bitfehler im Code?]]></title><description><![CDATA[<p>Hi,<br />
Seid ein paar Stunden such ich schon nach der Lösung meines Problems, aber finde absolut keine. Hoffe ihr habt ne Idee und ich schaffe es, das Problem ohne zu viel Code zu veranschaulichen.<br />
Also, seid ein paar Woche beschäftige ich mit Kryptographie und dem Feistlnetzwerk/Blowfishalgorythmus. Hab vor ein paar Tagen meine eigene Version vom Feistelnetzwerk fertig geschrieben und wollte die heute erweitern.</p>
<p>Das Problem:<br />
Ich habe/will eine Funktion schreiben, die den Schlüssel automatisch, aufgrund der Klartextlänge und andere Parameter erstellt. Das klappt auch ganz gut, einzele Buchstaben werden auch prima Kodiert und Dekodiert. Aber wenn die Länge des Klartextes &gt;= 4 ist, dann stimmt (bei z.B. einer Klartextlänge von 4 Buchstaben) der erste und der letzte Buchstabe nicht mehr. Komisch finde ich, dass es bei einzel Buchstaben ohne Probleme geht, bzw. bei einem statischen Key (z.B. immer = A) es auch IMMER (egal wie lang der Klartext ist) geht.</p>
<p>Hier der Code, der den Key generiert:</p>
<pre><code class="language-cpp">void Kodieren::GenerateKey(unsigned int length)
{
    //KeyIndex ist member von Kodieren und sagt wo man sich (beim Kodiere/Dekodiern) beim Schlüssel befindet
    //Key ist ebenfalls member 
    KeyIndex = 0;
    for (unsigned int i = 0; i &lt;= 14; i++)
    {
        Key[i] = (length*i + 50) &gt;&gt; 4 ;                             //max 4Bit pro Zeichen, bei &gt;4 output Bit &gt;8 = nicht nachvollziehbar
        //Key[i] = 65 &gt;&gt; 4; //Geht ohne Probleme....
    }
}
</code></pre>
<p>Hier der Aufruf:</p>
<pre><code class="language-cpp">void Kodieren::StringKodieren(char *string, unsigned int runden, bool kodieren)
{
    //bool kodieren, sagt ob kodiert oder dekodiert werden soll
    //string = Klartext bzw. zuKodieren String,
    unsigned char rechts = 0;
    unsigned char links = 0;

    unsigned int size = StringLength(string);                       //Stringlänge herausfinden
    GenerateKey(size);                                              //Key generieren

    for (unsigned int i = 0; i &lt; size; i++)
    {
        Aufteilen(string[i],&amp;rechts, &amp;links);                       //Zeichen[i] von String in 2, 4Bit Blöcke teilen
        for (unsigned int j = 0; j &lt; runden; j++)                   //In X Rnden alles kodieren(mit Key XORNEN)
        {
            if (kodieren) feistel(&amp;links,&amp;rechts);                  //Kodieren
            if (!kodieren) feistel(&amp;rechts,&amp;links);                 //Umgekehrter Aufruf-&gt;Dekodieren
        }
        string[i] = Zusammensetzen(links,rechts);                   //Blöcke wieder zusammenbauen
    }
}
</code></pre>
<p>Hier die main Funktion</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Kodieren.h&quot;

int main()
{
    char string[256] = {'\0',};
    Kodieren kod;
    std :: cout &lt;&lt; &quot;Geben Sie den zu verschluesselnden Text ein: &quot; &lt;&lt; std :: endl;
    std :: cin.getline(string,256);
    //KODIEREN/DEKODIERE sind defines
    kod.StringKodieren(string, 5, KODIEREN);
    std :: cout &lt;&lt; string &lt;&lt; std :: endl;

    kod.StringKodieren(string, 5 , DEKODIEREN);
    std :: cout &lt;&lt; string &lt;&lt; std :: endl;
}
</code></pre>
<p>Der Key ist immer gleich, ob ich kodiere oder dekodiere und das Programm (sollte), da es bei einem statischen Key bzw. eizel Buchstaben geht ohne Probleme Funktionieren, aber tuts ja halt nicht <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="😃"
    /></p>
<p>Kann es sein, dass ich trotz der 4Bit irgendwo was unterschlage oder so?<br />
Oder läuft vllt KeyIndex falsch, sodass ich einen andern Key zum Kodieren/Dekoieren verwende? Wobei das nicht sein kann, da KeyIndex bei Dekodieren und Kodiere am Ende immer gleich ist.</p>
<p>Danke schonmal, wenn ihr noch Code braucht, sagt's <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Edit:<br />
Hier nochmal der Code, wo der Key benutzt wird:</p>
<pre><code class="language-cpp">//ganz einfache Funktion, willst erstmal nur probieren :D
unsigned char Kodieren::VerbindeKey(unsigned char zeichen)
{
    zeichen = zeichen^Key[KeyIndex];                                //Die eigentliche Funktion, die mit Key verbindet

    KeyIndex++;
    if (KeyIndex &gt; 14) KeyIndex = 0;                                //Wenn Schlüssel einmal durch, wieder von vorne

    return zeichen;
}

//Verrechnet die Blöcke (mit verschlüsselung)
void Kodieren::feistel(unsigned char *links, unsigned char *rechts)
{
    unsigned char LiAlt = *links;                                   //Links speichern
    *links = *rechts;
    *rechts = LiAlt^VerbindeKey(*rechts);                           //rechts(mit Key) mit links XORnen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/186264/bitfehler-im-code</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 09:53:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186264.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Jul 2007 15:37:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bitfehler im Code? on Fri, 06 Jul 2007 15:46:09 GMT]]></title><description><![CDATA[<p>Hi,<br />
Seid ein paar Stunden such ich schon nach der Lösung meines Problems, aber finde absolut keine. Hoffe ihr habt ne Idee und ich schaffe es, das Problem ohne zu viel Code zu veranschaulichen.<br />
Also, seid ein paar Woche beschäftige ich mit Kryptographie und dem Feistlnetzwerk/Blowfishalgorythmus. Hab vor ein paar Tagen meine eigene Version vom Feistelnetzwerk fertig geschrieben und wollte die heute erweitern.</p>
<p>Das Problem:<br />
Ich habe/will eine Funktion schreiben, die den Schlüssel automatisch, aufgrund der Klartextlänge und andere Parameter erstellt. Das klappt auch ganz gut, einzele Buchstaben werden auch prima Kodiert und Dekodiert. Aber wenn die Länge des Klartextes &gt;= 4 ist, dann stimmt (bei z.B. einer Klartextlänge von 4 Buchstaben) der erste und der letzte Buchstabe nicht mehr. Komisch finde ich, dass es bei einzel Buchstaben ohne Probleme geht, bzw. bei einem statischen Key (z.B. immer = A) es auch IMMER (egal wie lang der Klartext ist) geht.</p>
<p>Hier der Code, der den Key generiert:</p>
<pre><code class="language-cpp">void Kodieren::GenerateKey(unsigned int length)
{
    //KeyIndex ist member von Kodieren und sagt wo man sich (beim Kodiere/Dekodiern) beim Schlüssel befindet
    //Key ist ebenfalls member 
    KeyIndex = 0;
    for (unsigned int i = 0; i &lt;= 14; i++)
    {
        Key[i] = (length*i + 50) &gt;&gt; 4 ;                             //max 4Bit pro Zeichen, bei &gt;4 output Bit &gt;8 = nicht nachvollziehbar
        //Key[i] = 65 &gt;&gt; 4; //Geht ohne Probleme....
    }
}
</code></pre>
<p>Hier der Aufruf:</p>
<pre><code class="language-cpp">void Kodieren::StringKodieren(char *string, unsigned int runden, bool kodieren)
{
    //bool kodieren, sagt ob kodiert oder dekodiert werden soll
    //string = Klartext bzw. zuKodieren String,
    unsigned char rechts = 0;
    unsigned char links = 0;

    unsigned int size = StringLength(string);                       //Stringlänge herausfinden
    GenerateKey(size);                                              //Key generieren

    for (unsigned int i = 0; i &lt; size; i++)
    {
        Aufteilen(string[i],&amp;rechts, &amp;links);                       //Zeichen[i] von String in 2, 4Bit Blöcke teilen
        for (unsigned int j = 0; j &lt; runden; j++)                   //In X Rnden alles kodieren(mit Key XORNEN)
        {
            if (kodieren) feistel(&amp;links,&amp;rechts);                  //Kodieren
            if (!kodieren) feistel(&amp;rechts,&amp;links);                 //Umgekehrter Aufruf-&gt;Dekodieren
        }
        string[i] = Zusammensetzen(links,rechts);                   //Blöcke wieder zusammenbauen
    }
}
</code></pre>
<p>Hier die main Funktion</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Kodieren.h&quot;

int main()
{
    char string[256] = {'\0',};
    Kodieren kod;
    std :: cout &lt;&lt; &quot;Geben Sie den zu verschluesselnden Text ein: &quot; &lt;&lt; std :: endl;
    std :: cin.getline(string,256);
    //KODIEREN/DEKODIERE sind defines
    kod.StringKodieren(string, 5, KODIEREN);
    std :: cout &lt;&lt; string &lt;&lt; std :: endl;

    kod.StringKodieren(string, 5 , DEKODIEREN);
    std :: cout &lt;&lt; string &lt;&lt; std :: endl;
}
</code></pre>
<p>Der Key ist immer gleich, ob ich kodiere oder dekodiere und das Programm (sollte), da es bei einem statischen Key bzw. eizel Buchstaben geht ohne Probleme Funktionieren, aber tuts ja halt nicht <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="😃"
    /></p>
<p>Kann es sein, dass ich trotz der 4Bit irgendwo was unterschlage oder so?<br />
Oder läuft vllt KeyIndex falsch, sodass ich einen andern Key zum Kodieren/Dekoieren verwende? Wobei das nicht sein kann, da KeyIndex bei Dekodieren und Kodiere am Ende immer gleich ist.</p>
<p>Danke schonmal, wenn ihr noch Code braucht, sagt's <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Edit:<br />
Hier nochmal der Code, wo der Key benutzt wird:</p>
<pre><code class="language-cpp">//ganz einfache Funktion, willst erstmal nur probieren :D
unsigned char Kodieren::VerbindeKey(unsigned char zeichen)
{
    zeichen = zeichen^Key[KeyIndex];                                //Die eigentliche Funktion, die mit Key verbindet

    KeyIndex++;
    if (KeyIndex &gt; 14) KeyIndex = 0;                                //Wenn Schlüssel einmal durch, wieder von vorne

    return zeichen;
}

//Verrechnet die Blöcke (mit verschlüsselung)
void Kodieren::feistel(unsigned char *links, unsigned char *rechts)
{
    unsigned char LiAlt = *links;                                   //Links speichern
    *links = *rechts;
    *rechts = LiAlt^VerbindeKey(*rechts);                           //rechts(mit Key) mit links XORnen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1319815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319815</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Fri, 06 Jul 2007 15:46:09 GMT</pubDate></item><item><title><![CDATA[Reply to Bitfehler im Code? on Mon, 09 Jul 2007 08:36:23 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht ganz sicher, aber möglicherweise gibt es Probleme, wenn die Schlüsselzeichen größer werden als 15 (Überläufe bei der XOR-Verrechnung).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321221</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 08:36:23 GMT</pubDate></item><item><title><![CDATA[Reply to Bitfehler im Code? on Mon, 09 Jul 2007 12:28:45 GMT]]></title><description><![CDATA[<p>Hmm,<br />
Also ein Fehler, den ich noch gefunden habe ist, dass ich den (im gewissen Sinne) Schlüssel auch rückwärts anweden muss.<br />
Bei 5 Runden wir ja immer mit Schlüssel 0,1,2,3,4 geXORt, dann mit 5,6,7,8,9 usw.<br />
Durch die Erstellung des Keys, auf die Weise von mir kam es zu Bitzusammenstellungen wie (für die erste Runde, also Schlüssel 0,1,2,3,4) : 11,11,11,11,10.</p>
<p>Bei dekodieren habe ich den Schlüssel dann (richtig)falsch herum angewand. Also so:<br />
11,11,11,11,10</p>
<p>Da kann dann ja aber nur murks rauskommen, da beim kodieren das letzte Zeichen des Buchstaben mit 10 geXORt wurde anstatt mit 11. Also muss ich den Schlüssel beim Dekodieren sozusagen umdrehen, also den Benutzen:<br />
10,11,11,11,11</p>
<p>Ist nen bissel kompliziert geschrieben, aber ich hoffe damit gehts nun bei mir. Muss nach weitern Bugs nochmal suchen.<br />
Komisch finde ich nur, dass bei keinem, der mir vorliegenden Artikel zu dem Thema (sowohl mit, also auch ohne Code) auf diese Thematik eingegangen wird, da das Feistelnetzwerk immer nur mit einem Schlüssel wie &quot;5&quot; beschrieben wird...<br />
Überall steht zwar, dass beim Dekodieren alles umgekehrt angewand wird, aber selbst bei Wikipedia in der Formel wird nicht der genau Rundenschlüssel gekennzeichnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321481</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:28:45 GMT</pubDate></item><item><title><![CDATA[Reply to Bitfehler im Code? on Mon, 09 Jul 2007 22:42:48 GMT]]></title><description><![CDATA[<p>Äh. Ich weiss nicht genau was du mit &quot;max 4Bit pro Zeichen&quot; meinst, aber wenn ichs mal so verstehe wie ich es eben verstehe...:</p>
<pre><code class="language-cpp">//Key[i] = (length*i + 50) &gt;&gt; 4 ;
Key[i] = ((length*i + 50) &amp; 0xF0) &gt;&gt; 4 ;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1321887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321887</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Jul 2007 22:42:48 GMT</pubDate></item><item><title><![CDATA[Reply to Bitfehler im Code? on Tue, 10 Jul 2007 08:32:10 GMT]]></title><description><![CDATA[<p>Wenn ich den Schlüssel mit einem Zeichen verbinde und eines der Beide (egal ob Schlüssel oder das Zeichen) länger als 4Bit ist,fällt unter Umständen ein Bit beim Verbinden weg. Dies hätte dann zur Folge, dass man den Code nur schlecht wieder dekodieren könnte.<br />
Darum kürze ich den Teilschlüssel einfach, die restlichen Bit, die dabei wegfallen sind mir egal.<br />
So haben die beiden Anweisungen (also deine und meine) den selben Effekt, ich sehe keinen Vorteil in der vorherigen Verbindung mit 0xF0 oder ich hab da was übersehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322039</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Tue, 10 Jul 2007 08:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to Bitfehler im Code? on Tue, 10 Jul 2007 08:37:20 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Wenn ich den Schlüssel mit einem Zeichen verbinde und eines der Beide (egal ob Schlüssel oder das Zeichen) länger als 4Bit ist,fällt unter Umständen ein Bit beim Verbinden weg. Dies hätte dann zur Folge, dass man den Code nur schlecht wieder dekodieren könnte.<br />
Darum kürze ich den Teilschlüssel einfach, die restlichen Bit, die dabei wegfallen sind mir egal.</p>
</blockquote>
<p>Und das machst du nicht konsequent genug. Der Ausdruck 'length*i+50' kann durchaus zu groß werden, um in einem Byte untergebracht zu werden. Und die dabei &quot;überstehenden&quot; Bits bleiben im fertigen Schlüssel stehen - mit genau den Konsequenzen, die du vermeiden wolltest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322044</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 Jul 2007 08:37:20 GMT</pubDate></item><item><title><![CDATA[Reply to Bitfehler im Code? on Tue, 10 Jul 2007 09:14:47 GMT]]></title><description><![CDATA[<p>Ok, hab ich doch was übersehen, danke.<br />
Ich werds anpassen <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322082</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Tue, 10 Jul 2007 09:14:47 GMT</pubDate></item><item><title><![CDATA[Reply to Bitfehler im Code? on Tue, 10 Jul 2007 12:19:02 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Wenn ich den Schlüssel mit einem Zeichen verbinde und eines der Beide (egal ob Schlüssel oder das Zeichen) länger als 4Bit ist,fällt unter Umständen ein Bit beim Verbinden weg. Dies hätte dann zur Folge, dass man den Code nur schlecht wieder dekodieren könnte.<br />
Darum kürze ich den Teilschlüssel einfach, die restlichen Bit, die dabei wegfallen sind mir egal.<br />
So haben die beiden Anweisungen (also deine und meine) den selben Effekt, ich sehe keinen Vorteil in der vorherigen Verbindung mit 0xF0 oder ich hab da was übersehen...</p>
</blockquote>
<p>Du kannst auch &amp; 0xFF schreiben, oder nach dem Shiften &amp; 0xF, auf jeden Fall musst du die &quot;zuviel Bits&quot; irgendwie wegbringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322244</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Jul 2007 12:19:02 GMT</pubDate></item></channel></rss>