Simple-XOR-Crypto

  • C++/CLI

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    Simple-XOR-Crypto

    Guten Tag,
    wie der Titel schon andeutet, möchte ich eine ganz simple XOR-Verschlüsselung veröffentlichen.
    Verfügbar ist es in C++ und in C#: github.com/AlHedi/Simple-XOR-Crypto

    Ich habe vor den Algorithmus zu verbessern, doch dies soll einfach eine Darstellung sein, wie ein Text mit der XOR-Methode verschlüsselt wird.
    Für den Privatgebrauch eignet sich dieser Algorithmus sehr gut, bei größeren Projekten, die einen höheren Datenschutz bieten möchten, lege ich andere Verschlüsselungsalgorithmen ans Herz (like AES, Blowfisch oder DES ).
    EMPIRE BUSINESS
    Sieh mal zu, dass Du Deine Parameter wie std::string als konstante Referenz übergibst, sonst wird das jedes Mal kopiert, was Performance und Speicher kostet. Warum eig. kein wstring?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade meinst du, dass der Parameter eine Referenz zur string Variable sein soll?
    falls ich nicht falsch liege:

    C-Quellcode

    1. void XOR_Crypto::Crypt(std::string &data)
    2. {
    3. int dataLength = data.length();
    4. int keyLength = strlen(key);
    5. for(int i = 0; i < dataLength; i++)
    6. for(int j = 0; j < keyLength; j++)
    7. data[i] = data[i] ^ (key[j] + i + j) % 255;
    8. }


    in dem Fall müsste das Beispiel so verwendbar sein:

    C-Quellcode

    1. #include "xor.h"
    2. #include <iostream>
    3. int main()
    4. {
    5. XOR_Crypto myEncryptionClass;
    6. std::string myPassword = "SPARTAisMyKey";
    7. myEncryptionClass.key = (char*)myPassword.c_str();
    8. std::string secretText = "Today we will meet in the outdoor-cinema!";
    9. myEncryptionClass.Crypt(secretText);
    10. std::cout << "Secret-Text-Encrypted: " << secretText << "\n";
    11. myEncryptionClass.Crypt(secretText);
    12. std::cout << "Secret-Text-Decrypted: " << secretText;
    13. getchar();
    14. return 0;
    15. }
    EMPIRE BUSINESS

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „.prox“ ()

    void XOR_Crypto::Crypt(const std::string& data). Wenn Du den Namespace importierst, kannst Du std:: btw weglassen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Oh, Du änderst das ja, fail. X( Ok, dann ist das ungültig. :P

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Grundsätzlich sollten Verschlüsselungen mit Bytes arbeiten, nicht mit Strings.
    Dass man Verschlüsselungen nicht selber basteln sollte, dürfte klar sein. Zum Probieren und Lernen ists natürlich OK ;)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hallo .prox

    Ich hab mir das kurz angeschaut, aber nicht getestet. Nur 2 Sachen sind mir aufgefallen.

    1. Warum setzt du einen Destruktor mit, wenn du sowieso kein 'new' benutzt.

    C-Quellcode

    1. delete[] key;//falsch


    2. Was machst du wenn in der XOR-Berchnung das Resultat 0 ergibt. 0 kann nicht mehr zurückkonvertiert werden. Da würde ich eine sicherheit einbauen.

    C-Quellcode

    1. data[i] = data[i] ^ (key[j] + i + j) % 255 //fraglich wenn 0



    P.S. Auch ich hätte da mit den 'bytes' gearbeitet. In C/C++ wäre das also 'char* oder 'wchar_t*' .


    Freundliche Grüsse

    exc-jdbi
    Dein Algorithmus ist, wie schon angedeutet, nicht invertierbar und damit leider unbrauchbar. Beispiel: plain = "\xF0", key = "\x0F".

    Ein primitiver XOR-Verschlüsselungsalgorithmus in Form von Vigenère sieht übrigens so aus: output[i] = input[i] ^ key[i % keylen];.
    Als OTC (also mit len(data) = len(key), key rein zufällig und nur einmalige Verwendung, sichere Übertragung des Schlüssels etc.) hast du damit sogar die sicherste Verschlüsselungsmethode die es gibt. Sicherer als AES. Leider nur nicht praxistauglich.
    @exc-jdbi pointers sollte man doch immer zerstören, falls sie nicht mehr benötigt werden, denn sie werden ja auf dem Heap gespeichert?
    Oder möchtest du sagen, dass mit dem 'new' erstmals Speicher auf dem Heap zugeweist wird? Wäre interessant zu wissen. Thx
    Achja wie erwähnt, die Verschlüsselung ist nur für den Privatgebrauch, ich hatte nicht vor mich mit allen Problemstellungen zu befassen, die bei einer Verschlüsselung wichtig sind.

    @3daycliff du hast es selber erwähnt, wer verschlüsselt seine Daten mit einem one-time-pad, wenn er sie wieder entschlüsseln möchten? Ja es ist logisch das es unknackbar ist, weil man ja nicht weiß was der Verschlüsselte-Text ist. Aufjedenfall danke, hat mir ein bisschen Licht gebracht :')
    EMPIRE BUSINESS
    Guten Morgen .prox

    de.wikibooks.org/wiki/C%2B%2B-…erung/_Speicherverwaltung
    Ich will nur damit sagen, dass "new" + "delete" immer zusammengehören. In deinem Code weist du Key so zu

    C-Quellcode

    1. std::string myPassword = "SPARTAisMyKey";

    In diesem Falle übernimmt 'std:string' die komplette Speichervewaltung, und du musst dich nicht darum kümmern.

    Würdest du hingegen den Code umändern und myPassword neu allozieren wie z.B.

    C-Quellcode

    1. char pw[] = "SPARTAisMyKey";
    2. char *myPassword = new char [std::strlen(pw)+1];
    3. memset(myPassword,0,std::strlen(pw)+1);
    4. memcpy(myPassword,pw,std::strlen(pw));

    so wäre der jetzige Destruktor mit delete berechtigt.

    Einen Pointer kannst du mit 'NULL' zurücksetzen. Beim Allozieren von neuem Speicher mit new besteht zwar auch ein Pointer, aber hier geht es primär darum den Speicher freizugeben. Darum würde ich das z.B. so machen.

    C-Quellcode

    1. delete[] ptrAlloc;
    2. ptrAlloc=NULL;


    Edit: zum Teil unglückliche Beschriebung

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    hey @exc-jdbi

    C-Quellcode

    1. char* test = "Guten Tag!"; // Werden hier nicht 10 bytes reserviert ( inklusive \0 = 11 bytes )
    2. char* test2 = new char[10]; // hier werden auch 10 bytes reserviert

    Sollte man test freigeben bspw mit free, und test2 zerstören?
    EMPIRE BUSINESS
    Löschen halt immer, wenn Du explizit Speicher allokierst.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: