Autor Beitrag
Johannes Maier
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Mo 26.07.04 14:20 
Hallo,

hab mich jetzt ein wenig (also vll eine Viertelstunde :) ) mit Bitoperatoren beschäftigt, und bin bei Delpi-Source.de auf diesen Quellcode für eine simple XOR-Verschlüsselung gestoßen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function XORString(Text, Schluessel: String): String;
var
  i, q: Integer;
begin
  q := 1;
  if Trim(Schluessel) = '' then
    Schluessel := 'adsfdaiuebranwruhwiernakb';
  for i := 1 to Length(Text) do begin
    Text[i] := Chr(Ord(Text[i]) xor Ord(Schluessel[q]));
    Inc(q);
    if q > Length(Schluessel) then
      q := 1;
  end;
  Result := Text;
end;

Der ist ja auch recht einleuchtend, jedoch kann ich meinen Namen (Johannes) nicht wieder entschlüsseln ;)
Ich denke doch jedenfalls mal, dass man diese XOR-Codierung durch zweifache Anwendung der Routine wieder rückgängig machen kann (was ja auch meistens klappt). Wenn ich jedoch "Johannes" kodiere und wieder dekodieren will, bekomme ich nur "Joh".
Ich vermute, dass es daran liegt, dass bei dieser einfachen Verschlüsselung bei der XOR-Verknüpfung ein Wert rauskommt, der als Zeichen nicht existiert :? Oder woran liegt es sonst?
Wäre auch nett, falls mir jemand eine kleine Änderung nennen könnte, womit man dann alles kodieren kann und auch wieder dekodieren. Bzw. eine Internetadresse, wo es eine aufschlussreiche XOR-Verschlüsselung mit Code zu sehen gibt, damit ich mir (nach Verständnis des Prinzips) vll. mal eine eigene bauen kann ;)
PS: Hab hier im Delphi-Forum nur die von MartinPb gefunden, mich aber noch nicht genauer damit auseinandergesetzt :oops:

_________________
MfG
Johannes ehem. jbmaier
Johannes Maier Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Mo 26.07.04 14:33 
Oh hab etwas gemerkt :oops: :
Wenn ich den verwendeten Schlüssel (war vorher zum Test 'aaaaa' ) verlängere, dann kann ich soweit alles kodieren. Es sei denn der zu kodierende Text ist wieder im Vergleich länger, denn dann fehlen mir am Schluss bei Dekodieren wieder etliche Zeichen.
Inwiefern hängt die Länge des Schlüssels mit der Länge des kodierten Textes zusammen, und wie lang muss ein Schlüssel sein, damit ich einen bestimmten Text auch wieder dekodieren kann?
Wollte noch was fragen, aber ist mir grade entfallen :oops: Ich schreibs nachher dazu, vorausgesetzt ich finds wieder in meinem Kopf :?

_________________
MfG
Johannes ehem. jbmaier
Johannes Maier Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Mo 26.07.04 16:39 
Hab gemerkt woran es liegt. Sobald im Schlüssel sowie im Text der gleiche Buchstabe auftaucht, schreibt er anscheinend nicht weiter. Wie könnte man dieses Problem beheben?
Ich hab jetzt auch mal das Ergebnis in ein Char-Array hineingeschrieben, aber dann fehlen danach trotzdem die restlichen Buchstaben :?

_________________
MfG
Johannes ehem. jbmaier
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mo 26.07.04 16:47 
Jep, weil das Ergebnis von 'a' xor 'a' = 0 ist. Und da die "Strings" in Windows (eigentlich nur ein Zeiger auf ein array of char) nullterminiert sind (das letzte Zeichen ist ein #0 - eben das Ergebnis von 'a' xor 'a'), denkt (ok, nicht wirklich...) Windows 'hoppla, da is der String zu Ende' und hört auf ihn im Edit oder Memo-Feld darzustellen.

raziel

_________________
JSXGraph
Johannes Maier Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173

Win XP
D7 Prof
BeitragVerfasst: Mo 26.07.04 18:23 
Hier ist der Code der verbesserten (noch nicht bugfreien) Version ;)
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
function EncodeXOR(Str, Key: String): String;
var
  i, q, StrLen, KeyLen: Integer;
  EncStr: String;
begin
  StrLen := Length(Str);
  KeyLen := Length(Key);
  SetLength(EncStr, StrLen);
  q := 1;
  for i := 1 to StrLen do begin
    if Str[i] <> Key[q] then
      EncStr[i] := Chr(Ord(Str[i]) xor Ord(Key[q]))
    else
      EncStr[i] := Chr(Ord(Str[i]) xor Ord('°'));
    Inc(q);
    if q > KeyLen then
      q := 1;
  end;
  Result := EncStr;
end;

function DecodeXOR(EncStr, Key: String): String;
var
  i, q, StrLen, KeyLen: Integer;
  DecStr: String;
begin
  StrLen := Length(EncStr);
  KeyLen := Length(Key);
  SetLength(DecStr, StrLen);
  q := 1;
  for i := 1 to StrLen do begin
    if Ord(EncStr[i]) xor Ord(Key[q]) = Ord('°') then
      DecStr[i] := Chr(Ord(EncStr[i]) xor Ord('°'))
    else
      DecStr[i] := Chr(Ord(EncStr[i]) xor Ord(Key[q]));
    Inc(q);
    if q > KeyLen then
      q := 1;
  end;
  Result := DecStr;
end;

Hier benutze ich jetzt ein sehr seltenes Zeichen (°) und encode damit, falls Key und Str gleich sind an einer Stelle. Falls jetzt dieses Zeichen jedoch ausnahmsweise im Text vorkommt, so wird daraus noch 'a' :wink: Aber das ist ja nciht mehr schlimm. Für meine Zwecke werde ich ° nie brauchen :D Falls ihr Verbesserungsvprschläge habt, her damit ;)

Aber für meine Zwecke dürfte eine solch einfache (auch einfach zu knackende) Verschlüsselung völlig reichen.

_________________
MfG
Johannes ehem. jbmaier