Autor |
Beitrag |
Master_of_Magic
      
Beiträge: 56
Win 98, Win XP
D6 Pers, D2005 Arch
|
Verfasst: Di 12.07.05 23:23
Ich hab ein Tool, in den ein String verschlüsselt werden muss. Da die Verschlüssung nicht 100% sicher sein muss (hauptsache der String ist nicht ohne weiteres lesbar) hab ich mich für ne einfach XOR Verschlüsselung mit Random One-Time-Pad entschieden. Da ich mit XOR kaum Erfahrung habe, hab ich einfach einen Codeschnipsel hier aus dem Forum verwendet und für meine Verwendung umfunktioniert. Die Verschlüsselung sieht momentan ungefähr so aus(gekürzt):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.cmdencrypt(Sender: TObject); var idcomb,actid:String; text:array of byte absolute idcomb; key,verschtext:array[0..64] of byte; Reg:TRegistry; i,init:integer; begin idcomb:='Dieser String wird verschlüsselt'; init:=32541187; RandSeed:=init; for i:=0 to (Length(idcomb)) do key[i]:=random(255); for i:=0 to (Length(idcomb)) do verschtext[i]:=text[i] xor key[i]; for i:=0 to (Length(idcomb)) do actid:=actid + Inttohex(verschtext[i],0); actid:=actid+inttohex(init,0); end; |
Soweit, sogut. Mit dieser Funktion als Basis hab ich versucht, einen entschlüsselungsalgo zu basteln:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); var actid,text:String; idcomb:array of byte absolute text; key,entschidcomb:array[0..64] of byte; i:integer; begin actid:=AnsiLeftStr(txtid.Text,strtoint(txtkeylength.Text)*2); randseed:=Strtoint('$' + AnsiRightStr(txtid.Text,Length(txtid.Text)-2-strtoint(txtkeylength.Text)*2)); for i:=0 to (strtoint(txtkeylength.Text)) do key[i]:=random(255); i:=0; While i<Length(actid) do Begin text:=text+Chr(StrToIntDef('$'+Copy(actid,i,2),0)); Inc(i,2); End; for i:=0 to (strtoint(txtkeylength.Text)) do entschidcomb[i]:= key[i] xor idcomb[i] ; end; |
Kann mir jemand helfen und mir sagen, was ich da falsch mache? Und evtl. Tipps geben, wie ich das ganze Vereinfachen kann? Ich hab ja relativ viele Variablen benutzt, weil ich keine andere Möglichkeit kannte. Evtl. kann mir einer von euch ne einfachere Version geben. Der Code sollte folgendes machen:
Verschlüsseln eines Strings mit einem zufallsgenerierten (Random-)OTP-Key. Der String sollte danach Hexadezimal angezeigt werden und RandSeed ebenfalls als Hex angehängt werden. Die Verschlüsselung wandelt dann den Hex-Randseed wieder um, rekonstruiert den Key und entschlüsselt damit den Text.
Ich hoffe, das war verständlich und ihr könnt mir dabei helfen, den Algo zu vervollständigen oder mir einen einfacheren Weg zu zeigen.
Und ja, ich weiß, dass dieser Algorythmus nicht sonderlich schwer zu knacken ist. Darum geht es mir aber auch nicht!
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 12.07.05 23:29
ich würde schlicht kein xor nehmen, weil da seltsame zeichen wie #13 oder soetwas rauskommen kann. nimm doch z.b. ... +!
mein kleiner Algo:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function verschluesseln(text,key:string):string; var i:integer; begin for i:=1 to length(text) do result:=result+char(byte(ord(text[i]) + ord(key[i]))); end; function ent(text,key:string):string; var i:integer; begin for i:=1 to length(text) do result:=result+char(byte(ord(text[i]) - ord(key[i]))); end; | Du siehst, ist ganz einfach ^^
Ach übrigens: XOR hat die nette eigenschaft, dass das entschlüsseln und das verschlüsseln exakt die gleiche procedure ist... einfach mal das selbe machen. Hab mir deinen code aber nicht angesehen.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Master_of_Magic 
      
Beiträge: 56
Win 98, Win XP
D6 Pers, D2005 Arch
|
Verfasst: Mi 13.07.05 14:11
Das bei XOR 'seltsame Zeichen' rauskommen, macht nix, da sie eh als Hex-Wert dargestellt werden. Dein Algorythmus basiert ja eigentlich nur auf Byte-Verschiebung, was meienr Meinung nach einiges leichter zu knacken ist.
Und wenn du meinen Cod eangesehen hättest, wäre dir aufgefallen, dass ich durchaus verstanden habe, dass die Entschlüssulung fast exakt wie die Verschlüsselung abläuft.
Mein Problem ist ja eher die Umwandlung in die einzelnen Hex-Werte und die Tatsache, dass ich irgendwie das Gefühl hab, ein paar Sachen weglassen zu können (beim Umwandeln ...)
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mi 13.07.05 14:15
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| function xorEnc(s:string;key:byte):string; var i,l: integer; begin result := s; l:=length(s); if l > 0 then for i := 1 to l do result[i] := char(byte(result[i]) xor key); end; |
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
Zuletzt bearbeitet von retnyg am Mi 13.07.05 14:28, insgesamt 1-mal bearbeitet
|
|
ManuelGS
      
