[delphi] Help: decryptie

Pagina: 1
Acties:

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Misschien een beetje veel code, maar ik kom er ECHT NIET uit... Ik zit nu al 2 uur ofzo te proberen, maar het gaat er bij mij niet in waarom het niet wil.
Zou iemand alsjeblieft willen kijken waarom het niet wil? Je krijgt nl. precies dezelfde tekst als wat het was! (de .dat file). Terwijl de sleutelwaarde wel 2 is (wat ie ook aangeeft in Memo1)

Wat je dus doet in het form is dat je op Button1 klikt.
code:
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
unit Udecrypt;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    Bestand1: TMenuItem;
    Openen1: TMenuItem;
    Afsluiten1: TMenuItem;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ProgressBar1: TProgressBar;
    Button1: TButton;
    procedure Inlezen();
    procedure Verwerk(naam :string);

    {function Codeerzin(zin_invoer : string) : String;
    function Codeer(c : char) : char;}
    function Decodeerzin(zin_invoer : string) : String;
    function Decodeer(c : char) : char;

    procedure Afsluiten1Click(Sender: TObject);
    procedure Openen1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  f,g : TextFile;
  naam : string;
  tekstin, ti, tekstuit, tu : string;
  code, nr  : integer;
  antw  : Array[0..13,1..5] of Integer; //aantal keer een bep antw komt hier in
  antw10 : Array[0..8,1..3] of Integer; //antw op vraag 10.
  opm   : Array[1..14,1..100] of AnsiString; // we stoppen alle zinnen in 1 string, we gaan uit van 100 personen

implementation

{$R *.dfm}


//// Decodeer een char ////
function Tform1.Decodeer(c : char) : char;
var decnr    : integer;


  begin
    if c in ['A'..'Z'] then
    begin
    decnr := (ord(c) -code);
    while (decnr < 65) do decnr := decnr +26; // in A..Z bereik krijgen
    decodeer := chr(decnr);
    end
    else if c in ['a'..'z'] then
    begin
    decnr := (ord(c) - code);
    while (decnr < 97) do decnr := decnr +26;
    decodeer := chr(decnr);
    end
    else if c in ['0'..'9'] then
    begin
    decnr := (ord(c) - code);
    while (decnr < 48) do decnr := decnr +10;
    decodeer := chr(decnr);
    end
    else decodeer := c;
  end; {codeer}


////// Decodeer zin //////////
function Tform1.Decodeerzin(zin_invoer : string) : String;
var zinnieuw                    : String;
    kl                   : Integer;
    charac                  : Char;

begin

  zinnieuw := ''; { leeg maken voor als en/de -code al een keer gebruikt is }
  For kl := 1 To length(zin_invoer) Do
  Begin
    charac := zin_invoer[kl];
    charac := Decodeer(charac);
    zinnieuw := zinnieuw + charac;
  End;
  Decodeerzin := zinnieuw;
end;



procedure TForm1.Inlezen;
var dummy    : string;
begin
  naam := OpenDialog1.FileName;
  if (naam <> '') then begin
  Memo1.Clear;
    Assignfile(f, naam);
    Reset(f);
    Readln(f, dummy);
    code := Trunc(sqrt(StrtoInt(dummy)-71));
    While not Eof(f) do
    begin
    Readln(f, tekstin);
    Memo1.Lines.Add(tekstin);
    end;

  CloseFile(f);
  end;
end;

