Autor Beitrag
huhn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Mi 07.12.05 21:04 
Hi leute!
ich hab ja schon einiges mit XOR gemacht, darunter auch ein OTP-crypter mit psyeudozufallsgeneratot. Aber irgendwie stoße ich gerade an meine grenze...
ich wollte nur mal schwind einen Text verschlüsseln mit XOR was aber nicht klappt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function crypt(str:string):string;
var z,w:integer;
    r:string;
const dec:string='Jamaica';
begin
r:=str;
w:=length(r);
for z:=1 to w do
    r[z]:=char(byte(dec[z mod length(dec)]) xor byte(r[z]));
result:=r;
end;

procedure TForm1.Button20Click(Sender: TObject);
var z:string;
begin
z:=crypt(memo1.text);
memo1.Text:=z;
end;

"hallo wie geht es dir? mir geht es gut!"<--zu verschlüsselner text
Leider funktioniert diese funktion nicht, da er schon nach dem ersten zeichen ohne fehlermeldung oder ähnlichen abbricht.
Es scheint irgendwie an dem "J" zu hängen aber hab kein plan wieso????
Natürlich würde diese funktion funktionieren wenn ich [(z-1) mod length(dec)] sagen würde, jedoch wird dann das erste zeichen immer übersprungen, was ich nicht will.
ich hoffe ihr könnt mir helfen :crying:
ich weiß das XOR schon oft hier dran war und ich hab auch die suche betätigt und quelltexte benutzt, jedoch stand ich immer vor dem selben problem.

mfg huhn


ps: ich steh wahrscheinlich wahnsinnig aufm schlauch und spring nachher ausm fenster vor wut, weil der fehler so leicht war^^

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 07.12.05 21:09 
z mod length(dec) liefert eine Zahl von 0..length(dec)-1, sollte aber 1..length(dec) sein, denn Strings sind 1-basiert indiziert.

_________________
Na denn, dann. Bis dann, denn.
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Mi 07.12.05 21:17 
aber das hier liefert mir 1????
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
//das hier 1
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(1 mod 12));
end;
//das hier 0
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(0 mod 12));//da 1-1=0
end;


und dann bleibt noch immer die tatsache das immer wenn es auf "J" wieder käme(wenn z-1) das es nicht kodiert. oder stimmt da was nicht bei mir?

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: Mi 07.12.05 21:50 
Was alzaimar schrieb, ist erstmal grundsätzlich richtig - korrigier erstmal diesen Fehler und teste dann nochmal.

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Mi 07.12.05 22:17 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function decrypt(str:string):string;
var z,l:integer;
    r:string;
const dec:string='Jamaicaner';
begin
r:=str;
l:=length(r);
for z:=1 to l do
    r[z]:=char(byte(dec[(z-1mod length(dec)]) xor byte(r[z]));//bzw (z+1)
result:=r;
end;

mein quelltext sieht nun so aus, für mich scheint es zwar unlogisch zu sein aber erstmal egal. also funktionieren tut es noch immer nicht, es verschlüsselt immer nut teile, jedoch nicht den kompletten text.
so wird in meinen bsp-text nur bis zum ersten "?" verschlüsselt bei -1.
wenn ich z+1 mache wird mein bsp text komplett verschlüsselt jedoch nicht andere texte komplett.
mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 07.12.05 22:23 
Huhn, schau doch mal:

    z z mod 8
    1 1
    2 2
    ..
    7 7
    8 0

Du willst aber etwas Anderes. Du möchtest

    1 1
    2 2
    ...
    7 7
    8 8
    1 1

Statt 'z mod Length(r)' musst Du '(1 + (z-1) mod Length (r))' schreiben (probier's aus). Bei mir geht es dann jedenfalls.
Aber daran liegts eh nicht, das die Schleife gar nicht durchlaufen wird.
Schalte mal alle Warnungen, overflow und rangechecks *an*. Das solte man sowieso (in den Compileroptionen des Projektes).

_________________
Na denn, dann. Bis dann, denn.
Sirke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 208
Erhaltene Danke: 2



BeitragVerfasst: Mi 07.12.05 22:30 
Was alzaimar über das modulo-Problem schreibt stimmt schon, das musst du mit der Addotion von 1 lösen !

Aber um zu deinem Abbruch-Problem zu kommen:
Es ist kein Fehler im Quelltext, sonder die Wahl der falschen Zeichen!

Wenn du die gewählten Zeichen verschlüsselst, kommt eine Zahl die kleiner als 33 ist heraus. Diese Zeichen sind nicht darstellbar und brechen meist eine Zeichenkette ab. Wenn du stattdessen das Ergebnis mit IntToHex() ausgibst oder andere Zeichen (wobei auch dort wieder solche Werte entstehen können) verwendest, sollte de gesamte Kette verschlüsselt werden.

MfG Sirke
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: Do 08.12.05 07:13 
Kurzer Ausreißer in dem Post über meinem jetzigen: das Leerzeichen hat den ASCII Code 32 (0x20) und ist noch darstellbar, alle anderen darunter (0-31, 0x0-0x1F) sind Steuerzeichen!

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Do 08.12.05 15:32 
ok das beantwortet mein frage mit dem zeichen unter 32!
daran wirds wohl legen, deswegen hatte ich auch früher keine probleme...
das mit dem mod hab ich jetzt auch kapiert,
war gestern wohl einfach doch schon zu spät :autsch:
naja ich danke euch!
mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*