Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Optimierung des Quelltextes


CurdledMilk - Di 20.09.05 19:31
Titel: Optimierung des Quelltextes
Hallo ihr!

Ich habe mal ein kleines codierungs-tool geschrieben und wollte euch mal Fragen was ihr davon haltet und vor allem was man rein vom programiertechnischen noch vereinfachen könnte.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
procedure TForm1.Button1Click(Sender: TObject); //Verschlüsseln

var schlussel: integer; //Der Schlüssel
    zeichen, i, l: integer; //Merkvariablen
    zeichenu:char; //Unverschlüselte Zeichen
    zeichenv,a: string//Verschlüsselte Zeichen

begin

schlussel:= strtoint(edit1.Text); 
a:= m1.Text; //m1 = memo1 unverschlüsselt                       
l:=length(m1.Text); //l = länge des Memos1

for i:=1 to l do

      begin
       zeichenu:=a[i] ;
       zeichen:= ORD(zeichenu); //ASCI wird ausgelesen     
       zeichenv := chr(Zeichen+schlussel); //Umwandlung in codiertes Zeichen 
       m2.Text:=m2.Text+zeichenv; //m2 = ausgabe in memo2
      end ;

end;

procedure TForm1.Button2Click(Sender: TObject); Entschlüsseln
var schlussel: integer;
    zeichen, i, l: integer;
    zeichenu:char;
    zeichenv,a: string;
begin

schlussel:= strtoint(edit1.Text);
a:= m2.Text;
l:=length(m2.Text);

for i:=1 to l do

   begin
    zeichenu:=a[i] ;
    zeichen:= ORD(zeichenu);
    zeichenv := chr(Zeichen-schlussel);
    m1.Text:=m1.Text+zeichenv;
   end;

end;

end.


GTA-Place - Di 20.09.05 20:07

Als erstes würde ich mal den Source formatieren,
dann sieht man weiter.


CurdledMilk - Mi 21.09.05 07:57

So hab den Source mal bisl formatiert. Hoffe so ist er besser.

PS: ich bin noch Anfänger


alzaimar - Mi 21.09.05 08:37

Grundsätzlich ist das o.k. (Programmierstil, Variablenbenennung). Ich würde das in eine eigene Unit packen, damit Du es später (für andere Programme) wiederverwenden kannst.

Die Qualität der Verschlüsselung ist aber fast 0%, weil man den Code mit einfachsten Mitteln knacken kann.


Narses - Mi 21.09.05 08:40

Moin!

Mein Vorschlag:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMainForm = class(TForm)
    Source: TMemo;
    Code: TMemo;
    BtnCodeIt: TButton;
    BtnDecodeIt: TButton;
    KeyEdit: TEdit;
    procedure CheckKey;
    function Vignere(const S: String): String;
    procedure Translate(MemoSource, MemoDestination: TMemo);
    procedure BtnCodeItClick(Sender: TObject);
    procedure BtnDecodeItClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    Key: Integer; // der Schlüssel
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

