Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Delphi...Vigenere Absturz...


t0pf - Do 08.09.05 14:08
Titel: Delphi...Vigenere Absturz...
Hallo, zwar folgendes, 11. Klasse , Java angefangen, 12.Klasse Delphi Terror LK auf ner anderen Schule und da tu ich mich ein wenig schwer. Kenn das Programm 2h und soll ein Vigenere Verschlüsselungs/Entschlüsselungsprogramm schreiben. Vorher gabs natürlich reichlich Theorie, die ehrlicherweise sehr hilfreich wahr.

Naja, einen Anfang hab ich : Vigenere Quadrat aufgebaut,(leider kann ichs nicht überprüfen, aber ich denke, dass ist richtig), Zeilenbereinigung und dann halt versch. procedures für das Ver/Entschlüsseln, die ich grade erstelle und wo ich nicht weiterkomme, weil ich mit der Syntax nicht vertraut bin.

Hmm, wie kann ich halt technisch das "Klartextwort" mit dem Schlüsselwort vergleichen und so das Kryptogramm erstellen.

Ich hab keine Ahnung.


jaevencooler - Do 08.09.05 14:20

Moin, Moin,

willkomen :welcome: im Forum t0pf.

damit wir Dir weiter helfen können, benötigen wir zunächst erstmal ein paar mehr Informationen. Bei solch schon recht komplexen Aufgaben sind Code Schnipsel immer sehr hilfreich. Auch die Information welche Delphi Version Du benutzt ist immer sehr hilfreich.

Beste Grüße
Michael


Motzi - Do 08.09.05 14:28

Hi und :welcome:

generell kann ich dir zum Einstieg in Delphi diesen Crashkurs [http://www.delphi-forum.de/topic_Crashkurs+Delphi_37446.html] empfehlen. Da du ja schreibst, dass dir die Theorie klar ist, aber du mit der Syntax Probleme hast sollte dir dieser Crashkurs sicher weiterhelfen können!

Gruß, Motzi


t0pf - Do 08.09.05 16:50


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:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit uHaupt;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    klartextzeile: TEdit;
    kryptogrammtextzeile: TEdit;
    schluesselwort: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    BtChiff: TButton;
    BtDechiff: TButton;
    procedure BtChiffClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function bereinigte_Zeile(Zeichenkette : string) : string;
var hilfe: string;
var i: byte;
begin
     for i:=1 to length(Zeichenkette) do
     begin
         case Zeichenkette[i] of
         'ß' : hilfe := hilfe + 'SS';
         'Ö''ö' : hilfe := hilfe + 'OE';
         'Ä''ä' : hilfe := hilfe + 'AE';
         'Ü''ü' : hilfe := hilfe + 'UE';
         ' '      : hilfe := hilfe + ' ';
         'A'..'Z''a'..'z' : hilfe := hilfe + upcase(Zeichenkette[i]);
         end;
     end;
end;

function VigenereQuadratChiff(klartextzeile, schluesselwort:string):string;
 var VigenereQuadrat : array[1..261..26of char;
 var hilfe : string;
 var i, asci, s, z, stelle, x : byte;
begin
{ VIGENERE QUADRAT INITIALISIERUNG }
     i:= 0;
     asci:= 65;
     for z:=1 to 26 do
     begin
          for s:=1  to 26 do
          begin
               VigenereQuadrat[z,s] := chr(asci+i);
               i := i + 1;
               if asci >=90 then
               begin
                    asci:=65;
                    i:=0;
               end;     
          end;
          asci := asci +1;
     end;
{ VIGENERE QUADRAT INITIALISIERUNG ENDE}
  hilfe := '';
     for x :=1 to length(klartextzeile) do
         begin
         hilfe := hilfe + VigenereQuadrat[ord(schluesselwort[stelle])-64,ord(klartextzeile[x])-64];
         inc(stelle);
         if stelle > length(schluesselwort) then stelle :=1;
         end;
     result := hilfe;    
end;


procedure TForm1.BtChiffClick(Sender: TObject);
begin
     klartextzeile.Text := bereinigte_Zeile(klartextzeile.Text);
     if length(schluesselwort.Text) >0 then
     begin
          schluesselwort.Text := bereinigte_Zeile(schluesselwort.Text);
          kryptogrammtextzeile.Text:= VigenereQuadratChiff(klartextzeile.Text, schluesselwort.Text);
     end;

     end;

end.



Das ist mein bisheriger Code. Aber wie gesagt.
Danke für den Crashkurs Link, vllt ist es dadurch leichter.


Spaceguide - Fr 09.09.05 12:02

Hier ein Quick Hack:


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:
const FIRST_CHAR = Ord('A');
      CHAR_COUNT = Ord('Z')-Ord('A')+1;


function RotateChar(aChar : char; aDistance : integer) : char;
 var index : integer;
begin
 index := Ord(Upcase(aChar))-FIRST_CHAR;
 Result := Chr((index + aDistance + CHAR_COUNT*16mod CHAR_COUNT+FIRST_CHAR);
end;

function GetVignereChar(const aText,aKey : string; aIndex,aDirection : integer) : char;
begin
 Result := RotateChar(
  aText[aIndex],
  (Ord(Upcase(aKey[(aIndex-1mod Length(aKey)+1]))-FIRST_CHAR)*aDirection);
end;

function Vignere(const aText,aKey : string; aDirection : integer) : string;
//aDirection: 1 = encrypt, -1 = decrypt
 var i : integer;
begin
 SetLength(Result,Length(aText));

 if Length(aKey)>0 then
 begin
  for i := 1 to Length(aText) do
   Result[i] := GetVignereChar(aText,aKey,i,aDirection);
 end else
  Result := aText;
end;


t0pf - So 11.09.05 14:07


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
 var VigenereQuadrat : array[1..261..26of char;
 var hilfe : string;
 var i, asci, s, z, stelle, x : byte;
{ VIGENERE QUADRAT INITIALISIERUNG }
     i:= 0;
     asci:= 65;
     for z:=1 to 26 do
     begin
          for s:=1  to 26 do
          begin
               VigenereQuadrat[z,s] := chr(asci+i);
               i := i + 1;
               if asci >=90 then
               begin
                    asci:=65;
                    i:=0;
               end;     
          end;
          asci := asci +1;
     end;
{ VIGENERE QUADRAT INITIALISIERUNG ENDE}



Ist das überhaupt richtig zugewiesen?
Tut mir leid, dass ich soviel Frage, aber ich bin echt unter Zeitdruck mit dem Kram.


uall@ogc - So 11.09.05 14:23

den einzigen fehelr den ich sehe ist das du stelle nie initialisierst (auf 1 setzt)
an dem code den du zuletzt gepostet hast ist kein programmierfehelr (der zum übrelauf führen kann) aber hab net geschaut ob es das richtige macht


t0pf - So 11.09.05 19:19

Ok, hab das verschlüsseln hinbekommen.

Wie entschlüssel ich dass?
ICh bin so logik gestört :(


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:
function VigenereQuadratDechiff(kryptogrammtextzeile, schluesselwort:string):string;
 var VigenereQuadrat : array[1..261..26of char;
 var hilfe: string;
 var asci, s, z, stelle, x, i : byte;
begin
{ VIGENERE QUADRAT INITIALISIERUNG }
     for z:=1 to 26 do
     begin
          for s:=1  to 26 do
          begin
               asci := z+s+63;
               if asci >=91 then asci := asci -26;
               VigenereQuadrat[z,s] := chr(asci);
          end;
     end;
{ VIGENERE QUADRAT INITIALISIERUNG ENDE}
  hilfe := '';
  stelle:= 1;
     for x :=1 to length(kryptogrammtextzeile) do
         begin
         hilfe := hilfe + VigenereQuadrat[ { WAS MUSS HIER REIN ? WELCHE RECHNUNG ? WAS AUCH IMMER}];
         inc(stelle);
         if stelle > length(schluesselwort) then stelle :=1;
         end;
     result := hilfe;
end;


Spaceguide - Mo 12.09.05 12:26

Ja guck dir doch mal meinen Codefetzen an, damit kannst du wunderbar ver- und entschlüsseln.


t0pf - So 18.09.05 14:13

Okeh, ich hab jetzt was nur manchmal kommen bei langen Chiffrezeilen komische Klartextzeilen raus.

Hier mein Dechiff Vorgang:

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:
function VigenereQuadratDechiff(kryptogrammtextzeile, schluesselwort:string):string;
 var VigenereQuadrat : array[1..261..26of char;
 var hilfe: string;
 var buchstabe, line, Spalte, j, zeile, i: byte;
begin
{ VIGENERE QUADRAT INITIALISIERUNG }
     for line:=1 to 26 do
     begin
          Spalte:= 1;
          for buchstabe:= line  to 26 do
          begin
           VigenereQuadrat[line, Spalte] := chr(buchstabe+64);
           inc(Spalte);
          end;
          for buchstabe:= 1 to line-1 do
          begin
               VigenereQuadrat[line, Spalte] := chr(buchstabe+64);
               inc(Spalte);
          end;
     end;
{ VIGENERE QUADRAT INITIALISIERUNG ENDE}
  hilfe := '';
  j:= 1;
  zeile := 1;
  for i:=1 to length(kryptogrammtextzeile) do
  begin
    while kryptogrammtextzeile[i] <> VigenereQuadrat[zeile, ord(schluesselwort[j])-64]
    do inc(zeile);
         hilfe := hilfe + VigenereQuadrat[zeile, 1];
         inc(j);
         if j > length(schluesselwort) then j :=1;
  end;
  result := hilfe; 
end;


Kann sich das mal jemand fix angucken und mir sagen, ob da ein Fehler vorhanden ist?


F34r0fTh3D4rk - Fr 25.11.05 23:02

hier nochmal vereinfacht und veranschaulicht:


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:
function Vignere(Text, Key: string): string;
const
  vignere_quad: array [1..26of string =
(
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'BCDEFGHIJKLMNOPQRSTUVWXYZA',
'CDEFGHIJKLMNOPQRSTUVWXYZAB',
'DEFGHIJKLMNOPQRSTUVWXYZABC',
'EFGHIJKLMNOPQRSTUVWXYZABCD',
'FGHIJKLMNOPQRSTUVWXYZABCDE',
'GHIJKLMNOPQRSTUVWXYZABCDEF',
'HIJKLMNOPQRSTUVWXYZABCDEFG',
'IJKLMNOPQRSTUVWXYZABCDEFGH',
'JKLMNOPQRSTUVWXYZABCDEFGHI',
'KLMNOPQRSTUVWXYZABCDEFGHIJ',
'LMNOPQRSTUVWXYZABCDEFGHIJK',
'MNOPQRSTUVWXYZABCDEFGHIJKL',
'NOPQRSTUVWXYZABCDEFGHIJKLM',
'OPQRSTUVWXYZABCDEFGHIJKLMN',
'PQRSTUVWXYZABCDEFGHIJKLMNO',
'QRSTUVWXYZABCDEFGHIJKLMNOP',
'RSTUVWXYZABCDEFGHIJKLMNOPQ',
'STUVWXYZABCDEFGHIJKLMNOPQR',
'TUVWXYZABCDEFGHIJKLMNOPQRS',
'UVWXYZABCDEFGHIJKLMNOPQRST',
'VWXYZABCDEFGHIJKLMNOPQRSTU',
'WXYZABCDEFGHIJKLMNOPQRSTUV',
'XYZABCDEFGHIJKLMNOPQRSTUVW',
'YZABCDEFGHIJKLMNOPQRSTUVWX',
'ZABCDEFGHIJKLMNOPQRSTUVWXY'
);
var
  i, j, count: integer;
  ukey: string;
  chx, chy: char;
begin
  result := '';
  count := 0;
  ukey := key;
  if length(key) < length(Text) then
    for i := 1 to length(Text) do
    begin
      inc(count);
      if count > length(key) then
        count := 1;
      ukey := ukey + key[count];
    end;
  if length(key) > length(Text) then
    ukey := copy(key, 1, length(Text));
  for j := 1 to length(Text) do
  begin
    chx := upcase(Text[j]);
    chy := upcase(ukey[j]);
    result := result + vignere_quad[ord(chx) - 64][ord(chy) - 64];  //die eigentliche verschlüsselung
  end;
end;

stimmt, so kann man das quad auch machen ;)