procedure TForm1.Afsluiten1Click(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.Openen1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin

  Inlezen();

  end;
end;



procedure TForm1.Verwerk(naam : String);
var code, i, q, dummy  : integer;
    output  : String;
begin


  If naam <> '' then
  begin
    ProgressBar1.Position := 0;

    naam:= 'Gi981290.dat';
    Assignfile(f, naam);
    Reset(f);

    Readln(f, tekstin);
    dummy := StrtoInt(tekstin)-71;
    code := Trunc(sqrt(dummy));
    tekstuit := InttoStr(code);
    Memo1.Lines.Add(tekstuit);

    while not eof(f) do
    begin
    ProgressBar1.Position := ProgressBar1.Position +1;

    Readln(f, tekstin);
    tekstuit := decodeerzin(tekstin);

    Memo1.Lines.Add(tekstuit);



    end;





  end;

end;




procedure TForm1.Button1Click(Sender: TObject);
var bestand     : TSearchRec;
begin
 (* FindFirst('c:\temp\data\*.dat',faAnyFile,bestand); // Zoek eerste bestand.
  nr := 0; {# bestand}
  Memo1.Lines.Add(bestand.Name);
  FindNext(bestand);


  repeat
    nr := nr +1; // eerste is 1, laatste bestand is aantal bestanden
    Memo1.Lines.Add(bestand.Name);
    Verwerk(bestand.Name); // lees antwoorden in in de variabelen

  until FindNext(bestand) <> 0;
  FindClose(bestand);
   *)
   Verwerk('bla');


end;

end.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op woensdag 19 september 2001 22:44 schreef banaan-X het volgende:
Je krijgt nl. precies dezelfde tekst als wat het was!
Is dat niet het hele idee achter decryptie? :?

Professionele website nodig?


  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Op woensdag 19 september 2001 22:56 schreef curry684 het volgende:

[..]

Is dat niet het hele idee achter decryptie? :?
Ik krijg dus in een data.dat de geencrypteerde tekst! Niet de originele tekst!

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
En om het nog veel gekker te maken: als ik een 2e knop invoeg en daar deze code achter zet, werkt het wel! STERKER nog: knop1 werkt daarna ook!!!

Maar aan dat code niet goed zou ingelezen zijn kan het niet liggen, want die wordt immers goed weergegeven in Memo1...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button2Click(Sender: TObject);
var dummy : string;
begin
  naam := 'Gi981290.dat';
  if (naam <> '') then begin
  Memo1.Clear;
    Assignfile(f, naam);
    Reset(f);
    Readln(f, dummy);
    code := Trunc(sqrt(StrtoInt(dummy)-71));
    While not Eof(f) do
    begin
    Readln(f, tekstin);
    Memo1.Lines.Add(decodeerzin(tekstin));
    end;

  CloseFile(f);
  end;
end;

Verwijderd

Volgens mij zit je een beetje te k*tten met lokale en globale variabelen, bv code is een lokale variabele in de method Verwerk en ook een globale variabelen, effe wat tips:
  • Gebruik zo min mogelijk globale variabelen.
  • Indien je ze toch gebruikt noem ze dan G* of zoiets, bv GCode
  • Gebruik niet de naam van de functie als een variabele maar gebruik Result

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 20:51

Delphi32

Heading for the gates of Eden

code:
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
//// Decodeer een char ////
function Tform1.Decodeer(c : char) : char;
var decnr    : integer;
  begin
    if c in ['A'..'Z'] then
    begin
    decnr := (ord(c) -code);
    while (decnr < 65) do decnr := decnr +26; // in A..Z bereik krijgen
    decodeer := chr(decnr);
    end
    else if c in ['a'..'z'] then
    begin
    decnr := (ord(c) - code);
    while (decnr < 97) do decnr := decnr +26;
    decodeer := chr(decnr);
    end
    else if c in ['0'..'9'] then
    begin
    decnr := (ord(c) - code);
    while (decnr < 48) do decnr := decnr +10;
    decodeer := chr(decnr);
    end
    else decodeer := c;
  end; {codeer}


////// Decodeer zin //////////
function Tform1.Decodeerzin(zin_invoer : string) : String;
var zinnieuw                    : String;
    kl                   : Integer;
    charac                  : Char;
begin
  zinnieuw := ''; { leeg maken voor als en/de -code al een keer gebruikt is }
  For kl := 1 To length(zin_invoer) Do
  Begin
    charac := zin_invoer[kl];
    charac := Decodeer(charac);
    zinnieuw := zinnieuw + charac;
  End;
  Decodeerzin := zinnieuw;
end;


procedure TForm1.Verwerk(naam : String);
var code, i, q, dummy  : integer;
    output  : String;
begin
  If naam <> '' then
  begin
    ProgressBar1.Position := 0;
    naam:= 'Gi981290.dat';
    Assignfile(f, naam);
    Reset(f);
    Readln(f, tekstin);
    dummy := StrtoInt(tekstin)-71;
    code := Trunc(sqrt(dummy));
    tekstuit := InttoStr(code);
    Memo1.Lines.Add(tekstuit);
    while not eof(f) do
    begin
    ProgressBar1.Position := ProgressBar1.Position +1;
    Readln(f, tekstin);
    tekstuit := decodeerzin(tekstin);
    Memo1.Lines.Add(tekstuit);
    end;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var bestand     : TSearchRec;
begin
   Verwerk('bla');
end;

end.
Als je er niet uit komt, zoals hier, kun je het beste stap voor stap gaan tracen door de code. Breakpoint op
code:
1
Verwerk('bla')

in
code:
1
 TForm1.Button1Click

en dan kijken wat er precies gebeurt. Hou je variables in de gaten middels watches of (gebruik ik vaak) je muispointer ff op de variable te zetten.

Dan zul je zien, dat het fout gaat in dit stukje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
//// Decodeer een char ////
function Tform1.Decodeer(c : char) : char;
var decnr    : integer;
begin
  if c in ['A'..'Z'] then
    begin bla end
  else if c in ['a'..'z'] then
    begin bla end
  else if c in ['0'..'9'] then
    begin bla end
  else decodeer := c;
  end; {codeer}

Ik denk zo dat je altijd uit komt bij
code:
1
 else decodeer := c;

waarmee je dus precies terug krijgt wat je al had.

Oorzaak is idd het gebruik van de globale variable code. Jij verkeert in de veronderstelling dat deze gezet wordt in procedure Verwerk (
code:
1
 code := Trunc(sqrt(dummy));

), maar dat is dus niet zo, alleen de locale variable in procedure Verwerk wordt geset. Een van de 2 zul je anders moeten noemen, en het liefst zag ik dat je de locale verwijderde en de globale var veranderde in een Field van je Form.

Hopelijk kun je hiermee verder, succes.

  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Op donderdag 20 september 2001 00:54 schreef Delphi32 het volgende:

[..]

Als je er niet uit komt, zoals hier, kun je het beste stap voor stap gaan tracen door de code. Breakpoint op
code:
1
Verwerk('bla')

in
code:
1
 TForm1.Button1Click

en dan kijken wat er precies gebeurt. Hou je variables in de gaten middels watches of (gebruik ik vaak) je muispointer ff op de variable te zetten.

Dan zul je zien, dat het fout gaat in dit stukje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
//// Decodeer een char ////
function Tform1.Decodeer(c : char) : char;
var decnr    : integer;
begin
  if c in ['A'..'Z'] then
    begin bla end
  else if c in ['a'..'z'] then
    begin bla end
  else if c in ['0'..'9'] then
    begin bla end
  else decodeer := c;
  end; {codeer}

Ik denk zo dat je altijd uit komt bij
code:
1
 else decodeer := c;

waarmee je dus precies terug krijgt wat je al had.

Oorzaak is idd het gebruik van de globale variable code. Jij verkeert in de veronderstelling dat deze gezet wordt in procedure Verwerk (
code:
1
 code := Trunc(sqrt(dummy));

), maar dat is dus niet zo, alleen de locale variable in procedure Verwerk wordt geset. Een van de 2 zul je anders moeten noemen, en het liefst zag ik dat je de locale verwijderde en de globale var veranderde in een Field van je Form.

Hopelijk kun je hiermee verder, succes.
Hartelijk dank!! :) :) Dit was het inderdaad. Wat raar trouwens dat Delhpi je daar niet even voor waarschuwd.

