[CHANGE]fehler in xor verschlüsselung... 3 buffer io 2 buffer nio...



  • Irgendwer hatte dass schonmal erwähnt...
    Ich erinnere euch nochmal:
    Notepad++ und EXTERN MinGW, da Notepad++ keinen compiler mitliefert, dementsprechend auch kein Debugger.

    Also wie soll das funktionieren?



  • Also ich habe mir mal ausgeben lasen:

    geschrieben = fwrite( buf, sizeof(char), textPos, file );
    
    [...]
    
    printf( "\n\n%d =?= %d", textPos, geschrieben );
    

    Ich will überprüfen ob er mehr schreibt, als ich ihm sage... Er macht es nicht:

    ==========================
    Sie nutzen Version: 0.6.85
    ==========================
    
    Key: oli
    
    1024 =?= 1024
    
    530 =?= 530
    1554 Bytes bearbeitet!
    
    crypt state error
    

    Das ist meine Programmausgabe.

    1024 ist die Maximale buffergröße, und dann gibt er im 2ten durchlauf noch 530 aus, dass beides zusammen ergiebt 1554 bytes. So viele Zeichen sind in der Datei.

    Totzdem ist nach dem Programmlauf die Dateigröße bei 2048 Bytes( 2KiB halt ).
    Nach dem entschlüsseln ist die Dateigröße bei: 2578 Bytes,
    ABER: die letzten 1024 Zeichen sind kram, der Rest ist alles vernünftig...

    Nach dem Verschlüsseln sind 494 "NULL"s in der Datei am ende... 530+494 = 1024( 1 KiB )

    Er Schreibt aber doch lediglich 530Zeichen, wie kommen also diese dinger zu stande? MFG

    [edit]
    Das problem oben ist beseitigt...

    Ich habe ein interessantes anderes Problem.
    Während der Verschlüsseelung geht er so vor:

    3 Buffer werden vernünftig verschlüsselt,
    /wiederholung:...........................
    2 Buffer werden fehlerhaft verschlüsselt,
    1 Buffer wird richtig verschlüsselt
    ...........................:gnulohredeiw
    /

    Wie kommt sowas zu stande? Es ist eine Whileschleife:

    //solange das Ende der Datei nicht erreicht wurde UND kein fehler aufgetreten ist
    		while( ftell( file ) < endOfFile && 0 == end )
    		{
    			memset( buf, '\0', READSIZEcrypt );
    
    			read = 0;
    
    			while( read < READSIZEcrypt && ftell( file ) < endOfFile )
    			{
    				buf[read] = fgetc( file );
    				read++;
    			}
    
    			textPos = 0;
    
    			//Es werden so viele Zeich Ver- oder Entschlüsselt, wie eingelesen wurden.
    			do
    			{
    				//Ver- und Entschlüsseln
    				buf[textPos] = buf[textPos] ^ key[keyPos];
    
    				//Da der schlüssel oft kürzer als der zu verschlüsselnde Text ist, muss der schlüssel wiederholt werden
    				if( keyLen == keyPos )
    					keyPos = 0;
    				else
    					keyPos++;
    
    				textPos += 1;
    			}while( textPos < read );
    
    			//Wenn nicht alle einzulesenden Zeichen eingelesen wurden und die Datei nicht am Ende angelangt ist,
    			//ist ein Fehler aufgetreten
    			if( textPos < READSIZEcrypt && ftell( file ) < endOfFile )
    			{
    				end = 1;
    				*state = cTF_CANT_READ_ALL;
    			}
    			//Wenn nicht alle einzulesenden Zeichen eingelesen wurden und das Dateiende erreicht wurde,
    			//ist das Verschlüsseln erfolgreich abgeschlossen
    			else if( textPos <= READSIZEcrypt && ftell( file ) == endOfFile )
    				*state = cTF_READ_ALL;
    
    			fseek( file, zahl, SEEK_SET );
    			geschrieben = fwrite( buf, sizeof(char), read, file );
    
    			zahl += geschrieben;
    		}
    

    Programmausgabe:

    ==================================
    Sie nutzen Version: 1.15.17.080123
    ==================================
    
    Key: irgendwas
    
    4860 Bytes bearbeitet!
    Somit wurde die gesamte Datei bearbeitet
    
    Drücken Sie eine beliebige Taste . . .
    

    Anhand der Zeile unter der Byte zahl sieht man, dass das Program erfolgreich war.
    4860 entspricht der verwendeten Zeichen in der Datei und halt deren Größe in Bytes.



  • sorry für den 3. Post...
    Gibt es irgend ein Tool (keinen neuen Editor) der meinen Code schrittweise durchgeht?
    Ich meine es kann ja nicht sein, dass bei 1 funktion 2 gute ergebnisse 2 schlechte 1 gutes 2 schlechte... ergebnisse rauskommen...

    Irgendwo muss da ja ein fehler sein oder?...



  • Da gibt's sicher genug - such mal nach "Debugger" (sowas gibt's bestimmt auch ohne Komplett-IDE). Und wenn alle Stricke reißen, bleibt immer noch cerr-Debugging - du lässt dir an ausgewählten Stellen der Funktion deine Variableninhalte nach cerr/stderr ausgeben und vergleichst diese Werte mit deinen Erwartungen.



  • Ich bin hier und du nicht.5
    Ich bin hDrücken Sie eine beliebige Taste . . .
    ier und du nicht.6
    

    1ter Break... OK

    Ich bin hier und du nicht.0
    Ich bin hier und dDrücken Sie eine beliebige Taste . . .
    ier und du nicht.6
    Ich bin hier und du nicht.7
    

    Da Fehlt "u nicht.\nIch bin h" das sind 18 Zeichen!?

    Ich bin hier und du nicht.0
    Ich bin hier und dDrücken Sie eine beliebige Taste . . .
    ier und du nicht.6
    Ich bin hier und du nicht.7
    

    3ter Break... Fehler

    So siehts aus
    1 OK
    2 Falsch
    3 Falsch
    4 Falsch
    5 Falsch
    6 Falsch
    7 Falsch + schneidet Dateiende ab...

    hängt das mit folgendem zusammen:?

    memset( buf, '\0', READSIZEcrypt );
    read = 0;
    
    while( read < READSIZEcrypt && ftell( file ) < endOfFile )
    {
        buf[read] = fgetc( file );
        read++;
    }
    [...]
    fseek( file, zahl, SEEK_SET );
    geschrieben = fwrite( buf, sizeof(char), textPos, file );
    zahl += geschrieben;
    

    Ist da ein denkfehler drinne?



  • Schau mal:

    Ich bin hier und du nicht.0
    Ich bin hier und dDrücken Sie eine beliebige Taste . . .
    ier und du nicht.6
    Ich bin hier und du nicht.7
    

    nach 0 kommt 1 oder?
    Dort fehlen demnach 136 Zeichen...
    Wie kommt dass dass bei dem ersten überschnitt kein problem auftritt, und bei dem 2ten überschnitt (buffer-reload) auf einmal 136 Zeichen flöten gehen!??

    [edit]

    ==================================
    Sie nutzen Version: 1.15.28.080124
    ==================================
    
    Key: oli
    
    Pos: 0 <anfang :: ende> 1024
    Pos: 1024 <anfang :: ende> 2048
    Pos: 2048 <anfang :: ende> 3072
    Pos: 3072 <anfang :: ende> 4096
    Pos: 4096 <anfang :: ende> 5120
    Pos: 5120 <anfang :: ende> 6144
    Pos: 6144 <anfang :: ende> 7168
    Pos: 7168 <anfang :: ende> 7540
    
    7540 Bytes bearbeitet!
    Somit wurde die gesamte Datei bearbeitet
    

    Er geht alle Positionen richtig durch... Wieso funktioniert dass denn nicht?


Anmelden zum Antworten