Gleich mal meine erste Frage! Ich bin gerade dabei polyalphabetische Ersetzungschiffren zu programmieren. Die Caesar-Verschlüsselung bzw. Vigenère-Verschlüsselung habe ich schon erfolgreich programmiert, doch jetzt komme ich beim Schleppnetzverfahren nicht mehr weiter.
Zum Schleppnetzverfahren auch Autokey-Verschlüsselung genannt:
Die Autokey-Vigenère-Verschlüsselung (auch als Vigenère-Selbstschlüssel-Verfahren bekannt) vermeidet die Periodizität des Schlüsselwortes indem sie den Schlüssel durch Anhängen des Klartextes verlängert:Text: geheimnis
Schlüsselwort: AKEY
Schlüssel: AKEYGEHEI
Cyphertext: GOLCOQUMA
Quelle: Wikipedia
Folgenden Quellcode habe ich zurzeit:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
{ TSchleppnetzverfahren }
TSchleppnetzverfahren = class(TForm)
Loeschen: TButton;
Dechiffrieren: TButton;
Chiffrieren: TButton;
Schluesselwort: TEdit;
Klar: TMemo;
Code: TMemo;
procedure ChiffrierenClick(Sender: TObject);
procedure DechiffrierenClick(Sender: TObject);
procedure LoeschenClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Schleppnetzverfahren: TSchleppnetzverfahren; Schlusselwort : string;
implementation
function uppercase(s: string): string;
var i: integer;
begin
for i:= 1 to length(s)
do s[i]:= upcase(s[i]);
result:= s;
end;
{ TSchleppnetzverfahren }
procedure TSchleppnetzverfahren.ChiffrierenClick(Sender: TObject);
var
Zeile, Spalte: integer;
TempStr: string;
KlarZeichen, CodeZeichen: Char;
Schluesselzeichen: char;
begin
Schlusselwort:= uppercase(Schlusselwort);
Code.Lines.Clear;
for Zeile:= 0 to Klar.Lines.Count-1
do begin
TempStr:= '';
for Spalte:= 1 to length(Klar.Lines[Zeile])
do begin
SchluesselZeichen:= Schlusselwort[1];
delete(Schlusselwort,1,1);
KlarZeichen:= upcase(Klar.Lines[Zeile][Spalte]);
if KlarZeichen in ['A'..'Z']
then Schlusselwort:= Schlusselwort + Klarzeichen
else Schlusselwort:= Schlusselwort + 'A';
if KlarZeichen in ['A'..'Z']
then begin
CodeZeichen:= chr((ord(KlarZeichen)-65 + (ord(SchluesselZeichen)-65)) mod 26 + 65);
end
else CodeZeichen:=KlarZeichen;
TempStr:= TempStr+CodeZeichen;
end;
Code.Lines.Add(TempStr);
end;
end;
procedure TSchleppnetzverfahren.DechiffrierenClick(Sender: TObject);
var
zeile, Spalte: integer;
TempStr: string;
KlarZeichen, CodeZeichen: Char;
SchluesselZeichen: char;
begin
Schlusselwort:= uppercase(Schlusselwort);
Klar.Lines.Clear;
for zeile:= 0 to Code.Lines.Count-1
do begin
TempStr:= '';
for Spalte:= 1 to length(Code.Lines[zeile])
do begin
SchluesselZeichen:= Schlusselwort[1];
delete(Schlusselwort,1,1);
CodeZeichen:= upcase(Code.Lines[Zeile][Spalte]);
if CodeZeichen in ['A'..'Z']
then begin
KlarZeichen:= chr((ord(CodeZeichen)-65+26- (ord(SchluesselZeichen)-65)) mod 26 + 65);
end
else KlarZeichen:=CodeZeichen;
if KlarZeichen in ['A'..'Z']
then Schlusselwort:= Schlusselwort + Klarzeichen
else Schlusselwort:= Schlusselwort + 'A';
TempStr:= TempStr+KlarZeichen;
end;
Klar.Lines.Add(TempStr);
end;
end;
procedure TSchleppnetzverfahren.LoeschenClick(Sender: TObject);
begin
Klar.Lines.Clear;
Code.Lines.Clear;
end;
initialization
{$I unit1.lrs}
end.
Beim Starten in Lazarus wird es ohne Probleme gestartet doch beim Drücken des Chiffrieren bzw. Dechiffrieren Buttons kommt folgende Fehlermeldung.
Project raised exception class 'External: SIGSEGV
Kompilieren kann ich das Projekt, doch beim Drücken des Buttons kommt folgende Fehlermeldung:
TApplication.HandleException Access violation
Stack trace:
$08084CF0 TSCHLEPPNETZVERFAHREN__DECHIFFRIERENCLICK, line 94 of unit1.pas
$0814D214 TCONTROL__CLICK, line 2094 of ./include/control.inc
$0815F79F TBUTTONCONTROL__CLICK, line 52 of ./include/buttoncontrol.inc
$0815FE55 TCUSTOMBUTTON__CLICK, line 185 of ./include/buttons.inc
$081602F1 TBUTTON__CLICK, line 329 of ./include/buttons.inc
$0816000A TCUSTOMBUTTON__WMDEFAULTCLICKED, line 240 of ./include/buttons.inc
$08068E59
$08143E54 TWINCONTROL__WNDPROC, line 4749 of ./include/wincontrol.inc
$0826E7C3 DELIVERMESSAGE, line 103 of lclmessageglue.pas
$0826D3F0 GTK2WSBUTTON_CLICKED, line 1633 of gtk2wsstdctrls.pp
$B79FA3A4
$B79ECC7B
$B7A02E57
$B7A044B9
$B7A04936
$B7B28BDA
$B7B2A1F8
Ich benutze Ubuntu 9.04 und Lazarus v0.9.26.2-0 rUnknown i386-linux-gtk 2 (beta). Außerdem kann ich die Caption, also den Inhalt der Memo nicht ändern, ich wollte gerne das die Memos leer sind. Ich programmiere noch nicht lange und konnte leider keinen Fehler finden, vielleicht kann mir jemand einen Tip geben und mir helfen.
Schon mal vielen Dank im Voraus.
Alci