Beiträge: 173
Win XP HE, Suse Linux
D6, D7, D2005 Personal
|
Verfasst: Mi 13.07.05 14:23
Rück mal den Quelltext als Ganzes raus.
_________________ "Leben ist gänzlich Bühne und Spiel; so lerne denn spielen
und entsage dem Ernst - oder erdulde das Leid." - Palladas von Alexandria
|
|
DaRkFiRe
      
Beiträge: 526
WinXP Home & Professional
C, C++, Delphi
|
Verfasst: Mi 13.07.05 16:02
_________________ Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 13.07.05 16:21
Master_of_Magic hat folgendes geschrieben: | Dein Algorythmus basiert ja eigentlich nur auf Byte-Verschiebung, was meienr Meinung nach einiges leichter zu knacken ist. |
kein bisschen. Die Sicherheit eines Algos basiert immer auf der Situation, dass der Algo selbst bekannt ist, nur das PW soll die sicherheit ausmachen. Und sche*** egal welchen Algo du nimmst, beides ist nur polyalphabetische Substitution, nichts anderes. Darum sind sie exakt gleich sicher.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Master_of_Magic 
      
Beiträge: 56
Win 98, Win XP
D6 Pers, D2005 Arch
|
Verfasst: Mi 13.07.05 20:05
Juhuuuu, ich habs endlich hinbekommen *freu*
Ich hab zwar nochmal von vorne angefangen, aber mit der Hilfe eurer Codeschnipsel funktioniert es nun meiner Meinung nach. Hier mal der Code:
XOR-Funktion(wird für beide Richtungen neutzt):
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function TForm1.strXOR(text,key:String):String; var i: integer; begin result := text; for i := 1 to length(text) do result[i] := char(byte(result[i]) xor byte(key[i])); end; |
Verschlüsselungsfunktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.encryptClick(Sender: TObject); var winid,idcomb,actid,key,code:String; Reg:TRegistry; i,tick:integer; begin idcomb:='Text zum Verschlüsseln'; tick:=gettickcount; RandSeed:=tick; key:=idcomb; for i:=1 to (Length(key)) do key[i]:=chr(random(255)); code:=strxor(idcomb,key); for i:=1 to (Length(code)) do actid:=actid+inttohex(byte(code[i]),2); actid:=actid+inttohex(tick,2); end; |
Entschlüsselungsfunktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.decryptClick(Sender: TObject); var actid,code,key:String; i,keylength:integer; begin keylength:=strtoint(txtkeylength.text); randseed:=strtoint('$'+copy(txtid.Text,keylength*2+1,15)); Setlength(key,keylength); for i:=1 to keylength do key[i]:=chr(random(255)); i:=1; While i<keylength*2 do Begin code:=code+Chr(StrToIntDef('$'+Copy(txtid.text,i,2),0)); Inc(i,2); End; actid:=strxor(code,key); end; |
Jetzt würd ich von euch gerne wissen, ob ich irgendwo was wichtiges vergessen hab. Weil ansonsten werden die Prozeduren eingebaut und verwendet... 
|
|
ScorpionKing
      
Beiträge: 1150
Win XP
|
Verfasst: Mi 13.07.05 20:11
Der Code sieht soweit gut aus, bau ihn mal ein, und schau ob dir das Ergebnis gefällt! 
_________________ Aus dem Urlaub zurück!
|
|
DaRkFiRe
      
Beiträge: 526
WinXP Home & Professional
C, C++, Delphi
|
Verfasst: Do 14.07.05 11:40
Was macht strXOR eigentlich, wenn key kürzer ist als der Text!?
Dann wird auf key zugegriffen - auf einen Index größer als die Länge von Key, weil ja bis Länge (Text) gelaufen wird L(Key) < L(Text) - Zugriffsverletzung!
Nimm lieber meine Variante mit MOD-Funktion, da dort nach dem letzten Zeichen quasi im Key neu angefangen wird. Ich habs im Post noch erklärt!
_________________ Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
|
|
ScorpionKing
      
Beiträge: 1150
Win XP
|
Verfasst: Do 14.07.05 14:48
DaRkFiRe hat folgendes geschrieben: | Was macht strXOR eigentlich, wenn key kürzer ist als der Text!? |
Angenommen wir wollen Mathematikwettbewerb verschlüsseln, und unser Key heißt Hallo Dann nimmt es den Key sooft hintereinander bis wir auf die länge des zu verschlüssenden Wortes kommen! Sprich:
Quelltext 1: 2:
| Mathematikwettbewerb HalloHalloHalloHallo |
MfG, ScorpionKing!
_________________ Aus dem Urlaub zurück!
|
|
Master_of_Magic 
      
Beiträge: 56
Win 98, Win XP
D6 Pers, D2005 Arch
|
Verfasst: Do 14.07.05 17:44
@DaRkFiRe
Du hast recht, dass das nicht funktionieren würde, allerdings ist mein Key immer gleich lang wie der Text (siehe Verschlüsselungsalgorythmus!). Da es sich um ein One-Time-Pad handelt, spielt also die Key-Länge keine Rolle.
Deshalb hab ich auch deine Mod-Funktion nicht komplett übernommen
Aber ansonsten hab ich bisher keine Fehler finden können ... scheint zu funktionieren 
|
|
|