Autor Beitrag
CurdledMilk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Di 20.09.05 19:31 
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.

ausblenden volle Höhe 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.


Zuletzt bearbeitet von CurdledMilk am Mi 21.09.05 07:55, insgesamt 1-mal bearbeitet
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 20.09.05 20:07 
Als erstes würde ich mal den Source formatieren,
dann sieht man weiter.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
CurdledMilk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.

_________________
Na denn, dann. Bis dann, denn.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 21.09.05 08:40 
Moin!

Mein Vorschlag:
ausblenden volle Höhe 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):
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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