[C++] bei XOR-Verschlüsselung Zeichen ausschließen

  • Themenstarter Themenstarter Komand
  • Beginndatum Beginndatum
K

Komand

Hey Leute,

ich lerne seit etwa vier Wochen C++ mittels Buch (-"Einstieg in C++" von A. Willemer) und kleineren "Projekten".

Eines davon ist die XOR-Verschlüsselung, bei der ich folgende Schwierigkeit habe: Wenn ich beispielsweise "Himmel" mit "See" verschlüssele, besteht das verschlüsselte Wort zu einem Großteil aus Steuerzeichen. Nur selten taucht dort mal ein richtiger Buchstabe oder eine Zahl auf.

Meine Frage an euch lautet deshalb: Wie schließe ich die ersten 32 Zeichen der ASCII-Tabelle (-Steuerzeichen, deshalb unzweckmäßig) von meiner Verschlüsselung aus? Oder allgemeiner formuliert: Wie nehme ich Einfluss auf den Pool der Zeichen, die bei der Verschlüsselung mittes XOR verwendet werden?

Leider habe ich keine Idee, wie ich das Problem angehen kann, wahrscheinlich auch deshalb, weil ich die Verschlüsselung nur unzureichend verstehe.
Mein Compiler ist Dev-C++.

Vielen Dank für eure Hilfe!!

Viele Grüße, Komand
 
Meine Frage an euch lautet deshalb: Wie schließe ich die ersten 32 Zeichen der ASCII-Tabelle (-Steuerzeichen, deshalb unzweckmäßig) von meiner Verschlüsselung aus? Oder allgemeiner formuliert: Wie nehme ich Einfluss auf den Pool der Zeichen, die bei der Verschlüsselung mittes XOR verwendet werden?
Du könntest als zusätzlichen Schritt den verschlüsselten String eineindeutig in eine Darstellung transformieren, in der die Werte 0-31 nicht mehr auftauchen. Eine sehr einfache Methode wäre die Umwandlung in einen Hexadezimal-String (aus "\0\x12\xAB" wird also beispielsweise "0012AB"). Etwas kompliziertere Alternativen: Quoted Printable, Base64, UUencode.

Dabei sollte dir aber bewusst sein, dass die schöne Eigenschaft der XOR-Verschlüsselung, dass Ver- und Entschlüsselung identisch ablaufen, damit verloren geht. Außerdem verbraucht der verschlüsselte Text tendenziell mehr Speicher.

Grüße, Matthias
 
Hey Matthias,

ich fürchte, du überschätzt mein Wissen.
Etwas kompliziertere Alternativen: Quoted Printable, Base64, UUencode.
-fällt entsprechend raus.

Eine sehr einfache Methode wäre die Umwandlung in einen Hexadezimal-String (aus "\0\x12\xAB" wird also beispielsweise "0012AB")
Wie müsste ich das realisieren?

Dabei sollte dir aber bewusst sein, dass die schöne Eigenschaft der XOR-Verschlüsselung, dass Ver- und Entschlüsselung identisch ablaufen, damit verloren geht.
Worauf beziehst du das genau, lediglich auf die drei komplizierteren Alternativen oder auch auf die Hexadezimalvariante?

Vielleicht sollte ich noch erwähnen, dass ich die Verschlüsselung über Char-Arrays realisiert habe.

Gibt es keine direktere Möglichkeit Einfluss auf die Verschlüsselung zu nehmen?

Viele Grüße, Komand
 
Hallo Komand,

Wie müsste ich das realisieren?
Zunächst legst du dir einen neuen String passender Größe an. Dann durchläufst du den verschlüsselten String und wandelst jedes Zeichen in seine Hexadezimaldarstellung um (das ist der einzige Schritt, der vielleicht etwas komplizierter ist). Diese speicherst du dann an der korrespondierenden Stelle im neuen String ab.

Worauf beziehst du das genau, lediglich auf die drei komplizierteren Alternativen oder auch auf die Hexadezimalvariante?
Auf alle. Als du die XOR-Verschlüsselung implementiert hast, wird dir ja aufgefallen sein, dass zwischen Ver- und Entschlüsselung kein Unterschied besteht. Wenn du nach der eigentlichen Verschlüsselung aber noch eine solche Transformation durchführst, musst du diese vor dem Entschlüsseln erst wieder rückgängig machen.

Gibt es keine direktere Möglichkeit Einfluss auf die Verschlüsselung zu nehmen?
Nun... du könntest natürlich jedes Zeichen des Schlüssels vor der XOR-Operation zuerst mit 0x1F ver-unden. Dadurch wirkt sich das XOR dann nur noch auf die 5 niedrigstwertigen Bits aus. So werden ASCII-Zeichen auch wieder auf ASCII-Zeichen abgebildet.

Grüße, Matthias
 
Hi Matthias,

vielen Dank für deine Mühe!
Nun... du könntest natürlich jedes Zeichen des Schlüssels vor der XOR-Operation zuerst mit 0x1F ver-unden. Dadurch wirkt sich das XOR dann nur noch auf die 5 niedrigstwertigen Bits aus. So werden ASCII-Zeichen auch wieder auf ASCII-Zeichen abgebildet.

Das klingt doch sehr vielversprechend. Umsetzen wollte ich das mit
Code:
 for (i=0; i<MAX_length_password; i++)
 {
   password [i] & 0x1F;
 }

- leider ohne Erfolg. Ist denn meine "Verundungssyntax" korrekt (password[ i ] ist das Array, in das das Password - Schlüssel - gelesen wurde)? Positioniert habe ich diese Block direkt vor den Einleseblock des Passworts.

viele Grüße, komand
 
Zuletzt bearbeitet von einem Moderator:
Morgen sheel,

habs jetzt doch geschafft (hier stand nämlich gerade noch eine Riesenfrage ;-)) - Vielen Dank euch beiden!!

bis zur nächsten Frage :-), einen schönen Sonntag, komand
 
Zuletzt bearbeitet von einem Moderator:
Zurück