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
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 public 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..26, 1..26] of char; var hilfe : string; var i, asci, s, z, stelle, x : byte; begin
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;
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*16) mod CHAR_COUNT+FIRST_CHAR); end;
function GetVignereChar(const aText,aKey : string; aIndex,aDirection : integer) : char; begin Result := RotateChar( aText[aIndex], (Ord(Upcase(aKey[(aIndex-1) mod Length(aKey)+1]))-FIRST_CHAR)*aDirection); end;
function Vignere(const aText,aKey : string; aDirection : integer) : string; 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..26, 1..26] of char; var hilfe : string; var i, asci, s, z, stelle, x : byte;
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; |
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..26, 1..26] of char; var hilfe: string; var asci, s, z, stelle, x, i : byte; begin
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;
hilfe := ''; stelle:= 1; for x :=1 to length(kryptogrammtextzeile) do begin hilfe := hilfe + VigenereQuadrat[ ]; 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..26, 1..26] of char; var hilfe: string; var buchstabe, line, Spalte, j, zeile, i: byte; begin
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;
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..26] of 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; |
stimmt, so kann man das quad auch machen ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!