![]() |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Waaahh!
Ich wollte doch nur verhindern, dass jemand die .ini - Datei öffnet und der dann sofort das Passwort ablesen kann - nicht sowas kompliziertes was ich eh nicht versteh :pale: :| Kann man dafür nicht einfach den Algorithmus nehmen, um das ganze einfach in die .ini-Datei zu schreiben? Soll ja nix profesionelles werden sondern einfach mal ein Projekt um mich mit Delphi vertraut zu machen... Vielen Dank bisher! Lamy |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Zitat:
![]() Gruß Stephan |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Na dann werde ich hier auch mal meinen Senf dazugeben. :mrgreen:
1.) die Verschlüsselung muss von der Speicherung getrennt werden, damit jeder Teil für sich getest werden kann. Die beiden Dinge dürfen nicht vermischt werden. 2.) ich zeige hier mal eine ganz einfache Verschlüsselung, die mit XOR arbeitet und somit ver- als auch entschlüsseln kann:
Delphi-Quellcode:
3. Bei der Verschlüsselung entstehen Zeichen, die nicht in einer Inidatei gespeichert
function SimpleCryptString(const S, Key: string): string;
var i, j: Integer; C: Byte; P: PByte; begin SetLength(Result, Length(S)); P := PByte(Result); j := 1; for i := 1 to Length(S) do begin C := Ord(S[i]); C := C xor Ord(Key[j]); P^ := C; Inc(P); Inc(j); if j > Length(Key) then j := 1; end; end; werden können. Deshalb muss man das verschlüsselte Passwort codieren. Die einfachste Methode ist die hexadezimale Codierung: jedes Zeichen wird zu 2 Hexziffern codiert. Dazu folgende Funktionen:
Delphi-Quellcode:
Alternativ kann man auch noch die Base64-Codierung (auch als Mimekodierung bekannt) verwenden.
function StringToHexStr(const value:string):string;
begin SetLength(Result, Length(value)*2); // es wird doppelter Platz benötigt if Length(value) > 0 then BinToHex(PChar(value), PChar(Result), Length(value)); end; function HexStrToString(const value:string):string; begin SetLength(Result, Length(value) div 2); // es wird halber Platz benötigt if Length(value) > 0 then HexToBin(PChar(value), PChar(Result), Length(value)); end; 4.) Damit entsteht folgender Pseudocode:
Delphi-Quellcode:
PWverschl := SimpleCryptString(PWKlartext, Supperkey); // verschlüsseln
PWverschl := StringToHexStr(PWverschl); // Codieren SaveSettings(ftpserver, user, PWverschl, directory); |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Wo ist das Problem ?
Delphi-Quellcode:
Wie einfacher soll es denn noch gehen ??uses DECUtil, Cipher; function Encode(const Value, Password: String): String; begin with TCipher_Rijndael.Create(Password, nil) do try Result := CodeString(Value, paEncode, fmtMIME64); finally Free; end; end; function Decode(const Value, Password: String): String; begin with TCipher_Rijndael.Create(Password, nil) do try Result := CodeString(Value, paDecode, fmtMIME64); finally Free; end; end; Gruß Hagen PS: auf alle Fälle ist dies sicherer als alle anderen genannten Beispiele. PPS: LockBox ist schön und gut, aber nicht unbedingt einfacher und eben sicherer. Hier im Forum hatte ich dies schon mal ausführlich erklärt warum dies so sein muß. |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Falls du auf's DEC verzichten willst so kann man eben auch mit nur ein wenig mehr Source dein Problem wesentlich sicherer lösen. Nachfolgend ein Source der den bekannten RC4 Algorithmus als Stand Alone implementiert. Man erkennt das für eine sichere Verschlüsselung nicht viel mehr Code benötigt wird als für eine unsicherer XOR Verschlüsselung.
Delphi-Quellcode:
Du rufst nun Encode() und respektive Decode() auf.
type
TRC4Context = record D: array[Byte] of Byte; I,J: Byte; end; procedure RC4Init(var RC4: TRC4Context; const Key: String); var R,S,T,U: Byte; L: Integer; begin L := Length(Key); with RC4 do begin I := 0; J := 0; for S := 0 to 255 do D[S] := S; R := 0; U := 1; for S := 0 to 255 do begin Inc(R, D[S] + Ord(Key[U])); T := D[S]; D[S] := D[R]; D[R] := T; Inc(U); if U > L then U := 1; end; end; end; procedure RC4Code(var RC4: TRC4Context; const Source; var Dest; Count: Integer); overload; var S: Integer; T: Byte; begin with RC4 do for S := 0 to Count -1 do begin Inc(I); T := D[I]; Inc(J, T); D[I] := D[J]; D[J] := T; Inc(T, D[I]); TByteArray(Dest)[S] := TByteArray(Source)[S] xor D[T]; end; end; procedure RC4Done(var RC4: TRC4Context); begin FillChar(RC4, SizeOf(RC4), 0); end; function RC4Code(const Value, Password: String): String; overload; var RC4: TRC4Context; Len: Integer; begin RC4Init(RC4, Password); try Len := Length(Value); SetLength(Result, Len); RC4Code(RC4, Value[1], Result[1], Len); finally RC4Done(RC4); end; end; function BinToHexStr(const Value: String): String; var Size: Integer; begin Size := Length(Value); SetLength(Result, Size * 2); BinToHex(PChar(Value), PChar(Result), Size); end; function HexToBinStr(const Value: String): String; var Size: Integer; begin Size := (Length(Value) +1) div 2; SetLength(Result, Size); HexToBin(PChar(Value), PChar(Result), Size); end; function Encode(const Value, Password: String): String; begin Result := BinToHexStr(RC4Code(Value, Pasword)); end; function Decode(const Value, Password: String): String; begin Result := RC4Code(HexToBinStr(Value), Password); end; Gruß Hagen [EDIT] Fehler im Source beseitigt !, hagen [/EDIT] |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Hey, danke!
Ist der Rc4 - Algorithmus auch in einer Komponente / Unit vorhanden die man vorher implementieren muss? |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Hm, was für eine Frage !
RC4 kannst du aus der Netscape.EXE heraus-pfriemeln, oder als PDF Datei im WEB downloaden, oder als Unit im DEC finden, oder .. oder ... oder viel viel einfacher den obigen Code in dein Projekt kopieren. Dieser Code wird dann in einer Unit stehen, nämlich in DEINER Unit. Sogesehen verstehe ich entweder deine Frage nicht richtig, oder du verstehst nicht das obiger Source die komplette Lösung deines Problemes ist. Der Weg in deinen UNIT wäre dann mit der Maus von Links-Oben zu klicken, die linke Maustaste gedrückt lassen und langsam nach unten ziehen. Das macht man so lange bis der obige Source komplett blau-hinterlegt ist (abhängig von deiner Windows-Einstellung). Dann noch Srtg+C auf den eckigen Kasten mit den vielen Tasten vor dem Ding das so farbig leuchtet drücken. Nun noch deinen Source öffnen und wiederum auf dem Kasten mit den vielen tasten Strg+Einfg drücken. Gruß Hagen PS: sorry, aber manchmal gibt es wirklich "komische" Fragen ;) |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
*duck* :oops:
Ich frag ja nur weil der RC5Init, RC5Code, usw. nicht kennt... |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Ähm 1. wo steht RC5 ? :mrgreen:
2. solltest du das in eine eigene Unit verfrachten und diese mit Uses Rc4Unit; (oder ähnlich) einbinden oder aber am anfang der Haupt-Unit einfügen damit nachfolgende Procedures/Functions das Rc4 Zeuch auf finden können (Grundlagen) :roll: |
Re: Verschlüssel, in einer .ini-Datei speichern später auflö
Ach so, habs!
Danke vielmals! :thuimb: Lamy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz