Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Verschlüsselungproblem mit editfeld und memo
M.wieMmanfred - So 15.02.09 18:18
Titel: Verschlüsselungproblem mit editfeld und memo
hey leute,
ich habe eine function:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function verschluessele (hilf1 : string; IntSchluessel : integer) : string; var hilf2 : string; j : integer; begin hilf2 := ''; for j := 1 to length(hilf1) do if hilf1[j] in ['A'..'Z'] then hilf2 := hilf2 + chr((((ord(hilf1[j]) -65) mod 26) + IntSchluessel) mod 26 + 65 )
else hilf2 := hilf2 + hilf1[j]; verschluessele := hilf2; end; |
und eine procedure:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TtextFeld.BtVerschluesseleClick(Sender: TObject); var i, IntSchluessel : integer; begin IntSchluessel:= StrToInt(SpinEdit1.Text); memo2.Lines.Clear; for i := 0 to memo1.Lines.Count-1 do memo2.Lines.Insert(i,verschluessele(memo1.Lines[i],IntSchluessel)); end; |
Es soll nämlich im editfeld ein passwort eingelesen werden, und dann im memofeld verschlüsselt angezeigt werden...
nun will ich statt memo1, ein editfeld einsetzen, aber memo2. lassen...
weiß jemand, wie dann die button-click methode ausehen müsste???
wäre cool wenn mir jemand schnell helfen kann^^
DANKE
Marc. - So 15.02.09 18:29
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TtextFeld.BtVerschluesseleClick(Sender: TObject); var i, IntSchluessel : integer; begin IntSchluessel:= StrToInt(SpinEdit1.Text); memo2.Lines.Clear; for i := 1 to Length(Edit1.Text) do memo2.Lines.Insert(i,verschluessele(Edit1.Text[i],IntSchluessel)); end; |
In etwa so? Besser du schreibst deine verschlüsselte Zeichenkette erst in eine Stringvariable und weißt dem Memo diese dann zu. Ansonsten wird die gesasmte Form bei jedem Zeichen neu gezeichnet, was dementsprechend Performanceverluste zur Folge hat. ;)
M.wieMmanfred - So 15.02.09 18:35
hmmmmm so hatte ich das auch schon probiert, allerdings trägt er dann gar nichts ins memofeld ein...
wie meintest du denn das andere, alsodie verschlüsselung erst einer variablen zuweisen??? daran hatte ich auch schon gedacht, allerdings weiß ich nicht, wie du meinst...
Marc. - So 15.02.09 19:01
Ich hab es mal etwas umgeschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function VerschluesseleCeasar(const Text: String; IntSchluessel: Integer): String; var i: Integer; begin SetLength(Result, Length(Text));
for i := 1 to Length(Result) do case Text[i] of 'a'..'z': Result[i] := Chr((((Ord(Text[i]) - 97) mod 26) + IntSchluessel) mod 26 + 97); 'A'..'Z': Result[i] := Chr((((Ord(Text[i]) - 65) mod 26) + IntSchluessel) mod 26 + 65); else Result[i] := Text[i]; end; end; |
Der Unterschied zu deiner Varianten besteht darin, dass ich nicht ständig den ganzen String kopiere und einen Case-Of-Block anstelle der vielen If-Abfragen einsetze.
Ich will kurz erklären, warum diese Variante etwas besser ist:
Ein String ist ja nichts anderes als Array of Char. Weißt du jedoch einem String ein neues Element respektive Zeichen zu, also z.B.
s := s + 'a'; wird neuer Speicher allokiert (angefordert), und der komplette String kopiert.
Bei meiner Variante passiert dies nicht. Ich verwende zudem keine zusätzliche Hilfsvariable als Ablage, sondern direkt die für das Endergebnis vorgesehene "Variable"
Result.
Da bei der Ceasarverschlüsselung die Länge des original Textes mit der des Verschlüsselten übereinstimmt, passe ich diese direkt im ersten Schritt mittels SetLength an.
Nun
ersetze ich nur noch Zeichen mit bestimmten Index und lasse den Rest des Strings unberührt. ;)
Hoffe, das kam jetzt einigermaßen verständlich rüber. :)
Ich empfehle dir übrigens sinnvollere Parameterbezeichnungen als "Hilf1" zu wählen. Mit "Text" oder "originalText" kann man doch schon deutlich mehr anfangen.
Schau dir zur Codeformatierung
DelForExp [
http://www.aew.wur.nl/UK/Delforexp/] an. :zwinker:
Ansonsten klappt deine eigene Variante auch ganz gut:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function verschluessele(hilf1: string; IntSchluessel: integer): string; var hilf2: string; j: integer; begin hilf2 := ''; for j := 1 to length(hilf1) do begin if hilf1[j] in ['A'..'Z'] then hilf2 := hilf2 + chr((((ord(hilf1[j]) - 65) mod 26) + IntSchluessel) mod 26 + 65) else if hilf1[j] in ['a'..'z'] then hilf2 := hilf2 + chr((((ord(hilf1[j]) - 97) mod 26) + IntSchluessel) mod 26 + 97) else hilf2 := hilf2 + hilf1[j]; end; verschluessele := hilf2; end; [...] memo2.Lines.Add(verschluessele(Memo1.Text, IntSchluessel)); |
Aber entscheide du selbst, welche du übernehmen willst ;)
Grüße,
Marc
M.wieMmanfred - So 15.02.09 19:19
danke schonmal, aber es ging mir mehr darum, wie ich einen string aus einem editfeld einlese, verschlüssele und dann in ein memofeld wieder ausgebe...
Nehmen wir an, du willst dich in ein programm einloggen.
Musst dich aber erst registrieren. Gibst benutzername und kennwort ein
bestätigst.
Dann soll das Passwort ausgelesen werden, verschlüsselt werden, und in ein Memofeld reingeschrieben werden, wo hinterher noch andere passwörter von anderen benutzern verschlüsselt rein kommen sollen. In ein nderes Memofeld sollen die benutzernamen rein, das ist ja auch recht einfach.
Beide memofelder sollen dann nach der registrierung gespeichert werden in eine txt file, damit man irgendwann, wenn man das programm wieder starte, sich mit seinen benutzerdaten einlggen kann...
vllt. verstehst du nun worum es geht^^ ;)
//Edit:
ich habs jetzt anders gelöst und zwar wird mein Passwort erst in ein unsichtbares memo eingetreagen, von wo aus es dann verschlüsselt wird und ins richtige memo rein kommt... ;)
---
Moderiert von
Narses: Beiträge zusammengefasst---
hat jemand eine Ahnung, wie ich das wieder entschlüsseln könnte???
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!