Array verschlüsseln



  • Hallo meine Ausgaben sehen hier so aus:

    Encrypted: RTðVX
    Decrypted: 56¶78

    Wieso bekomme ich bei Decryptet nicht ABC D raus?

    Wenn zum verschlüsseln schreibe:
    n[i]= n[i]+1000;

    und zum entschlüsseln:
    n[i]= n[i]-1000;

    Dann funktioniert alles wie gewollt wieso funktioniert das ganze nicht wenn ich die Multiplikation mit einfüge?

    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    char n[]="\x41\x42\x00\x43\x44";
    
    cout<<"Encrypted: ";
    for(int i=0;i<sizeof(n)-1;i++)
    {
            n[i]= (n[i]+1000)*2;
            cout<<n[i];
    }
    
    cout<<endl;
    
    cout<<"Decrypted: ";
    for(int i=0;i<sizeof(n)-1;i++)
    {
            n[i]= (n[i]-1000)/2;
            cout<<n[i];
    }
    
    cout<<endl;
    
    system("PAUSE");
    return 0;
    }
    

  • Mod

    Überlauf.



  • Ausserdem machst Du zur Entschlüsselung nicht die inverse Operation zur Verschlüsselung. Probiers auf Papier aus. Nimm eine natürliche Zahl, und verschlüssele sie nach Deinem Algorithmus, dann entschlüssele das Ergebnis wieder.



  • Wie kann ich das den verschlüsseln das kein Überlauf auftritt?

    Hab ich da nur auf Binär ebene eine chance was zu machen? Also mit den Operatoren für Logische Vernknüpfungen. ( &, || , >>, << )

    Die XOR-Verschlüsselung kenne ich bereits aber ich wollte mal versuchen was eigenes zu bauen.

    Ich hab es jetzt mal so versucht und es funktioniert auch, der Hinweis mit dem Überlauf war gut danke.

    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    char n[]="\x41\x42\x00\x43\x44";
    int e[5]={0};
    
    cout<<"Encrypted: ";
    for(int i=0;i<sizeof(n)-1;i++)
    {
            e[i] = n[i];
            e[i]= e[i] << 2;
            cout<<e[i];
    }
    
    cout<<endl;
    
    cout<<"Decrypted: ";
    for(int i=0;i<sizeof(n)-1;i++)
    {
            e[i]= e[i] >> 2;
            n[i]=e[i];
            cout<<n[i];
    }
    
    cout<<endl;
    
    system("PAUSE");
    return 0;
    }
    


  • Oops hab meine Multiplikation vergessen funktioniert damit aber auch

    @SG1
    Habs gerade mal aufm Papier gerechnet und ja das mit der invers Operation funktioniert nicht.

    cout<<"Encrypted: ";
    for(int i=0;i<sizeof(n)-1;i++)
    {
            e[i] = n[i];
            e[i]= e[i] << 2 * 789;
            cout<<e[i];
    }
    
    cout<<"Decrypted: ";
    for(int i=0;i<sizeof(n)-1;i++)
    {
            e[i]= e[i] >> 2 * 789;
            n[i]=e[i];
            cout<<n[i];
    }
    

  • Mod

    Ar* schrieb:

    Ich hab es jetzt mal so versucht und es funktioniert auch, der Hinweis mit dem Überlauf war gut danke.

    Dann hast du es nicht verstanden. << hat auch ein Problem mit Überläufen. Addition und Subtraktion waren schon gut. Hier eine Erklärung, warum der Überlauf überhaupt ein Problem ist:

    8-Bit unsigned char Beispiel
    123 + 1000 = 99
    99 - 1000 = 123
    passt.
    123 * 4 = 236
    236 / 4 = 59
    passt nicht.
    123 << 4 = 176
    176 >> 4 = 11
    passt nicht.
    


  • Ah, ein char (1Byte, 8Bit) kann ja auch nur Zahlen bis maximal 255. Ich glaub jetzt wird es mir klar.

    Also sollte ich dann wohl in meinem Fall bei der Addition und Subtraktion bleiben.



  • Aber bei der Addition bzw. Subtraktion kann es ja auch zum Über bzw. Unterlauf dann kommen. Ich denke mal ich muss prüfen ob ein Über bzw. Unterlauf auftritt und dann an den ensprechenden Stellen den Algorithmus so schreiben das er z.b. nicht zu wenig und nicht zu viel Addiert bzw. Subtrahiert so das kein Über bzw. Unterlauf auftritt.
    Denke ich da in die richtige Richtung?


  • Mod

    Ar* schrieb:

    Denke ich da in die richtige Richtung?

    Nein. Guck nochmal mein Beispiel an (das zur Addition und Subtraktion) und rechne es nach. Beschäftige dich mit den grundlegenden Rechengesetzen der Integerdatentypen, wenn du nicht drauf kommst, wie das funktioniert.


Anmelden zum Antworten