Autor Beitrag
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 05.11.05 21:20 
Hallo, ich habe gerade was von Vignere gelesen und wollte mal nen algo dazu schreiben:
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:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 46

Win XP
Delphi5 Prof
BeitragVerfasst: Sa 05.11.05 23:04 
hallo
ausblenden 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!)
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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:
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:
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 ;)