// Schlüssel lesen und prüfen; bei einfachem Vignere sind Schlüssel modulo 255 gleichwertig
procedure TMainForm.CheckKey;
begin
  Key := StrToIntDef(KeyEdit.Text,0and $FF;
  KeyEdit.Text := IntToStr(Key);
end;

// Vignere-Verschlüsselung ausführen
function TMainForm.Vignere(const S: String): String;
  var
    i: Integer;
begin
  Result := S;
  for i := 1 to Length(Result) do
    Result[i] := Char((Ord(Result[i]) +Key) and $FF);
end;

// Text von einem Memo in ein anderes (Um-)schlüsseln
procedure TMainForm.Translate(MemoSource, MemoDestination: TMemo);
  var
    i: Integer;
begin
  MemoDestination.Clear;
  for i := 0 to MemoSource.Lines.Count-1 do
    MemoDestination.Lines.Add(Vignere(MemoSource.Lines.Strings[i]));
end;

// von links nach rechts (verschlüsseln)
procedure TMainForm.BtnCodeItClick(Sender: TObject);
begin
  CheckKey;
  Translate(Source,Code);
end;

// von rechts nach links (entschlüsseln)
procedure TMainForm.BtnDecodeItClick(Sender: TObject);
begin
  CheckKey;
  Key := -Key;
  Translate(Code,Source);
  Key := -Key;
end;

end.

Und das Formular (per "Ansicht als Text" zu übernehmen):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
object MainForm: TMainForm
  Left = 1148
  Top = 124
  Width = 424
  Height = 183
  Caption = 'Vignere-Test'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  PixelsPerInch = 96
  TextHeight = 13
  object Source: TMemo
    Left = 16
    Top = 16
    Width = 185
    Height = 89
    Lines.Strings = (
      'Source')
    TabOrder = 0
  end
  object Code: TMemo
    Left = 224
    Top = 16
    Width = 185
    Height = 89
    Lines.Strings = (
      'Code')
    TabOrder = 1
  end
  object BtnCodeIt: TButton
    Left = 16
    Top = 120
    Width = 75
    Height = 25
    Caption = 'BtnCodeIt'
    TabOrder = 2
    OnClick = BtnCodeItClick
  end
  object BtnDecodeIt: TButton
    Left = 328
    Top = 120
    Width = 75
    Height = 25
    Caption = 'BtnDecodeIt'
    TabOrder = 3
    OnClick = BtnDecodeItClick
  end
  object KeyEdit: TEdit
    Left = 120
    Top = 120
    Width = 121
    Height = 21
    TabOrder = 4
    Text = '5'
  end
end

cu
Narses

//EDIT: Schlüssel- und Konvertierungsbereichsprüfung mit and $FF.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


CurdledMilk - Mi 21.09.05 16:02

Hallo!

Vielen dank für die antworten und die Mühen.

@ Narses

Es ist für mich leicht problemmatisch deinen Quelltext nach zu vollziehen, da ich noch ein ziemlicher Anfänger bin ich werde versuchen mich mit der Zeit mal durch zu fitzen.

Könntest du mir einige Sachen erklären?

und zwar:

- and $FF
- StrToIntDef (das def am ende sagt mir nichts)

So das wäre es erst mal vielen Dank noch mal für die Mühe


Narses - Do 22.09.05 00:38

Moin!

user profile iconCurdledMilk hat folgendes geschrieben:
Könntest du mir einige Sachen erklären?

Klar, gerne. :wink:

user profile iconCurdledMilk hat folgendes geschrieben:
and $FF

Damit "beschneidest" du den Wertebereich eines Intergers (+/-2 Milliarden grob) auf 0..255. Basiert darauf, wie der PC einen Integerwert verarbeitet. Das kann man nicht so ganz einfach und schnell erklären, finde ich; mach dich mal über Binärdarstellung von Ganzzahlen und Bitoperationen (sog. "binäres" Und, nicht "logisches") schlau, dann wird dir das auch irgendwann klar.
Ich hätte auch statt dessen "mod 255" schreiben können, nur würde dann eine -257 in eine -2 gewandelt, aber das macht bei dem Vignere-Ansatz auf Zeichenbasis keinen Sinn, deshalb wird mit dem "and $FF" immer in den Bereich 0..255 geschnibbelt (der Zahlenbereich wird quasi umgebrochen). Ach ja, $FF ist die hexadezimale Schreibweise für 255. :wink:

Gib doch mal -1 als Schlüssel ein und verschlüssele was... :D

user profile iconCurdledMilk hat folgendes geschrieben:
StrToIntDef (das def am ende sagt mir nichts)

Stell mal den Cursor auf den Funktionsnamen und drück F1. :wink:
Kurzfassung: Ist das gleiche wie ohne ...Def, aber mit einem Defaultwert, wenn der String keine gültige Zahl ist (hier nämlich 0).

cu
Narses