unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Buttons; type TForm1 = class(TForm) Panel1: TPanel; StatusBar1: TStatusBar; GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; StaticText1: TStaticText; Memo1: TMemo; StaticText2: TStaticText; GroupBox4: TGroupBox; ComboBox1: TComboBox; StaticText3: TStaticText; RadioGroup1: TRadioGroup; StaticText4: TStaticText; StaticText5: TStaticText; Label1: TLabel; Label2: TLabel; Edit1: TEdit; UpDown1: TUpDown; Memo2: TMemo; StaticText6: TStaticText; BitBtn1: TBitBtn; BitBtn2: TBitBtn; Edit2: TEdit; Shape1: TShape; Label3: TLabel; RadioGroup2: TRadioGroup; StaticText8: TStaticText; StaticText9: TStaticText; Label4: TLabel; GroupBox5: TGroupBox; Shape2: TShape; Label5: TLabel; Shape3: TShape; Label6: TLabel; BitBtn3: TBitBtn; Button1: TButton; RadioGroup3: TRadioGroup; BitBtn4: TBitBtn; Label7: TLabel; Edit3: TEdit; Edit4: TEdit; StaticText10: TStaticText; StaticText11: TStaticText; Edit5: TEdit; BitBtn5: TBitBtn; Label8: TLabel; Label9: TLabel; ScrollBar1: TScrollBar; Label10: TLabel; Label11: TLabel; BitBtn6: TBitBtn; Edit6: TEdit; StaticText12: TStaticText; Edit7: TEdit; UpDown2: TUpDown; Label12: TLabel; StaticText13: TStaticText; Edit8: TEdit; BitBtn7: TBitBtn; Label13: TLabel; StaticText14: TStaticText; BitBtn8: TBitBtn; StaticText15: TStaticText; Label14: TLabel; StaticText16: TStaticText; StaticText17: TStaticText; StaticText18: TStaticText; StaticText19: TStaticText; Label15: TLabel; procedure FormCreate(Sender: TObject); procedure RadioGroup1Click(Sender: TObject); procedure RadioGroup3Click(Sender: TObject); procedure UpDown1Click(Sender: TObject; Button: TUDBtnType); procedure BitBtn2Click(Sender: TObject); procedure BitBtn4Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); procedure BitBtn5Click(Sender: TObject); procedure RadioGroup2Click(Sender: TObject); procedure BitBtn6Click(Sender: TObject); procedure UpDown2Click(Sender: TObject; Button: TUDBtnType); procedure BitBtn7Click(Sender: TObject); procedure Edit3Change(Sender: TObject); procedure BitBtn8Click(Sender: TObject); procedure ScrollBar1Change(Sender: TObject); procedure keytext_generieren(var inputtext,keyalphabet,keytext,outputtext:string); procedure ComboBox1KeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; MyPlaintextAlphabetLabel: array[0..51] of TLabel; //Feld der Klartext-Alphabet-Buchstaben MyAlphabetCounterPanel: array[0..25] of TPanel; //Feld der Positionsnummern MyCharacterNumberPanel: array[0..25] of TPanel; //Feld der Positionsnummern MyAlphabetShape: array[0..25] of TEdit; //Balken der absoluten Häufigkeit der Zeichen im Alphabet MyInputtextPanel: array[0..25] of TPanel; //Feld der Plaintextzeichen MyKeytextPanel: array[0..25] of TPanel; //Feld der Schlüssel MyOutputtextPanel: array[0..25] of TPanel; //Feld der Cipherzeichen MyAbsCountEdit: array[0..25] of TEdit; //Feld der absoluten Anzahl der einzelnen Buchstaben MyRelCountEdit: array[0..25] of TEdit; //Feld der relativen Anzahl der einzelnen Buchstaben MyGreatEightEdit: array[0..7] of TEdit; //Feld der ermittelten aktuellen "Großen Acht" MyAbsCountLabel: array[0..51] of TLabel; //Feld der einzelnen Buchstaben alphabetpanel_characternumber: byte; //Zähler für die prozentuale Verteilung der Zeichen der Alphabet-Zeichen alphabetshape_characternumber: byte; //Zähler für die Diagramm-Balken der Alphabet-Zeichen cipheralphabet: string; //Cipheralphabet currentcharacter:char; //aktuell betrachtetes Zeichen currentcharacter_ascii:Byte; //ASCII-Code des aktuell betrachtetes Zeichen inputtext:string; //aktueller Eingabetext keytext:string; //aktueller Schlüsseltext outputtext:string; //aktueller Ausgabetext size:Word; //Länge des Eingabetextes abscounter: array[0..25] of Word; //Feld der aktuellen Absolutzähler der Zeichen relcounter: array[0..25] of Real; //Feld der relativen Absolutzähler der Zeichen caesar_keyword:array [1..26] of char; //vorerst behandeln wir das Keyword als ein Arry von Zeichen ;-) caesar_keyword_kennung:array [1..26] of boolean; //wir meken uns, welches Zeichen zum Keyword gehörte ;-) current_keyposition:Integer; //augenblickliche Position im Cipheralphabet keystartposition:Integer; //Startosition im Cipheralphabet keylength:byte; //aktuelle Keywordlänge keyalphabet:string; //aktuell gültiges Keyalphabet current_keylength:Byte; //aktuell vergebene Länge des Keyalphabets explored:boolean; //prüft auf das Vorhandensein eines Zeichens current_character:char; //zu prüfendes Zeichen zwischen A und Z current_max_pos:Word; //gefundene aktuelle Höchstzahl vorkommender Zeichen ordered_array: array[0..25] of Word; //Feld der aktuellen Absolutzähler der Zeichen sorted_character:array [0..25] of char; //Feld der nach statistischer Häufigkeit sortierten Zeichen last_max:Word; //letzte gefundene größte Zeichenanzahl great_eight:string; //das sind die acht häufigsten Zeichen im Eingabetext implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i,j,label_characternumber,panel_characternumber,panel_plaintextnumber,panel_keytextnumber,panel_ciphertextnumber:Integer; absolutanzahl_edit_number,relativanzahl_edit_number,greateight_anzahl_edit_number:Integer; absolut_label_number:Integer; panel_plaintext:char; topwert:Integer; begin absolut_label_number:=0; //erster Label-Box-Index erster Block topwert:=20; for i:=0 to 1 do begin for j:=0 to 12 do begin MyAbsCountLabel[absolut_label_number]:=TLabel.Create(self); with MyAbsCountLabel[absolut_label_number] do begin Parent:=GroupBox5; width:=30; Left:=37*j+30; Top:=topwert; Height:=20; Font.Color:=clNavy; Font.Size:=12; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:=chr(absolut_label_number+65); Tag:=j+i; Show; end;//Ende with inc(absolut_label_number); //Label-Index erhöhen end;//Ende äußere Schleife topwert:=topwert+45; //neue Zeile aufmachen end; //alle ersten Labels vollständig erstellt absolut_label_number:=25; //erster Label-Box-Index zweiter Block topwert:=140; for i:=0 to 1 do begin for j:=0 to 12 do begin MyAbsCountLabel[absolut_label_number]:=TLabel.Create(self); with MyAbsCountLabel[absolut_label_number] do begin Parent:=GroupBox5; width:=30; Left:=37*j+30; Top:=topwert; Height:=20; Font.Color:=clNavy; Font.Size:=12; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:=chr(absolut_label_number+40); //... das erste Alphabet wurde bereits geschrieben Tag:=j+i+26; Show; end;//Ende with inc(absolut_label_number); //Label-Index erhöhen end;//Ende äußere Schleife //alle Labels vollständig erstellt topwert:=topwert+45; //neue Zeile aufmachen end; //alle zweiten Labels vollständig erstellt absolutanzahl_edit_number:=0; //erster Panel-Index topwert:=40; for i:=0 to 1 do begin for j:=0 to 12 do begin MyAbsCountEdit[absolutanzahl_edit_number]:=TEdit.Create(self); with MyAbsCountEdit[absolutanzahl_edit_number] do begin Parent:=GroupBox5; width:=30; Left:=37*j+20; Top:=topwert; Height:=20; Font.Color:=clBlack; Font.Size:=10; Font.Name:='Courier New'; Font.Style:=[FsBold]; Text:='0'; Tag:=j+i; Show; inc(absolutanzahl_edit_number); //Panel-Index erhöhen end;//Ende innere Schleife end;//Ende äußere Schleife topwert:=topwert+45; //neue Zeile aufmachen end; //alle Edit-Boxen vollständig erstellt greateight_anzahl_edit_number:=0; //erster Edit-Box-Index for i:=0 to 25 do begin MyGreatEightEdit[greateight_anzahl_edit_number]:=TEdit.Create(self); with MyGreatEightEdit[greateight_anzahl_edit_number] do begin Parent:=Panel1; width:=18; Left:=27*i+658; Enabled:=True; Top:=50; Height:=6; Font.Color:=clBlack; Font.Size:=14; Font.Name:='Courier New'; Font.Style:=[FsBold]; Text:='?'; Tag:=i; Show; inc(greateight_anzahl_edit_number); //Edit-Box-Index erhöhen end;//Ende äußere Schleife end; //alle 8 Edit-Boxen vollständig erstellt relativanzahl_edit_number:=0; //erster EditBox-Index topwert:=160; for i:=0 to 1 do begin for j:=0 to 12 do begin MyRelCountEdit[relativanzahl_edit_number]:=TEdit.Create(self); with MyRelCountEdit[relativanzahl_edit_number] do begin Parent:=GroupBox5; width:=34; Left:=37*j+20; Top:=topwert; Height:=20; Font.Color:=clRed; Font.Size:=8; Font.Name:='Courier New'; Font.Style:=[FsBold]; Text:='0'; Tag:=j+i; Show; inc(relativanzahl_edit_number); //EditBox-Index erhöhen end;//Ende innere Schleife end;//Ende äußere Schleife topwert:=topwert+45; //neue Zeile aufmachen end; //alle Panels vollständig erstellt label_characternumber:=0; //erster Buchstabenpositions-Index for i:=0 to 25 do //Zählung beginnt bei 0 begin MyPlaintextAlphabetLabel[label_characternumber]:=TLabel.Create(self); with MyPlaintextAlphabetLabel[label_characternumber] do begin Parent:=GroupBox4; width:=25; Left:=30*i+148; Top:=30; Height:=20; Font.Color:=clBlack; Font.Size:=14; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:=chr(label_characternumber+65); Tag:=i; Show; inc(label_characternumber); //Panel-Index erhöhen end;//Ende innere Schleife end; panel_characternumber:=0; //erster Textpositions-Index for i:=0 to 25 do //Zählung beginnt bei 0 begin MyCharacterNumberPanel[panel_characternumber]:=TPanel.Create(self); with MyCharacterNumberPanel[panel_characternumber] do begin Parent:=GroupBox4; width:=25; Left:=30*i+140; Top:=50; Height:=20; Font.Color:=clBlack; Color:=clSkyBlue; Font.Size:=8; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:=IntToStr(panel_characternumber+1); Tag:=i; Show; inc(panel_characternumber); //Panel-Index erhöhen end;//Ende innere Schleife end; panel_plaintextnumber:=0; //erster Plaintextpositions-Index for i:=0 to 25 do //Zählung beginnt bei 0 begin MyInputtextPanel[panel_plaintextnumber]:=TPanel.Create(self); with MyInputtextPanel[panel_plaintextnumber] do begin Parent:=GroupBox4; width:=25; Left:=30*i+140; Top:=130; Height:=20; Font.Color:=clYellow; Color:=clNavy; Font.Size:=14; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:=chr(panel_plaintextnumber+65); Tag:=i; Show; inc(panel_plaintextnumber); //Panel-Index erhöhen end;//Ende innere Schleife end; //alle Textpositionen sind vollständig erstellt panel_keytextnumber:=0; //erster Textpositions-Index for i:=0 to 25 do //Zählung beginnt bei 0 begin MyKeytextPanel[panel_keytextnumber]:=TPanel.Create(self); with MyKeytextPanel[panel_keytextnumber] do begin Parent:=GroupBox4; width:=25; Left:=30*i+140; Top:=210; Height:=20; Font.Color:=clRed; Color:=clSilver; Font.Size:=14; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:=chr(panel_keytextnumber+65); Tag:=i; Show; inc(panel_keytextnumber); //Panel-Index erhöhen end;//Ende innere Schleife end; //alle Textpositionen sind vollständig erstellt panel_ciphertextnumber:=0; //erster Textpositions-Index for i:=0 to 25 do //Zählung beginnt bei 0 begin MyOutputtextPanel[panel_ciphertextnumber]:=TPanel.Create(self); with MyOutputtextPanel[panel_ciphertextnumber] do begin Parent:=GroupBox4; width:=25; Left:=30*i+140; Top:=290; Height:=20; Font.Color:=clWhite; Color:=clBlack; Font.Size:=14; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:='?'; Tag:=i; Show; inc(panel_ciphertextnumber); //Panel-Index erhöhen end;//Ende innere Schleife end; //alle Textpositionen sind vollständig erstellt alphabetpanel_characternumber:=0; for i:=0 to 25 do //Zählung beginnt bei 0 begin MyAlphabetCounterPanel[alphabetpanel_characternumber]:=TPanel.Create(self); with MyAlphabetCounterPanel[alphabetpanel_characternumber] do begin Parent:=GroupBox5; width:=17; Left:=20*i+5; Top:=318; Height:=15; Font.Color:=clBlack; Color:=clFuchsia; Font.Size:=9; Font.Name:='Courier New'; Font.Style:=[FsBold]; Caption:=Chr(alphabetpanel_characternumber+65); Tag:=i; Show; inc(alphabetpanel_characternumber); //Panel-Index erhöhen end; //end with end; //alle Textpositionen sind vollständig erstellt alphabetshape_characternumber:=0; for i:=0 to 25 do //Zählung beginnt bei 0 begin MyAlphabetShape[alphabetshape_characternumber]:=TEdit.Create(self); with MyAlphabetShape[alphabetshape_characternumber] do begin Parent:=GroupBox5; width:=17; Left:=20*i+6; Top:=240; Height:=2; Brush.Color:=clBlack; Tag:=i; Show; inc(alphabetshape_characternumber); //Shape-Index erhöhen end; //end with end;//Ende innere Schleife end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin RadioGroup1.Enabled:=false; //das Arbeitsverfahren kann nicht mehr geschalten werden if RadioGroup1.ItemIndex=0 then begin //Arbeiten mit Versatzwert StatusBar1.Panels[7].Text:=IntToStr(UpDown1.Position); Label2.Visible:=True; Edit7.Visible:=false; Edit7.Text:=chr(UpDown2.Position+64); Edit8.Text:=IntToStr(UpDown1.Position); UpDown2.Visible:=False; BitBtn6.Visible:=false; //Keywordbereinigung nicht möglich StaticText10.Visible:=false; StaticText12.Visible:=false; StaticText15.Visible:=false; StaticText16.Visible:=false; Edit1.Visible:=true; Edit4.Visible:=false; Edit6.Visible:=false; Label7.Caption:='Verschiebe-Position'; Label1.Visible:=true; Label12.Visible:=False; Label14.Visible:=False; RadioGroup2.Visible:=true; ComboBox1.Visible:=false; //Key-Word-Auswahl nicht möglich StatusBar1.Panels[1].Text:='... Arbeiten mit Versatzwert'; StatusBar1.Panels[2].Text:='... Versatzwert'; StatusBar1.Panels[1].Text:='... Arbeiten mit Versatzwert'; UpDown1.Visible:=True; end else begin //Arbeiten mit Keyword StatusBar1.Panels[7].Text:=IntToStr(UpDown2.Position); BitBtn5.Enabled:=False; //READY nicht möglich Edit6.Visible:=True; //Keywordbereinigung möglich Label12.Caption:='Schiebe erstes Zeichen auf:'; Label12.Visible:=True; //Keyword-Eingabe frei gegeben Edit7.Visible:=True; //Keyword-Zeichenzahl-Box Edit7.Text:=chr(UpDown2.Position+64); if Length(ComboBox1.Text)>0 then begin Label3.Caption:=ComboBox1.Text[1]; end else begin Label3.Caption:='?'; end; Edit6.Visible:=true; BitBtn6.Visible:=true; //Keywordbereinigung möglich StaticText10.Visible:=true; StaticText12.Visible:=true; StaticText15.Visible:=true; StaticText16.Visible:=true; Edit1.Visible:=false; Edit4.Visible:=true; Edit7.Visible:=true; Label2.Visible:=false; Label12.Visible:=True; Label7.Caption:='Einfüge-Position'; Label14.Visible:=true; UpDown1.Visible:=False; UpDown2.Visible:=True; RadioGroup2.Visible:=false; ComboBox1.Visible:=true; //Key-Word-Auswahl möglich StatusBar1.Panels[1].Text:='... Arbeiten mit Keyword'; StatusBar1.Panels[2].Text:='... Einfügeposition'; StatusBar1.Panels[1].Text:='... Arbeiten mit Keyword'; end; end; procedure TForm1.RadioGroup3Click(Sender: TObject); begin BitBtn3.Enabled:=true; //Wiederholen ist schaltbar if RadioGroup3.ItemIndex=0 then begin StatusBar1.Panels[9].Text:='Chiffrieren'; StatusBar1.Panels[5].Text:='... nicht chiffriert'; Button1.Caption:='Chiffrieren'; Label15.Caption:='Plaintext'; Label8.Caption:='Keytext'; Label9.Caption:='Ciphertext'; end else begin StatusBar1.Panels[9].Text:='Dechiffrieren'; StatusBar1.Panels[5].Text:='... nicht dechiffriert'; Button1.Caption:='Dechiffrieren'; Label15.Caption:='Ciphertext'; Label9.Caption:='Plaintext'; Label8.Caption:='Keytext'; end; end; procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType); var i:Integer; cipheralphabet:string; begin RadioGroup1.Enabled:=false; //das Verfahren kann nun nicht mehr ohne "Wiederholung" umgeschalten werden Edit7.Text:=chr(UpDown1.Position+1); //Korrektur des Alphabetzählers cipheralphabet:=''; //Cipher-Alphabet leer schreiben keystartposition:=UpDown1.Position; //augenblickliche Key Position von 'A' einlesen current_keyposition:=0; //augenblickliche Key Position von 'A' einlesen Label4.Caption:=IntToStr(UpDown1.Position); StatusBar1.Panels[7].Text:=IntToStr(UpDown1.Position+1); if RadioGroup2.ItemIndex=0 then //wir arbeiten mit Verschiebung nach rechts begin //neuen Versatzwert in das Cipher-Alphabet einfügen - das "A" rückt je eine Position nach rechts for i:=1 to UpDown1.Position do begin cipheralphabet:=cipheralphabet+chr(90-UpDown1.Position+i); end; for i:=1 to 26-UpDown1.Position do begin cipheralphabet:=cipheralphabet+chr(i+64); end; Edit8.Text:=IntToStr(UpDown1.Position+1); //Eintrage-Position im Alphabeth end else //wir arbeiten mit Verschiebung nach links begin //neuen Versatzwert in das Cipher-Alphabet einfügen - das "A" rückt je eine Position nach links {Shape1.Left:=136+UpDown1.Position*30; Label3.Left:=144+UpDown1.Position*30;} current_keyposition:=26-UpDown1.Position; current_keyposition:=UpDown1.Position; for i:=1 to 26-UpDown1.Position do begin cipheralphabet:=cipheralphabet+chr(current_keyposition+65); inc(current_keyposition); end; current_keyposition:=0; for i:=26-UpDown1.Position to 25 do begin insert(chr(current_keyposition+65),cipheralphabet,i+1); inc(current_keyposition); end; end; if RadioGroup2.ItemIndex=0 then begin Edit1.Text:=chr(UpDown1.Position+65); //Verschiebung von "A" innerhalb des Alphabets wird angezeigt end else begin if 90-UpDown1.Position>65 then begin Edit1.Text:=chr(90-UpDown1.Position+1); //Verschiebung von "A" innerhalb des Alphabets wird angezeigt Edit8.Text:=IntToStr(27-UpDown1.Position); //Eintrage-Position im Alphabeth end else begin Edit1.Text:=chr(65); //Verschiebung von "A" innerhalb des Alphabets wird angezeigt Edit8.Text:=IntToStr(1); //Eintrage-Position im Alphabeth end; end; Edit3.Text:=cipheralphabet; end; procedure TForm1.BitBtn2Click(Sender: TObject); var i,j:Integer; behind,changed:boolean; help_position:integer; help_character:char; current_starting:byte; begin UpDown1.Enabled:=true; //das Alphabet kann jetzt verschoben werden RadioGroup1.Enabled:=true; //das Verfahren kann gewählt werden RadioGroup2.Enabled:=true; //die Schieberichtung kann jetzt gewählt werden RadioGroup3.Enabled:=true; //die Arbeitsrichtung kann jetzt gewählt werden GroupBox5.Visible:=True; //Statistik sichtbar BitBtn2.Enabled:=false; //Bereinigungs-Schalter nicht schaltbar BitBtn3.Enabled:=true; //Wiederholungs-Schalter schaltbar BitBtn4.Enabled:=true; //Fünfer-Gruppen schaltbar BitBtn5.Enabled:=true; //READY kann jetzt geschalten werden BitBtn6.Enabled:=true; //"Keyword bereinigen" kann nun geschalten werden size:=Length(Memo1.Text); for i:=0 to 25 do begin MyAbsCountEdit[i].Text:='0'; //asoluten Zeichenzähler zurücksetzen abscounter[i]:=0; MyRelCountEdit[i].Text:='0'; //relativten Zeichenzähler zurücksetzen relcounter[i]:=0; end; if size>0 then begin inputtext:=Memo1.Text; i:=1; while behind=false do begin //begin of while changed:=false; inputtext[i]:=UpCase(inputtext[i]); if (not(inputtext[i] in['0'..'9','Ä','Ü','Ö','ä','ö','ü','A'..'Z','ß'])) then begin //begin of if3 delete(inputtext,i,1); changed:=true; end; //end of if3 if length(inputtext)>0 then begin //begin of if sekundaer0 case inputtext[i] of '0': begin //begin of 0 delete(inputtext,i,1); insert('NULL',inputtext,i); i:=i+3; end; //end of 0 '1': begin //begin of 1 delete(inputtext,i,1); insert('EINS',inputtext,i); i:=i+3; end; //end of 1 '2': begin //begin of 2 delete(inputtext,i,1); insert('ZWEI',inputtext,i); i:=i+3; end; //end of 2 '3': begin //begin of 3 delete(inputtext,i,1); insert('DREI',inputtext,i); i:=i+3; end; //end of 3 '4': begin //begin of 4 delete(inputtext,i,1); insert('VIER',inputtext,i); i:=i+3; end; //end of 4 '5': begin //begin of 5 delete(inputtext,i,1); insert('FUENF',inputtext,i); i:=i+4; end; //end of 5 '6': begin //begin of 6 delete(inputtext,i,1); insert('SECHS',inputtext,i); i:=i+4; end; //end of 6 '7': begin //begin of 7 delete(inputtext,i,1); insert('SIEBEN',inputtext,i); i:=i+5; end; //end of 7 '8': begin //begin of 8 delete(inputtext,i,1); insert('ACHT',inputtext,i); i:=i+3; end; //end of 8 '9': begin //begin of 9 delete(inputtext,i,1); insert('NEUN',inputtext,i); i:=i+3; end; //end of 9 'Ö', 'ö': begin //begin of oe delete(inputtext,i,1); insert('OE',inputtext,i); i:=i+1; end; //end of oe 'Ä', 'ä': begin //begin of ae delete(inputtext,i,1); insert('AE',inputtext,i); i:=i+1; end; //end of ae 'Ü', 'ü': begin //begin of ue delete(inputtext,i,1); insert('UE',inputtext,i); i:=i+1; end; //end of ue 'ß': begin //begin of ss delete(inputtext,i,1); insert('SZ',inputtext,i); i:=i+1; end; //end of ss end; //end of if sekundaer0 if changed=false then begin inc(i); end;{end of then} if i>Length(inputtext) then begin behind:=true; end;{end of then} end; //end of while end; BitBtn4.Enabled:=True; //Fünfer-Gruppen-Schalter freigeben Memo1.Clear; Memo1.Text:=inputtext;{Text neu einschreiben} size:=Length(inputtext); Edit2.Text:=IntToStr(size); end{end of then} else begin with Application do begin NormalizeTopMosts; MessageBox('Die Eingabeseite darf nicht leer sein!', 'Achtung', MB_OK); RestoreTopMosts; end; Button1.Enabled:=true; end;{end of else} //Absolute Frequenzanalyse for i:=1 to Length(inputtext) do begin currentcharacter_ascii:=ord(inputtext[i]); case currentcharacter_ascii of 65: begin // im Eingabetext ein A gefunden inc(abscounter[0]); end; 66: begin // im Eingabetext ein B gefunden inc(abscounter[1]); end; 67: begin // im Eingabetext ein C gefunden inc(abscounter[2]); end; 68: begin // im Eingabetext ein D gefunden inc(abscounter[3]); end; 69: begin // im Eingabetext ein E gefunden inc(abscounter[4]); end; 70: begin // im Eingabetext ein F gefunden inc(abscounter[5]); end; 71: begin // im Eingabetext ein G gefunden inc(abscounter[6]); end; 72: begin // im Eingabetext ein H gefunden inc(abscounter[7]); end; 73: begin // im Eingabetext ein I gefunden inc(abscounter[8]); end; 74: begin // im Eingabetext ein J gefunden inc(abscounter[9]); end; 75: begin // im Eingabetext ein K gefunden inc(abscounter[10]); end; 76: begin // im Eingabetext ein L gefunden inc(abscounter[11]); end; 77: begin // im Eingabetext ein M gefunden inc(abscounter[12]); end; 78: begin // im Eingabetext ein N gefunden inc(abscounter[13]); end; 79: begin // im Eingabetext ein O gefunden inc(abscounter[14]); end; 80: begin // im Eingabetext ein P gefunden inc(abscounter[15]); end; 81: begin // im Eingabetext ein Q gefunden inc(abscounter[16]); end; 82: begin // im Eingabetext ein R gefunden inc(abscounter[17]); end; 83: begin // im Eingabetext ein S gefunden inc(abscounter[18]); end; 84: begin // im Eingabetext ein T gefunden inc(abscounter[19]); end; 85: begin // im Eingabetext ein U gefunden inc(abscounter[20]); end; 86: begin // im Eingabetext ein V gefunden inc(abscounter[21]); end; 87: begin // im Eingabetext ein W gefunden inc(abscounter[22]); end; 88: begin // im Eingabetext ein X gefunden inc(abscounter[23]); end; 89: begin // im Eingabetext ein Y gefunden inc(abscounter[24]); end; 90: begin // im Eingabetext ein Z gefunden inc(abscounter[25]); end; end; //end Case end; for i:=0 to 25 do begin MyAbsCountEdit[i].Text:=IntToStr(abscounter[i]); end; //Relative Frequenzanalyse for i:=0 to 25 do begin relcounter[i]:=abscounter[i]/size*100; MyRelCountEdit[i].Text:=FloatToStrF(relcounter[i],ffFixed,6,2); MyAlphabetShape[i].Top:=318-Round(relcounter[i])*4; MyAlphabetShape[i].Height:=Round(relcounter[i])*4; end; Label11.Caption:=IntToStr(Length(inputtext)); ScrollBar1.Max:=Length(inputtext); for i:=0 to 25 do //schreibe die ersten 26 Plaintextzeichen in die Shape-Bar ein begin MyInputtextPanel[i].Caption:=inputtext[i+1]; MyGreatEightEdit[i].Text:=char(i+65); //fortlaufendes Alphabet einschreiben end; //Bestimmung der aktuellen "Großen Acht" und "Großen Zehn" sowie Sortieren der Aktuellen Häufigkeitsverteilung for i:=0 to 7 do begin MyGreatEightEdit[i].Font.Color:=clGreen; //die großen Acht grün einfärben end; for i:=8 to 9 do begin MyGreatEightEdit[i].Font.Color:=clRed; //die großen Zehn grün einfärben end; current_starting:=0; //Startwert der Felduntersuchung auf 0 setzen for i:=0 to 25 do begin current_max_pos:=i; //Annahme, auf der ersten Position der Restmenge steht das häufigst vorkommende Zeichen for j:=current_starting+1 to 25 do begin if abscounter[j]>=abscounter[current_max_pos] then begin current_max_pos:=j; //neues Größtes Element gefunden last_max:=abscounter[j]; //bereits gefundenes Größtes aus der Suchmenge ausschließen end; end; //change procedure help_character:=MyGreatEightEdit[i].Text[1]; //Feld der aktuellen Absolutzähler der Zeichen help_position:=abscounter[current_max_pos]; MyGreatEightEdit[i].Text:=MyGreatEightEdit[current_max_pos].Text[1]; abscounter[current_max_pos]:=abscounter[i]; MyGreatEightEdit[current_max_pos].Text:=help_character; abscounter[i]:=help_position; inc(current_starting); end; //sortierte Folge der großen Acht ins Datenfeld einschreiben great_eight:=''; for i:=0 to 25 do begin great_eight:=great_eight+MyGreatEightEdit[i].Text[1]; end; StatusBar1.Panels[13].Text:=great_eight; end; procedure TForm1.BitBtn4Click(Sender: TObject); var blocktext:string; i:Integer; begin if BitBtn4.Caption = 'Fünfer-Gruppen' then begin BitBtn4.Caption:='Blocktext'; blocktext:=inputtext; i:=0; repeat inc(i); if i mod 6=0 then begin insert(' ',blocktext,i); inc(size); end; until i=size; Memo1.Clear; Memo1.Text:=blocktext; end else begin BitBtn4.Caption:='Fünfer-Gruppen'; Memo1.Text:=inputtext; end; end; procedure TForm1.Button1Click(Sender: TObject); var i,j:Integer; ascii_in:byte; //ASCII-Code des aktuell behandelten Input-Zeichens ascii_key:byte; //ASCII-Code des aktuell behandelten Key-Zeichens ascii_out:byte; //ASCII-Code des aktuell behandelten Ausgabe-Zeichens key_position:byte; //Position des aktuellen Zeichens im Key-Alphabet found:boolean; //"gefunden" begin outputtext:=''; //outputtext leer setzen Button1.Enabled:=false; ScrollBar1.Enabled:=True; //Weiterschalten in den Alphabeten ist möglich if RadioGroup3.ItemIndex=0 then //Chiffrieren ist gewählt begin if RadioGroup1.ItemIndex=0 then //es wird mit Versatzwert gearbeitet begin if RadioGroup2.ItemIndex=0 then //Chiffrieren mit Versatz nach rechts ist geschalten begin for i:=1 to Length(inputtext) do begin//Chifrieren mit Versatzwert rechts current_character:=inputtext[i]; //aktelles Zeichen aus dem Eingabetxt holen found:=false; j:=1; //Startzähler für das Plainalphabet repeat //Suche das Zeichen im Plainalphabet if current_character=Edit5.Text[j] then begin found:=true; end; inc(j); //Suchzähler erhöhen until found=true; outputtext:=outputtext+Edit3.Text[j-1]; //hole das Cipherzeichen aus dem Cipheralphabet (j wurde bereits um 1 erhöht) end; Memo2.Text:=outputtext; for i:=0 to 25 do begin MyOutputtextPanel[i].Caption:=outputtext[i+1]; end; StatusBar1.Panels[5].Text:='... chiffriert'; //Chiffrieren mittels Versatzwert rechts ist beendet end else //Chiffrieren mit Versatz nach links ist geschalten begin for i:=1 to Length(inputtext) do begin//Chifrieren mit Versatzwert links current_character:=inputtext[i]; //aktelles Zeichen aus dem Eingabetxt holen found:=false; j:=1; //Startzähler für das Plainalphabet repeat //Suche das Zeichen im Plainalphabet if current_character=Edit5.Text[j] then begin found:=true; end; inc(j); //Suchzähler erhöhen until found=true; outputtext:=outputtext+Edit3.Text[j-1]; //hole das Cipherzeichen aus dem Cipheralphabet (j wurde bereits um 1 erhöht) StatusBar1.Panels[5].Text:='... chiffriert'; end; Memo2.Text:=outputtext; for i:=0 to 25 do begin MyOutputtextPanel[i].Caption:=outputtext[i+1]; end; //Chiffrieren mittels Versatzwert links ist beendet end; end else //es wird mit Keyword gearbeitet und Chiffriert begin for i:=1 to Length(inputtext) do begin//Chifrieren mit Versatzwert rechts current_character:=inputtext[i]; //aktelles Zeichen aus dem Eingabetxt holen found:=false; j:=1; //Startzähler für das Plainalphabet repeat //Suche das Zeichen im Plainalphabet if current_character=Edit5.Text[j] then begin found:=true; end; inc(j); //Suchzähler erhöhen until found=true; outputtext:=outputtext+Edit3.Text[j-1]; //hole das Cipherzeichen aus dem Cipheralphabet (j wurde bereits um 1 erhöht) end; Memo2.Text:=outputtext; for i:=0 to 25 do begin MyOutputtextPanel[i].Caption:=outputtext[i+1]; end; StatusBar1.Panels[5].Text:='... chiffriert'; //Chiffrieren mittels Keyword ist beendet end; end else //Dechiffrieren ist gewählt begin if RadioGroup1.ItemIndex=0 then begin //es wird mit Versatzwert gearbeitet if RadioGroup2.ItemIndex=0 then //Versatz nach rechts ist geschalten begin for i:=1 to Length(inputtext) do begin//Dechifrieren mit Versatzwert rechts current_character:=inputtext[i]; //aktelles Zeichen aus dem Eingabetxt holen found:=false; j:=1; //Startzähler für das Cipheralphabet repeat //Suche das Zeichen im Cipheralphabet if current_character=Edit3.Text[j] then begin found:=true; end; inc(j); //Suchzähler erhöhen until found=true; outputtext:=outputtext+Edit5.Text[j-1]; //hole das Plainzeichen aus dem Plainalphabet (j wurde bereits um 1 erhöht) end; Memo2.Text:=outputtext; for i:=0 to 25 do begin MyOutputtextPanel[i].Caption:=outputtext[i+1]; end; StatusBar1.Panels[5].Text:='... dechiffriert'; //Dechiffrieren mittels Versatzwert rechts ist beendet end else //Versatz nach links ist geschalten begin for i:=1 to Length(inputtext) do begin//Dechifrieren mit Versatzwert links current_character:=inputtext[i]; //aktelles Zeichen aus dem Eingabetxt holen found:=false; j:=1; //Startzähler für das Cipheralphabet repeat //Suche das Zeichen im Cipheralphabet if current_character=Edit3.Text[j] then begin found:=true; end; inc(j); //Suchzähler erhöhen until found=true; outputtext:=outputtext+Edit5.Text[j-1]; //hole das Plainzeichen aus dem Plainalphabet (j wurde bereits um 1 erhöht) end; Memo2.Text:=outputtext; for i:=0 to 25 do begin MyOutputtextPanel[i].Caption:=outputtext[i+1]; end; //Dechiffrieren mittels Verschiebung ist beendet end; end else //es wird mit Keyword gearbeitet begin for i:=1 to Length(inputtext) do begin//Dechifrieren mit Versatzwert links current_character:=inputtext[i]; //aktelles Zeichen aus dem Eingabetxt holen found:=false; j:=1; //Startzähler für das Cipheralphabet repeat //Suche das Zeichen im Cipheralphabet if current_character=Edit3.Text[j] then begin found:=true; end; inc(j); //Suchzähler erhöhen until found=true; outputtext:=outputtext+Edit5.Text[j-1]; //hole das Plainzeichen aus dem Plainalphabet (j wurde bereits um 1 erhöht) end; Memo2.Text:=outputtext; for i:=0 to 25 do begin MyOutputtextPanel[i].Caption:=outputtext[i+1]; end; //Dechiffrieren mittels Verschiebung ist beendet end; end; Memo2.Text:=outputtext; end; procedure TForm1.BitBtn3Click(Sender: TObject); //der Wiederhole-Button var i:Integer; begin keylength:=0; //aktuell bereinigtes Keyword zurücksetzen keyalphabet:=''; for i:=1 to 26 do begin caesar_keyword[i]:=' '; end; if RadioGroup1.ItemIndex=0 then begin UpDown2.Visible:=false; //Keyword-Einfügeposition wird nicht angezeigt Edit7.Visible:=false; // " " " " " Label12.Visible:=false; // " " " " " UpDown1.Visible:=true; //Versatzwert wird angezeigt Edit7.Visible:=true; // " " " Label2.Visible:=true; // " " " end else begin UpDown2.Visible:=true; //Keyword-Einfügeposition wird angezeigt Edit7.Visible:=true; // " " " " Label12.Visible:=true; // " " " " end; GroupBox5.Visible:=False; //Statistik nicht sichtbar ScrollBar1.Enabled:=True; //Weiterschalten in den Alphabeten ist nicht möglich Memo1.TabOrder:=0; //Eingabefeld aktivieren Edit2.Text:='0'; //Textlänge 0 setzen Edit3.Text:='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //Ausgangsmuster für bereinigtes Alphabet setzen Edit6.Text:='0'; //Keywordlänge 0 setzen Edit4.Text:=''; //Keyword leer setzen Label11.Caption:='???'; //aktuelle zeichenzahl unbekannt UpDown1.Enabled:=false; //Positionsänderung ist derzeit nicht möglich BitBtn4.Caption:='Fünfer-Gruppen'; //PFünfer Gruppen schalten ist möglich Button1.Enabled:=false; //es kann nicht chiffriert oder dechiffriert werden ComboBox1.Enabled:=true; //Keyword-Auswal möglich BitBtn2.Enabled:=true; //Bereinigungs-Schalter ist schaltbar BitBtn3.Enabled:=false; //Wiederholen ist nicht schaltbar BitBtn4.Enabled:=false; //Fünfer-Gruppen nicht schaltbar BitBtn5.Enabled:=false; //READY kann nicht mehr geschalten werden BitBtn6.Enabled:=true; //Keyword-Bereinigung möglich BitBtn7.Enabled:=true; //Eingabetext löschen kann geschalten werden BitBtn8.Enabled:=False; //Cipheralhabet-Generator gesperrt Memo1.Clear; //Eingabe löschen Memo2.Clear; //Ausgabe löschen StatusBar1.Panels[5].Text:='... nicht chiffriert'; RadioGroup1.Enabled:=true; //Schlüsselwahl möglich RadioGroup2.Enabled:=true; //Richtungswahl möglich RadioGroup3.Enabled:=true; //Auswahl der Arbeitsrichtung möglich for i:=0 to 25 do begin MyAbsCountEdit[i].Text:='0'; //asoluten Zeichenzähler zurücksetzen abscounter[i]:=0; MyRelCountEdit[i].Text:='0'; //relativten Zeichenzähler zurücksetzen relcounter[i]:=0; end; end; procedure TForm1.BitBtn5Click(Sender: TObject); //der Ready-Button - hier wird alles für die jeweiligen Vorgänge vorbereitet ;-) var startposition:byte; //ab hier beginnt das Schiebealphabet oder das Keyword begin UpDown1.Enabled:=false; //Positionsänderung ist nicht möglich BitBtn3.Enabled:=true; //Wiederholen ist schaltbar BitBtn4.Enabled:=false; //Fünfer-Gruppen nicht schaltbar BitBtn5.Enabled:=false; //READY kann nicht mehr geschalten werden BitBtn7.Enabled:=false; //Eingabetext löschen kann nicht mehr geschalten werden RadioGroup1.Enabled:=false; //keine Schlüsselwahl mehr möglich RadioGroup2.Enabled:=false; //keine Wahl der Arbeitsrichtung mehr möglich RadioGroup3.Enabled:=false; //keine Wahl der Arbeitsrichtung mehr möglich Button1.Enabled:=true; //es kann chiffriert oder dechiffriert werden //startposition:=StrToInt(Edit1.Text); //keytext:=cipheralphabet; //das ist in Bezug auf Richtigkeit heute 27.04.2016 höchst ungewiss end; procedure TForm1.RadioGroup2Click(Sender: TObject); begin if RadioGroup2.ItemIndex=0 then begin StatusBar1.Panels[11].Text:='... nach rechts'; end else begin StatusBar1.Panels[11].Text:='... nach links'; end; end; procedure clear_keyword; var keyword:string; //das Keyword von Anfang bis Ende - also bereinigt length_keyword:Integer; //Worst-Case - falls ein Doofmann kommt und wirklich das Keyword mit mehr als 32768 Zeichen zu verwenden ;-) key_counter,clearcounter,i,j:Byte; //key_counter zählt die bereinigte Keywordlänge exist:boolean; begin caesar_keyword[i]:=' '; //aktuelles Keyword mit Leerzeichen beschreiben for i:=1 to 26 do begin caesar_keyword_kennung[i]:=false; //Zeichen als nicht zum Keyword gehörig erklären end; Form1.Edit4.Text:=''; clearcounter:=Form1.UpDown1.Position+1; //Anfangsposition im Feld setzen -1, da erst erhöht und danach geschrieben wird keyword:=Form1.ComboBox1.Text; //vorgegebenes Keyword einlesen length_keyword:=Length(keyword); //OriginalLänge des Keyword einlesen Form1.ComboBox1.Enabled:=false; //Keyword-Auswal nicht mehr möglich Form1.BitBtn6.Enabled:=false; //Keyword-Bereinigung nicht mehr möglich caesar_keyword[clearcounter]:=keyword[1]; //erstes Zeichen des eingegebenen Keywords übernehmen - es ist zwangsläufig korrekt, wenn etwas eingegeben wurde key_counter:=1; repeat exist:=false; //Annahme, dass das Zeichen noch nicht enthalten ist currentcharacter:=keyword[key_counter]; //Aktuelles Zeichen einlesen for i:=1 to clearcounter do begin //alle bisher ermittelten Zeichen auf Übereinstimmung prüfen und bei Wiederholung ausschließen if currentcharacter=keyword[i] then begin exist:=true; end; end; //aktuelles Zeichen ist geprüft if exist=false then begin inc(clearcounter); if clearcounter<=26 then begin caesar_keyword[clearcounter]:=currentcharacter; caesar_keyword_kennung[clearcounter]:=true; //Zeichen bis vor 26 als zum Keyword gehörig erklären end else begin caesar_keyword[clearcounter-26]:=currentcharacter; caesar_keyword_kennung[clearcounter]:=true; //Zeichen nach 26 als zum Keyword gehörig erklären end; end; inc(key_counter) until key_counter=length_keyword+1; for i:=1 to 26 do begin Form1.Edit4.Text:=Form1.Edit4.Text+caesar_keyword[i]; //aktuelles Keywzeichen in die Ausgabe schreiben end; Form1.Edit6.Text:=IntToStr(clearcounter); //Zeichenanzehl des bereinigten keywords anzeigen end; procedure TForm1.BitBtn6Click(Sender: TObject); var i:byte; begin clear_keyword; //Calling PROCEDURE claer_keyword BitBtn8.Enabled:=True; //Cipheralhabet-Generator freigegeben UpDown2.Enabled:=true; //das Keyword kann jetzt eingesetzt werden keyalphabet:='..........................'; //Correllationszeichen um Fehler zu vermeiden current_keylength:=0; //derzeitiges Keyalphabet ist 0 Zeichen lang keystartposition:=UpDown2.Position; //aktuelle Einfügeposition für das bereinigte Keyword keylength:=StrToInt(Edit6.Text); //aktuelle Länge des Keywords current_keyposition:=keystartposition; for i:=1 to keylength do begin keyalphabet[current_keyposition]:=caesar_keyword[i]; //Einschreiben des aktuellen Zeichens in das Keyalphabet inc(current_keyposition); //erhöht die aktuelle Position im Keyalphabet inc(current_keylength); //erhöht die augenblickliche Key-Alphabet Länge um eins if current_keyposition>26 then begin current_keyposition:=1; //setze am Anfang des Keyalphabet fort end; end; //Keyword korrekt in das Keyalphabet eingetragen Edit3.Text:=keyalphabet; //Cipheralphabet zum Kopieren in Edit-Box eingetragen Label13.Caption:=keyalphabet; //Cipheralphabet unveränderbar in Label-Feld eingetragen end; procedure TForm1.UpDown2Click(Sender: TObject; Button: TUDBtnType); var i:Integer; begin StatusBar1.Panels[7].Text:=IntToStr(UpDown2.Position-1); RadioGroup1.Enabled:=false; //das Verfahren kann nun nicht mehr ohne "Wiederholung" umgeschalten werden cipheralphabet:=''; //Cipher-Alphabet leer schreiben keystartposition:=UpDown2.Position; //augenblickliche Key Position von 'A' einlesen current_keyposition:=keystartposition; //augenblickliche Key Position von 'A' einlesen BitBtn3.Enabled:=true; //Wiederholen ist jetzt möglich Edit7.Text:=chr(UpDown2.Position+64); Edit8.Text:=IntToStr(UpDown2.Position); Label4.Caption:=IntToStr(UpDown2.Position); Label14.Caption:=IntToStr(UpDown2.Position-1); StatusBar1.Panels[7].Text:=IntToStr(UpDown2.Position); keyalphabet:='..........................'; //Correllationszeichen um Fehler zu vermeiden for i:=1 to keylength do begin delete(keyalphabet,current_keyposition,1); //Punkt löschen insert(caesar_keyword[i],keyalphabet,current_keyposition); //Einschreiben des aktuellen Zeichens in das Keyalphabet inc(current_keyposition); // erhöht die aktuelle Position im Keyalphabet if current_keyposition>26 then begin current_keyposition:=1; //setze am Anfang des Keyalphabet fort end; end; //Keyword korrekt in das Keyalphabet eingetragen Edit3.Text:=keyalphabet; //Cipheralphabet zum Kopieren in Edit-Box eingetragen Label13.Caption:=keyalphabet; //Cipheralphabet unveränderbar in Labal-Feld eingetragen end; procedure TForm1.BitBtn7Click(Sender: TObject); begin Memo1.Clear; BitBtn4.Caption:='Fünfer-Gruppen'; //PFünfer Gruppen schalten ist möglich BitBtn2.Enabled:=true; //Eingabetext bereinigen schaltbar BitBtn4.Enabled:=false; //Fünfer-Gruppen nicht schaltbar end; procedure TForm1.Edit3Change(Sender: TObject); begin Label13.Caption:=Edit3.Text; end; procedure TForm1.BitBtn8Click(Sender: TObject); var i,j:byte; restkeyword:string; begin BitBtn5.Enabled:=True; //READY-Schalten ist freigegeben UpDown2.Enabled:=False; //Verschiebung des Keywords kann nicht mehr gewählt werden BitBtn8.Enabled:=False; //Cipheralphabet-Schalter gesperrt keyalphabet:=Edit4.Text; //garantiert richtig bereinigtes Keyword; for i:=65 to 90 do begin explored:=false; //Zeichen gilt als bisher nicht vorhanden for j:=1 to length(keyalphabet) do begin if keyalphabet[j]=chr(i) //Test auf Vorhandensein im bisherigen Keyword then begin explored:=true; //Zeichen gilt als vorhanden end; end; if explored=false then begin keyalphabet:=keyalphabet+chr(i); //Anhängen des aktuellen Zeichens end; end; //Eintragen des Cipheralphabets current_keyposition:=UpDown2.Position; //aktuelle Einschreibstelle des Keywords //Anzahl der Zeichen am Ende herauskopieren restkeyword:=copy(keyalphabet,length(keyalphabet)-current_keyposition+2,current_keyposition); //Löschen delete(keyalphabet,length(keyalphabet)-current_keyposition+2,current_keyposition-1); //Einfügen insert(restkeyword,keyalphabet,0); Edit3.Text:=keyalphabet; //Cipheralphabet zum Kopieren in Edit-Box eingetragen Label13.Caption:=keyalphabet; //Cipheralphabet unveränderbar in Label-Feld eingetragen keytext_generieren(inputtext,keyalphabet,keytext,outputtext); //Call Procedure keytext_generieren end; procedure TForm1.keytext_generieren(var inputtext,keyalphabet,keytext,outputtext:string); var i:integer; character_counter:integer; current_character_inputtext:char; //aktuell zu untersuchendes Eingabezeichen aus der Menge des Eingabetextes plainalphabet:string; //Plainalphabet - die Zeichen von "A" bis "Z" current_character_keytext:char; //aktuell zu erstellendes Keytextzeichen aus der Menge des Keytextes found:boolean; //signalisiert, dass aktuelles Zeichen gefunden begin //Schlüsselalphabet zusammenstellen und eintragen keytext:=''; //Schlüsseltext leer schreiben outputtext:=''; //Ausgabetext leer schreiben plainalphabet:=Edit5.Text; //Klartextalphabet einlesen keyalphabet:=Edit3.Text; //Keyalphabet einlesen character_counter:=1; if RadioGroup3.ItemIndex=0 then begin //Verschlüsseln ist gewählt for i:=1 to length(inputtext) do begin current_character_inputtext:=inputtext[i]; character_counter:=1; found:=false; //Zeichen-Indikator falsch setzen repeat if current_character_inputtext=plainalphabet[character_counter] //Suche die Position des aktuellen Eingabezeichens im Alphabet then begin found:=true; end; inc(character_counter); until (found=true)or(character_counter=26); current_character_keytext:=keyalphabet[character_counter-1]; keytext:=keytext+current_character_keytext; outputtext:=outputtext+current_character_keytext; end; for i:=0 to 25 do begin MyKeytextPanel[i].Caption:=keytext[i+1]; end; end else begin //Entschlüsseln ist gewählt end; end; //Ende der keytext-Procedure procedure TForm1.ScrollBar1Change(Sender: TObject); var i:Integer; begin for i:=0 to 25 do //schreibe die ersten 26 Plaintextzeichen in die Shape-Bar ein begin MyInputtextPanel[i].Caption:=inputtext[ScrollBar1.Position+i+1]; MyKeytextPanel[i].Caption:=keytext[ScrollBar1.Position+i+1]; MyOutputtextPanel[i].Caption:=outputtext[ScrollBar1.Position+i+1]; end; end; procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin if not (Key in [#8,'a'..'i','k'..'z','A'..'I','K'..'Z']) then Key:=#0; if (Key in ['a'..'z']) then Key:=chr(ord(Key)-32); end; end.