![]() |
Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Hey folks,
folgendes Problem beschäftigt mich nun bereits seit einigen Tagen. Ich habe versucht ein Programm zu schreiben, welches individuell gewählte Worte verschlüsselt, indem man jeden Buchstaben des zu verschlüsselnden Wortes und einen gewissen Wert verschiebt. Die Verschlüsselung an sich funktioniert auch reibungsfrei, jedoch die Entschlüsselung soll das Wort wiederherstellen. Wenn ich den Button für die Entschlüsselung jedoch betätige, so bleibt das Feld leer. Ich habe einmal vor dem Betätigen des Buttons etwas in das Edit-Feld hinein geschrieben, in das der entschlüsselte Text eingefügt werden soll. Lustiger Weise wird alles, was sich in dem Feld befindet einfach gelöscht. Hier einmal die Procedure des Buttons:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var T, TN : String; Z : Integer; begin T := Edit2.Text; // T = Verschlüsselter Text, der entschlüsselt werden soll Z := 7; // Z = Wert, um den der Buchstabe verschoben wird C.B(TN,T,Z); // C = Klasse TCaesar (Global deklariert), B = Methode zur Entschlüsselung Edit3.Text := TN; // TN = Neuer, entschlüsselter Text end; Und hier die Procedure der Entschlüsselungsmethode:
Delphi-Quellcode:
Procedure TCaesar.B (Var T : String; T2 : String; Z : Integer);
Var P, Code : Integer; // P = Länge des Wortes, Code = Verschlüsselungscode B : String; // B = Buchstabe des Wortes B2 : Char; // B2 = Verschobener Buchstabe Begin For P := 1 to Length(T) Do Begin B := Copy(T,P,1); Code := ORD(B[1]); Code := Code + Z; If (Code < 122) Then Code := Code + 26; B2 := Char(Code); T2 := T2 + B2; End; End; Ich hoffe ihr werdet mir helfen können. Gruß Faffy |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Wieso machst Du Dir Dein Leben so schwer? Schau mal auf Deinen Code. Deiner grünen Kommentare sind länger als der Programmcode. Guter Code braucht keine Kommentare. Benenne Deine Variablen erst mal gescheit.
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Innerhalb deine Entschlüsselungsmethode hast du die Bedeutung von T und T2 vertauscht.
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Ah, mir ist aufgefallen, was mein Fehler war.. Ich habe den Quelltext jetzt ein wenig überarbeitet, sodass folgendes entstanden ist:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var T, TN : String; Z : Integer; begin T := Edit2.Text; // T = Verschlüsselter Text, der entschlüsselt werden soll Z := 7; // Z = Wert, um den der Buchstabe verschoben wird C.B(TN,T,Z); // C = Klasse TCaesar (Global deklariert) Edit3.Text := TN; // TN = Neuer, entschlüsselter Text end; Und für die Methode:
Delphi-Quellcode:
Nun entschlüsselt er auch, jedoch wird nicht das entschlüsselt, was entschlüsselt werden soll. Er gibt nicht den Ausgangsbegriff wieder raus, sondern etwas völlig anderes. Aus "ttt" wird "MMM".
Procedure TCaesar.B (Var T2 : String; T : String; Z : Integer);
Var P, Code : Integer; // P = Länge des Wortes, Code = Verschlüsselungscode B : String; // B = Buchstabe des Wortes B2 : Char; // B2 = Verschobener Buchstabe Begin For P := 1 to Length(T) Do Begin B := Copy(T,P,1); Code := ORD(B[1]); Code := Code + Z; If (Code < 122) Then Code := Code - 26; B2 := Char(Code); T2 := T2 + B2; End; End; |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Dann zeig doch mal die Verschlüsselung...
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Ich lege einfach mal alles genauer dar.
Verschlüsselungsbutton:
Delphi-Quellcode:
Verschlüsselungsmethode:
procedure TForm1.Button1Click(Sender: TObject);
Var T,T2 : String; Z : Integer; begin T := Edit1.Text; Z:= 7; C.A(T,T2,Z); Edit2.Text := T2; end;
Delphi-Quellcode:
Entschlüsselungsbutton:
Procedure TCaesar.A (T : String; Var T2 : String; Z : Integer); // T = Zu verschlüsselndes Wort, T2 = Verschlüsseltes Wort, Z = Irrelevant (Zahl, um die verschoben wird, ist aber nicht angegeben)
Var P, Code : Integer; // P = Länge des Wortes, Code = Verschlüsselungscode B : String; // B = Buchstabe des Wortes B2 : Char; // B2 = Verschobener Buchstabe Begin For P := 1 to Length(T) Do Begin B := Copy(T,P,1); Code := ORD(B[1]); Code := Code - Z; If (Code > 122) Then Code := Code - 26; B2 := Char(Code); // B2 = Verschlüsselter Buchstabe T2 := T2 + B2; // T2 = Verschlüsselter Text End; End;
Delphi-Quellcode:
Entschlüsselungsmethode:
procedure TForm1.Button2Click(Sender: TObject);
var T, TN : String; Z : Integer; begin T := Edit2.Text; // T = Verschlüsselter Text, der entschlüsselt werden soll Z := 7; // Z = Wert, um den der Buchstabe verschoben wird C.B(TN,T,Z); // C = Klasse TCaesar (Global deklariert) Edit3.Text := TN; // TN = Neuer, entschlüsselter Text end;
Delphi-Quellcode:
Procedure TCaesar.B (Var T2 : String; T : String; Z : Integer);
Var P, Code : Integer; // P = Länge des Wortes, Code = Verschlüsselungscode B : String; // B = Buchstabe des Wortes B2 : Char; // B2 = Verschobener Buchstabe Begin For P := 1 to Length(T) Do Begin B := Copy(T,P,1); Code := ORD(B[1]); Code := Code + Z; If (Code < 122) Then Code := Code + 26; B2 := Char(Code); T2 := T2 + B2; End; End; |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Das sind doch die relevanten Stellen:
Delphi-Quellcode:
Code := Code - Z;
If (Code > 122) Then Code := Code - 26;
Delphi-Quellcode:
Überleg dir mal, warum bei der Verschlüsselung die IF-Abfrage kommt und was sie bewirkt. Dann überleg mal, wie dieser Vorgang rückgängig gemacht werden muss. Dann siehst du auch, was bei der Enschlüsselung falsch läuft.
Code := Code + Z;
If (Code < 122) Then Code := Code + 26; |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
Aber nachdem ich das ganze mal nachgebastelt habe, funktionierts nu bei mir :) Fehler dürfte das im Zitat rot markierte Zeichen sein. Hoffe mal, dass mein erster Beitrag korrekt ist. Grüße Day Edit: Farbige Markierungen im Delphi Code funktionieren nicht... In Prozedur B: If (Code > 122) Then ... so funktionierts |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Perfekt, vielen Dank. Jetzt funktioniert es echt wunderbar, ihr habt mir sehr geholfen.
Eine Frage hätte ich jedoch noch, da mir das nicht ganz klar ist. Warum muss bei Procedure A
Delphi-Quellcode:
Das "Var T2 : String" hinter "T : String;" stehen und bei Procedure B
Procedure TCaesar.A (T : String; Var T2 : String; Z : Integer);
Delphi-Quellcode:
das "Var T2 : String;" eben am Anfang?
Procedure TCaesar.B (Var T2 : String; T : String; Z : Integer);
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
Variablen- und Funktionsnamen dürfen wirklich mehr als ein oder zwei Buchstaben lang sein. Die Zeiten von Sharp Taschenrechner mit ihrem ![]() |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
Guter Code kann hoch kompliziert sein, du hättest schreiben sollen: "Einfacher Code braucht keine Kommentare.". Und auch das ist kein guter Stil. |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
Grüße Klaus |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
Zitat:
Delphi-Quellcode:
Procedure TCaesar.A (T : String; Var T2 : String; Z : Integer);
// T = Zu verschlüsselndes Wort // T2 = Verschlüsseltes Wort // Z = Irrelevant (Zahl, um die verschoben wird, ist aber nicht angegeben) Var P, Code : Integer; // P = Länge des Wortes, Code = Verschlüsselungscode B : String; // B = Buchstabe des Wortes B2 : Char; // B2 = Verschobener Buchstabe Begin For P := 1 to Length(T) Do Begin B := Copy(T,P,1); Code := ORD(B[1]); Code := Code - Z;
wirst du hoffentlich verstehen, dass ich deinen Standpunkt nur müde belächeln kann. Ein guter Code ist niemals kompliziert ( ![]() |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
Ist der Code einer Routine/Methode zu kompliziert, dann macht dieser Codeteil einfach zu viel -> zerlegen in kleinere Routinen/Methoden |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Zitat:
Aber ich glaub das ist schon wieder OT. :P |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Wenn du warnst, Anfängern nicht solche Tipps wie: guter Code braucht keine Kommentare" zu geben, dann ist das deine Sicht.
Ich wäre heute glücklich, wenn ich damals als Anfänger solche Hinweise bekommen hätte. Denn erst gerade diese Regeln (sehr gut beschrieben in Clean Code) haben mir tatsächlich nennenswerte Zeit erspart. Zeit, die ich mit Kommentaren niemals sparen kann sondern wohl eher verschwende. Und wer es einmal erlebt hat, Code wie ein Buch zu lesen, der wird diese Regel niemals mehr in Frage stellen. Frank |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
"Guter Code braucht keine Kommentare." Ist aus meiner Sicht ein schlechter Tipp, gerade für Anfänger, weil ein Anfänger wohl kaum den Durchblick hat, ob etwas sauber programmiert ist oder nicht. Das verführt nur dazu "schlecht Code" nicht auszukommentieren. Ich schlage mich täglich mit solchem Mist herum, wo ich mir denke, was hat der Typ sich hierbei nur gedacht. Dann geht das große Rätselraten los, obwohl eine Kommentarzeile schon alles hatte erklären können. Besonders toll ist so etwas bei Workarounds, welche einem völlig Sinnfrei erscheinen ohne Kommentar.
Vielleicht können wir uns auf: "Guter Code braucht wenig Kommentare." einigen. ;) |
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Es könnte hier der Eindruck enstehen, Kommentare seien das neue GOTO oder WITH. Dem ist nun wahrlich nicht so!
|
AW: Verschlüsselung bzw. Entschlüsselung will nicht gelingen
Hier mal der Caesar-Cipher der fast keine Kommentare benötigt
Delphi-Quellcode:
Wie man sieht benötigt man keine Kommentare um die Funktionsweise des Codes trotzdem lesbar zu gestalten.
unit Caesar;
interface type // siehe http://de.wikipedia.org/wiki/Caesar-Verschlüsselung TCaesarCipher = class private const CCharCount = 26; // 26 Buchstaben im Alphabet CFirstPlainChar = 'a'; // Klartext in Kleinbuchstaben und startet mit 'a' CFirstCryptChar = 'A'; // Geheimtext in Großbuchstaben und startet mit 'A' private function GetPositiveShift( AShift : Integer ) : Integer; function GetShiftedCode( ACode, AShift : Integer ) : Integer; public function Encrypt( const APlainStr : string; AShift : Integer ) : string; function Decrypt( const ACryptStr : string; AShift : Integer ) : string; end; implementation { TCaesarCipher } function TCaesarCipher.GetPositiveShift( AShift : Integer ) : Integer; begin Result := AShift mod CCharCount; // -CCharCount+1 .. CCharCount-1 Result := Result + CCharCount; // 1 .. 2*CCharcount-1 Result := Result mod CCharCount; // 0 .. CCharCount-1 end; function TCaesarCipher.GetShiftedCode( ACode, AShift : Integer ) : Integer; begin // Bei einer festen Anzahl x ist es egal, ob man 2 zurück oder (x-2) vor geht // Start ....... : 1(2)3 4 5 // 2 zurück .... : 1 2 3 4(5) // (5-2) = 3 vor : 1 2 3 4(5) Result := ( ACode + GetPositiveShift( AShift ) ) mod CCharCount; end; function TCaesarCipher.Decrypt( const ACryptStr : string; AShift : Integer ) : string; var LStrLength : Integer; LStrIndex : Integer; LPlainChar : Char; LCryptChar : Char; LPlainCode : Integer; LCryptCode : Integer; begin LStrLength := Length( ACryptStr ); SetLength( Result, LStrLength ); for LStrIndex := 1 to LStrLength do begin LCryptChar := ACryptStr[LStrIndex]; LCryptCode := Ord( LCryptChar ) - Ord( CFirstCryptChar ); { TODO : Überprüfung von 0 <= LCryptCode < CCharCount } LPlainCode := GetShiftedCode( LCryptCode, - AShift ); LPlainChar := Char( LPlainCode + Ord( CFirstPlainChar ) ); Result[LStrIndex] := LPlainChar; end; end; function TCaesarCipher.Encrypt( const APlainStr : string; AShift : Integer ) : string; var LStrLength : Integer; LStrIndex : Integer; LPlainChar : Char; LCryptChar : Char; LPlainCode : Integer; LCryptCode : Integer; begin LStrLength := Length( APlainStr ); SetLength( Result, LStrLength ); for LStrIndex := 1 to LStrLength do begin LPlainChar := APlainStr[LStrIndex]; LPlainCode := Ord( LPlainChar ) - Ord( CFirstPlainChar ); { TODO : Überprüfung von 0 <= LPlainCode < CCharCount } LCryptCode := GetShiftedCode( LPlainCode, AShift ); LCryptChar := Char( LCryptCode + Ord( CFirstCryptChar ) ); Result[LStrIndex] := LCryptChar; end; end; end. Die Funktionsweise des Caesar-Ciphers muss man aber schon vorher verstanden haben. Ein Code ist schließlich nicht dazu da eine Thematik zu erklären, sondern die Thematik umzusetzen. Wer die Thematik verstanden hat, sollte dann auch den Code verstehen können. HINWEIS Der Code ist bewusst nicht DRY ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 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 by Thomas Breitkreuz