Verschlüsselung macht Probleme



  • Guten Tag

    Ich habe ein kleines, einfaches verschüsselungsprogramm geschrieben.
    Es verschlüsselt Dateien, indem ein Schlüssel (Passwort) eingelesen wird und dann zeichen für zeichen mit einer der ersten 100 000 stellen von PI (aufgeteilt in fünfstellige zahlen und alle nullen durch einsen ersetzt) multipliziert und dann mit dem zeichen der datei addiert. Der Anfangspunkt für das PI-Array ist durch die Länge des Passwortes bestimmt.

    Hört sich vielleicht etwas kompliziert an, aber ich hoffe trotzdem dass ihr mir helfen könnt, mein problem ist nämlich folgendes: Das Passwort kann nur maximal 7 Stellen lang sein, sonst bricht das programm plötzlich ab, das kann ich mir absolut nicht erklären! Bei passwörtern bis 7 zeichen wird perfekt ver- und entschlüsselt. Der quellcode ist dank dem pi-array recht gross, desshalb gibts nen Link zum source. Ich hab versucht den code so übersichtlich und standartnah wie möglich zu halten, abgesehen von system("cls"); ...

    Hier der Link: http://people.freenet.de/DerGottschalk/Krypt.zip

    Vielen Dank im Voraus



  • lol. das ist mal ein innovatives verfahren!



  • An Volkard:

    Na ja ich wollts halt einigermaßen sicher gestalten... is ja auch egal, ich will nur wissen wieso ich da nur 7 stellen Passwörter eingeben kann 😞



  • hi,

    hab zwei sachen zu deinem programm:

    void ver(string Ein, string Aus, string passwort)
    {
         int laenge=strlen(passwort.c_str()); // ??? warum nich passwort.size()
    

    und ...
    der fehler kommt wahrscheinlich aus der zeile:

    int j=laenge*schluessel[laenge-1];
    

    lass dir ma j ausgeben. das is bei 8 zeichen > 25000 und
    das pi-feld hat nur 20000 elemente...



  • Aaalso, zu strlen() : Kein Plan, ich benutz es einfach, ist bla.size() so viel besser?

    zum anderen: Eigentlich sollte es ja auch so sein, das wieder von vorne begonnen wird, wenn das array durchlaufen ist...aber ich glaub ich hab den fehler grad, ich schau mal...Danke schonmal!



  • Nur mal so:
    ich würde statt

    if(i == laenge)
    {
    i=0;
    }
    if(j==20000)
    {
    j=0;
    }
    einfach

    i%=laenge;
    j%=20000;

    schreiben.
    (Meine Mathelehrerin hat mal gesagt, ich würde modulo lieben...)
    Das entspricht dann:
    i=i mod laenge
    j=j mod 20000

    Wenn du modulo nicht kennst: (a mod b) steht für den Rest bei der Division von a durch b:
    1 mod 5 = 1
    3 mod 5 = 3
    15 mod 5 = 0
    233 mod 5 = 3

    Oder seh ich den Sinn dieser paar Zeilen da falsch?



  • Das Problem IST die Zeile!
    Mein Vorschlag mit j%=20000 behebt dass Problem, oder j >= statt j==20000.

    int j=laengeschluessel[laenge-1];
    8
    schluessel[8-1];
    schluessel[i]=passwort[i](laenge+ii)
    schluessel[7]=passwort[7](8+77)
    passwort[7] ist vom Typ 0..255
    =>255*(8+7*7)*8=116280

    Damit ist 116280==20000 false, aber 116280%20000 wäre 16280. Problem behoben.

    Oder sehe ich da was falsch?



  • Also ich muss sagen ich verstehe das grad nicht ganz...

    Also, wenn j, die zählervariable gleich 20 000 ist, soll sie wieder auf null springen...Was du da mit dem module vor hast, kapier ich ehrlichgesagt überhaupt nicht O.o



  • Dein j wird nur auf 20000 gesetzt, falls es jemals auf 20000 kommt, aber es kann mit einem Wert über 20000 in die Schleife kommen, wodurch 20000==j für j>20000 natürlich false ist. Da j bereits über 20000 ist, wird es NIE zurückgesetzt. Ändere die Bedingung von j==20000 in j>=20000 und alles klappt.
    Modulo bewirkt im Prinzip, dass j bei j%=20000 nur im Bereich[0,19999] existiert, indem es solange 20000 von j abzieht, bis j wieder unter 20000 ist.

    Wenn du immer noch nicht weist, wass ich meine, rechne mal den Teil durch:

    Für laenge=8 und passwort[7]=122 //Entspricht einem im Passwort "z"

    while(i<laenge)
              {
              schluessel[i]=passwort[i]*(laenge+i*i);
              i++;
              }
    
         int j=laenge*schluessel[laenge-1];
    
         ifstream in(Ein.c_str());
         ofstream out(Aus.c_str());
    
         i=0;
    
         while(in.get(ch))
              {
              if(i == laenge)
                   {
                   i=0;
                   }
              if(j==20000)
    

    //Hier beträgt j dann 55632 und damit ist j==20000 falsch!



  • Ahhh stimmt, jetzt hab ichs kapiert!!

    Vielen Dank!!!


Anmelden zum Antworten