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: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182:
| unit Enigma;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Mask, Menus;
type TForm1= class(TForm) Klartext: TMemo; Kodierung: TMemo; BeginnWalze1: TComboBox; AuswahlWalze1: TComboBox; AuswahlWalze2: TComboBox; BeginnWalze2: TComboBox; AuswahlWalze3: TComboBox; BeginnWalze3: TComboBox; AuswahlReflektor: TComboBox; procedure KlartextKeyPress(Sender: TObject; var GedrueckteTaste: Char); procedure WalzenAuswahl(Sender: TObject); procedure AnfangsPositionen(Sender: TObject); procedure KlartextKeyDown(Sender: TObject; var GedrueckteTaste: Word; SpezialTasten: TShiftState); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; KodierterChar: Char; DrehungenWalze1: Integer = 10; DrehungenWalze2: Integer = 15; DrehungenWalze3: Integer = 19; NummerWalze1: Integer = 2; NummerWalze2: Integer = 6; NummerWalze3: Integer = 0; NummerReflektor: Integer = 0; PositionWalze1, PositionWalze2, PositionWalze3, PositionReflektor : Integer; KodierterText: String = ''; AlleReflektoren: String = 'YRUHQSLDPXNGOKMIEBFZCWVJATFVPJIAOYEDRZXWGCTKUQSBNMHL'; AlleWalzen := ' EKMFLGDQVZNTOWYHXUSPAIBRCJAJDKSIRUXBLHWTMCQGZNPYFVOE BDFHJLCPRTXVZNYEIWGAKMUSQOESOVPZJAYQUIRHXLNFTGKDCMWB VZBRGITYUPSDNHLXAWMJQOFECKJPGVOUMFYQBENHZRDKASXLICTW NZJHGRCXMYSWBOUFAIVLPEKQDTFKQHTLXOCBJSPDZRAMEWNIUYGV'; AlleWalzenNummern: String = '"Walze Nr. I", "Walze Nr. II", "Walze Nr. III", "Walze Nr. IV", "Walze Nr. V", "Walze Nr. VI", "Walze Nr. VII", "Walze Nr. VIII"'; Reflektor: String = 'YRUHQSLDPXNGOKMIEBFZCWVJAT'; Walze1: String = 'BDFHJLCPRTXVZNYEIWGAKMUSQO'; Walze2: String = 'NZJHGRCXMYSWBOUFAIVLPEKQDT'; Walze3: String = 'EKMFLGDQVZNTOWYHXUSPAIBRCJ'; AngezeigteWalzen: TStringList;
implementation {$R *.dfm}
function Verschluesselung(Buchstabe: Char; WalzenDrehungen: Integer; Walze, Status: String): Char; var WalzenPosition: Integer; begin if (Status = 'Hinweg') then WalzenPosition := Ord(Buchstabe) - 64 + WalzenDrehungen else WalzenPosition := Pos(Buchstabe, Walze) + (26 - WalzenDrehungen); if (WalzenPosition >= 27) then Dec(WalzenPosition, 26); if (Status = 'Hinweg') then Result := Walze[WalzenPosition] else Result := Chr(WalzenPosition + 64); end;
procedure TForm1.KlartextKeyPress(Sender: TObject; var GedrueckteTaste: Char); begin if (GedrueckteTaste in ['a'..'z', 'A'..'Z', #13, #32]) then begin if (KodierterText = '') then begin AuswahlReflektor.Enabled := false; AuswahlWalze1.Enabled := false; AuswahlWalze2.Enabled := false; AuswahlWalze3.Enabled := false; BeginnWalze1.Enabled := false; BeginnWalze2.Enabled := false; BeginnWalze3.Enabled := false; end; GedrueckteTaste := UpCase(GedrueckteTaste); case GedrueckteTaste of 'A'..'Z' : begin
KodierterChar := Verschluesselung(GedrueckteTaste, DrehungenWalze1, Walze1, 'Hinweg'); KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze2, Walze2, 'Hinweg'); KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze3, Walze3, 'Hinweg');
KodierterChar := Verschluesselung(KodierterChar, 0, Reflektor, 'Hinweg');
KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze3, Walze3, 'Rückweg'); KodierterChar := Verschluesselung(KodierterChar, DrehungenWalze2, Walze2, 'Rückweg');
if ((Length(Klartext.text) + 1) mod 5 = 0) then begin KodierterText := KodierterText + ' ' + Verschluesselung(KodierterChar, DrehungenWalze1, Walze1, 'Rückweg'); Klartext.Text := Klartext.Text + ' '; Klartext.SelStart := Length(Klartext.Text); end else KodierterText := KodierterText + Verschluesselung(KodierterChar, DrehungenWalze1, Walze1, 'Rückweg');
if (DrehungenWalze1 >= 27) then begin Dec(DrehungenWalze1, 26); Inc(DrehungenWalze2); end else Inc(DrehungenWalze1); if (DrehungenWalze2 >= 27) then begin Dec(DrehungenWalze2, 26); Inc(DrehungenWalze3); end; if (DrehungenWalze3 >= 27) then Dec(DrehungenWalze3, 26); end;
#13 : KodierterText := KodierterText + #13#10;
#32 : KodierterText := KodierterText + ' '; end;
Kodierung.Text := KodierterText;
with Kodierung do begin SelStart := Length(Kodierung.Text); SendMessage(Kodierung.Handle, EM_Scrollcaret, 0, 0); end;
end else GedrueckteTaste := #0; end;
procedure TForm1.WalzenAuswahl(Sender: TObject); var i, WalzenNummer : Integer; AusgewaehlteWalze : String; begin AlleReflektoren := 'YRUHQSLDPXNGOKMIEBFZCWVJATFVPJIAOYEDRZXWGCTKUQSBNMHL'; AlleWalzen := ' EKMFLGDQVZNTOWYHXUSPAIBRCJAJDKSIRUXBLHWTMCQGZNPYFVOE BDFHJLCPRTXVZNYEIWGAKMUSQOESOVPZJAYQUIRHXLNFTGKDCMWB VZBRGITYUPSDNHLXAWMJQOFECKJPGVOUMFYQBENHZRDKASXLICTW NZJHGRCXMYSWBOUFAIVLPEKQDTFKQHTLXOCBJSPDZRAMEWNIUYGV'; if TComboBox(Sender).Name = 'AuswahlReflektor' then for i := 1 to 26 do Reflektor[i] := AlleReflektoren[i + 26 * AuswahlReflektor.ItemIndex] else begin AngezeigteWalzen := TStringList.Create; try AngezeigteWalzen.LoadFromFile('WalzenListe.txt'); AusgewaehlteWalze := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex]; WalzenNummer := AngezeigteWalzen.IndexOf(AusgewaehlteWalze); if TComboBox(Sender).Name = 'AuswahlWalze1' then begin AngezeigteWalzen.Delete(AuswahlWalze2.ItemIndex); AngezeigteWalzen.Delete(AuswahlWalze3.ItemIndex); for i := 1 to 26 do Walze1[i] := AlleWalzen[i + 26 * WalzenNummer]; end;
if TComboBox(Sender).Name = 'AuswahlWalze2' then begin AngezeigteWalzen.Delete(AuswahlWalze1.ItemIndex); AngezeigteWalzen.Delete(AuswahlWalze3.ItemIndex); for i := 1 to 26 do Walze2[i] := AlleWalzen[i + 26 * WalzenNummer]; end;
if TComboBox(Sender).Name = 'AuswahlWalze3' then begin AngezeigteWalzen.Delete(AuswahlWalze1.ItemIndex); AngezeigteWalzen.Delete(AuswahlWalze2.ItemIndex); for i := 1 to 26 do Walze3[i] := AlleWalzen[i + 26 * WalzenNummer]; end; TComboBox(Sender).Items := AngezeigteWalzen; TComboBox(Sender).ItemIndex := TComboBox(Sender).Items.IndexOf(AusgewaehlteWalze); finally AngezeigteWalzen.Free; end; end; end;
procedure TForm1.AnfangsPositionen(Sender: TObject); begin if TComboBox(Sender).Name = 'BeginnWalze1' then DrehungenWalze1 := BeginnWalze1.ItemIndex; if TComboBox(Sender).Name = 'BeginnWalze2' then DrehungenWalze2 := BeginnWalze2.ItemIndex; if TComboBox(Sender).Name = 'BeginnWalze3' then DrehungenWalze3 := BeginnWalze3.ItemIndex; end;
procedure TForm1.KlartextKeyDown(Sender: TObject; var GedrueckteTaste: Word; SpezialTasten: TShiftState); begin if (GedrueckteTaste in [vk_Down, vk_Home, vk_Left, vk_Next, vk_Prior, vk_Right, vk_Up]) or (ssShift in SpezialTasten) or (ssAlt in SpezialTasten) or (ssCtrl in SpezialTasten) then GedrueckteTaste := 0; end;
end. |