Maar het werkt dus nu wel goed!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 20 september 2001 08:30 schreef banaan-X het volgende:
Wat raar trouwens dat Delhpi je daar niet even voor waarschuwd.
Niks raar, in C, C++ en Java is de volgende constructie ook legaal:
code:
1
2
3
4
5
for(int i; i != 10; i++)
  for(int i; i != 10; i++)
    for(int i; i != 10; i++)
    for(int i; i != 10; i++)
      DoSomething();  // Dit wordt 10000 keer uitgevoerd

Een compiler gebruikt altijd de dichtstbijzijnde scope voor resolving.

Professionele website nodig?


  • banaan-X
  • Registratie: Februari 2001
  • Niet online
Op donderdag 20 september 2001 09:22 schreef curry684 het volgende:

[..]

Niks raar, in C, C++ en Java is de volgende constructie ook legaal:
code:
1
2
3
4
5
for(int i; i != 10; i++)
  for(int i; i != 10; i++)
    for(int i; i != 10; i++)
    for(int i; i != 10; i++)
      DoSomething();  // Dit wordt 10000 keer uitgevoerd

Een compiler gebruikt altijd de dichtstbijzijnde scope voor resolving.
Hij moet het wel uitvoeren (dus geen error), maar hij kan toch wel een "warning" geven: "u heeft 2x <int> gedeclareerd"
Pagina: 1