Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Problem bei Vignere


F34r0fTh3D4rk - Sa 05.11.05 21:20
Titel: Problem bei Vignere
Hallo, ich habe gerade was von Vignere gelesen und wollte mal nen algo dazu schreiben:

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) div 65][ord(chy) div 65];
  end;
end;

als ergebnis kommt jedoch immer A heraus, woran kann das liegen ?


_Digger - Sa 05.11.05 23:04

hallo

Delphi-Quelltext
1:
result := result + vignere_quad[ord(chx) - 64][ord(chy) - 64];                    


du hast hier durch 65 dividiert. das ergibt aber keinen Sinn, weil wenn du den Buchstaben B hast, kommt bei dir 66/65=1.01538 heraus, aber ich denke einmal, dass du eigentlich 2 als ergebnis haben willst.


so gehts denke ich kürzer (ich habe es aber noch nicht ausprobiert!)

Delphi-Quelltext
1:
2:
3:
4:
5:
var z  :integer;

z:=ord(chx)+ord(chy);
if z>90 then z:=z-26;
result:=result+char(z);


dann kannst du dir das vignere_quad sparen (aber wenn du das schon einmal getippt hast, dann kannst du deine Variante genauso gut verwenden)


F34r0fTh3D4rk - So 06.11.05 11:44

ja ich wollte das nur gerne übersichtlich haben, damit ersichtlich ist wie das funktioniert, das quad wollte ich später eh rausnehmen 8)

ich muss glaube ich subtahieren und net dividieren :shock:

so scheint des zu stimmen:

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];
  end;
end;

danke ;)