Verschlüsselungsprogramm mit dem Vigenere-Verfahren

#1
Hi Leute,
ich habe folgendes Problem: Ich soll ein Programm (11. Klasse Informatik Kurs)
entwickeln mit dem man einen beliebiegen Text verschlüsseln bzw. wieder entschlüsseln kann, mit Hilfe des Vigenere Verfahren. Man soll auch die möglichkeit haben ein Schlüsselwort eingeben zu können.
So mein Prob is nun, das ich der völlige Delphi-n00b bin, hab also keinen Plan davon.
Ich erwarte nun von niemandem ein fertiges Prog.....:rolleyes: Aber über zahlreiche Tipps wäre ich sehr dankbar.
(Ich muss dafür auch wissen wie ich "2D-Tabellen" entwerfe, bzw. benutze)
So ich hoffe ihr könnte mir ein bisschen helfen....

mfg
Ironcheese
 
#2
okay, wie ich sehe kann niemand wirklich was mit meinem Prob anfangen. Also ich versuch es zu erklären:


Ersteinmal das Vigenere Verfahren:
Das Vigenere Verfahren gehört zu den besten Verschlüsselungssystemen und wurde erst irgendwann im 18. Jahrhundert geknackt. Es blieb über 100 jahre ungeknackt.
Und nun wie es funtkioniert.
Also man denkt sich eine Tabelle die ungefähr so aussieht:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
.
.
....usw.

So nun nimmt man sich den text den man verschlüsseln will und denkt sich ein Lösungswort aus. Nehmen wir zu Beispiel mal: "Bad"
Man nimmt nun den text entfernt alle leer- und satzzeichen so das er nur noch ein zusammhängendes Stück ist.
Sagen wir unser text war:
"Wann wollen wir uns treffen?"

erstmal alle Satzzeichen raus -> wannwollenwirunstreffen

Nun kommen wir zum eigentlichen verschlüsseln.
Wir nehmen unseren Text und packen dadrunter das lösungswort:

wannwollenwirunstreffen
badbadbadbadbadbadbad

Nun gucken wir oben in der Tabelle. Die oberste Horizontale reihe ist für den Real text und die vertikale für das Lösungswort.
Schauen wir also, die Spalte "W" und die Reihe "B" treffen sich am "X".
(ich hoffe ihr könnte mir noch folgen...)
Der erste Buchstabe des verschlüsselten textes wäre demnach also: x
die verschlüsselte botschaft würde am ende so aussehen:

xaqowrlo..... (kein bock weiterzumachen ;) )

So ich hoffe jetzt wisst ihr so ungefähr was ich für ein Prob hab, ich weiß nämlich nicht WIE ich das machen soll.
Soviel hat mir mein lehrer noch verraten:
Ich brauche 2 Memo felder und die Tabelle mit dem Alphabet.

mfg
Ironcheese
PS. ich zähl auf euch
 

maquai

Active Member
#3
Huhu!


Hab das mal fix für dich erledigt. Hier die Verschlüsselungs-Funktion:

Code:
function code(input:widestring;codeword:string):widestring;
var   buffer  : widestring;
	  vigTab  : array[97..122,97..122] of integer;
	  i,j,c   : integer;
begin
  // kleine Buchstaben:
  input:=lowercase(input);
  codeword:=lowercase(codeword);
  // nur Buchstaben rauskopieren:
  buffer:='';
  while input<>'' do
  begin
	if ((input[1]>='a') and (input[1]<='z')) then
	  buffer:=buffer+input[1];
	Delete(input,1,1);
  end; {while input<>''}
  // bilden der Vigenere Tabelle: (k.a. ob das kürzer geht!)
  for i:=97 to 122 do
  begin
	for j:=97 to 122 do
	begin
	  c:=i+(j-97);
	  if c>122 then
		c:=c-(122-97);
	  vigTab[i,j]:=c; // hier wird der integer Wert des Buchstaben eingetragen
	end;
  end;
  i:=1;
  result:='';
  //
  while buffer<>'' do
  begin
	// Wert aus Tabelle lesen, in Char umwandeln, und an Ergebnis dranhängen:
	result:=result+char(vigTab[integer(codeword[i]),integer(buffer[1])]);
	Delete(buffer,1,1);
	inc(i);
	if i>length(codeword) then
	  i:=1;
  end;
end;
Und hier die Entschlüsselungs-Funktion:

Code:
function decode(input:widestring;codeword:string):widestring;
var   buffer  : widestring;
	  vigTab  : array[97..122,97..122] of integer;
	  i,j,c   : integer;
begin
  // kleine Buchstaben:
  input:=lowercase(input);
  codeword:=lowercase(codeword);
  // nur Buchstaben rauskopieren:
  buffer:='';
  while input<>'' do
  begin
	if ((input[1]>='a') and (input[1]<='z')) then
	  buffer:=buffer+input[1];
	Delete(input,1,1);
  end; {while input<>''}
  // bilden der Vigenere Tabelle: (k.a. ob das kürzer geht!)
  for i:=97 to 122 do
  begin
	for j:=97 to 122 do
	begin
	  c:=i+(j-97);
	  if c>122 then
		c:=c-(122-97);
	  vigTab[i,j]:=c; // hier wird der integer Wert des Buchstaben eingetragen
	end;
  end;
  i:=1;
  result:='';
  //
  while buffer<>'' do
  begin
	// an welcher Stelle steht der codierte Wert:
	for j:=97 to 122 do
	begin
	  if (vigTab[integer(codeword[i]),j])=integer(buffer[1]) then
	  begin
		result:=result+char(j);
		break;
	  end;
	end;
	Delete(buffer,1,1);
	inc(i);
	if i>length(codeword) then
	  i:=1;
  end;
end;

Um das ganze dann zu Nutzen:

memo2.text := code( memo1.text, 'bad');

bzw.:

memo1.text := decode( memo2.text, 'bad');

Noch Fragen?
 
#4
Ja eine Frage hab ich noch:

Und zwar soll auch die möglichkeit gegeben sein das der User das Lösungswort selber aussuchen darf bzw. ein Feld haben muss wo er es eingeben kann.....

sonst habt ihr mir schon

SEHR VIEL

Geholfen 1000 Dank!!!

mfg
Ironcheese
 
#5
Ich brauch noch mal dringend eure Hilfe.....

Hi leute ihr hab mir schon super geholfen aber ich brauche noch ein paar tipps für das endgültig lauffähige programm....

Ich hab als anhang alles drinn was ihr brauchen könntet....
(auch das formular... das konnte ich zusammenklicken ^^ )

mfg
Ironcheese
 

Anhänge

#6
hi,

probiers mal so. :D

Code:
var my,pw:string;
begin
my:=txtEncrypt.text;
pw:=Codeword.text;
txtEncrypt.text:=code(my,pw);
MFG

Triangle Strip
 
Zuletzt bearbeitet:
#7
Ja danke, aber ich hab leider keinen Plan WO ich das einfügen soll.....
Ich weiß sowie so nicht so genau wie ich den obenstehenden Quellcode verwenden soll..... (Ihr müsst wissen ich hab wirklich nicht die geringste ahnung davon....:confused: )
 
#9
Hi, ich weiß wahrscheinlich fang ich schon an zu nerven..... sorry!!

Aber bei mir funzt es immer noch nicht....:mauer:

hier mein kompletter Quellcode bis jetzt.....
Code:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
	Button1: TButton;
	Edit1: TEdit;
	Label1: TLabel;
	procedure Button1Click(Sender: TObject);
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
//Verschlüsseln
 function code(input:widestring;codeword:string):widestring;
var   buffer  : widestring;
   vigTab  : array[97..122,97..122] of integer;
   i,j,c   : integer;
begin
  // kleine Buchstaben:
  input:=lowercase(input);
  codeword:=lowercase(codeword);
  // nur Buchstaben rauskopieren:
  buffer:='';
  while input<>'' do
  begin
 if ((input[1]>='a') and (input[1]<='z')) then
   buffer:=buffer+input[1];
 Delete(input,1,1);
  end; {while input<>''}
  // bilden der Vigenere Tabelle: (k.a. ob das kürzer geht!)
  for i:=97 to 122 do
  begin
 for j:=97 to 122 do
 begin
   c:=i+(j-97);
   if c>122 then
  c:=c-(122-97);
   vigTab[i,j]:=c; // hier wird der integer Wert des Buchstaben eingetragen
 end;
  end;
  i:=1;
  result:='';
  //
  while buffer<>'' do
  begin
 // Wert aus Tabelle lesen, in Char umwandeln, und an Ergebnis dranhängen:
 result:=result+char(vigTab[integer(codeword[i]),integer(buffer[1])]);
 Delete(buffer,1,1);
 inc(i);
 if i>length(codeword) then
   i:=1;
  end;
end;
//Entschlüsseln
function decode(input:widestring;codeword:string):widestring;
var   buffer  : widestring;
   vigTab  : array[97..122,97..122] of integer;
   i,j,c   : integer;
begin
  // kleine Buchstaben:
  input:=lowercase(input);
  codeword:=lowercase(codeword);
  // nur Buchstaben rauskopieren:
  buffer:='';
  while input<>'' do
  begin
 if ((input[1]>='a') and (input[1]<='z')) then
   buffer:=buffer+input[1];
 Delete(input,1,1);
  end; {while input<>''}
  // bilden der Vigenere Tabelle: (k.a. ob das kürzer geht!)
  for i:=97 to 122 do
  begin
 for j:=97 to 122 do
 begin
   c:=i+(j-97);
   if c>122 then
  c:=c-(122-97);
   vigTab[i,j]:=c; // hier wird der integer Wert des Buchstaben eingetragen
 end;
  end;
  i:=1;
  result:='';
  //
  while buffer<>'' do
  begin
 // an welcher Stelle steht der codierte Wert:
 for j:=97 to 122 do
 begin
   if (vigTab[integer(codeword[i]),j])=integer(buffer[1]) then
   begin
  result:=result+char(j);
  break;
   end;
 end;
 Delete(buffer,1,1);
 inc(i);
 if i>length(codeword) then
   i:=1;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
var my,pw:string;
begin
my:=txtEncrypt.text;
pw:=Codeword.text;
txtEncrypt.text:=code(my,pw);
end;
end.
Sorry aber ich bin echt der totale Voll n00b was Delphi angeht. (das soll nicht heissen das in irgend einer anderen sprache mal was gemacht habe..... bis auf HTML aber das zählt ja nicht...)
 
#10
okay langsam fang ich wirklich an zu nerven was?? :rolleyes:

also ich hab selber mal ein bischen rumgebastelt und die ganzen Code sachen die ihr mir gegeben hattet zusammen gefügt.
Das Programm startet mach jedoch irgendwie fehler bei der Verschlüsselung bzw. Entschlüsselung... kp warum... hier nochmal meinen gesamter Quellcode in der neusten version.... ^^

Code:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
	Button1: TButton;
	Edit1: TEdit;
	Label1: TLabel;
	Label2: TLabel;
	Label3: TLabel;
	memo1: TMemo;
	memo2: TMemo;
	Button2: TButton;
	procedure Button1Click(Sender: TObject);
	procedure Button2Click(Sender: TObject);
   
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
 
 
//Verschlüsseln
 function code(input:widestring;codeword:string):widestring;
var   buffer  : widestring;
   vigTab  : array[97..122,97..122] of integer;
   i,j,c   : integer;
begin
  // kleine Buchstaben:
  input:=lowercase(input);
  codeword:=lowercase(codeword);
  // nur Buchstaben rauskopieren:
  buffer:='';
  while input<>'' do
  begin
 if ((input[1]>='a') and (input[1]<='z')) then
   buffer:=buffer+input[1];
 Delete(input,1,1);
  end; {while input<>''}
  // bilden der Vigenere Tabelle: (k.a. ob das kürzer geht!)
  for i:=97 to 122 do
  begin
 for j:=97 to 122 do
 begin
   c:=i+(j-97);
   if c>122 then
  c:=c-(122-97);
   vigTab[i,j]:=c; // hier wird der integer Wert des Buchstaben eingetragen
 end;
  end;
  i:=1;
  result:='';
  //
  while buffer<>'' do
  begin
 // Wert aus Tabelle lesen, in Char umwandeln, und an Ergebnis dranhängen:
 result:=result+char(vigTab[integer(codeword[i]),integer(buffer[1])]);
 Delete(buffer,1,1);
 inc(i);
 if i>length(codeword) then
   i:=1;
  end;
end;
//Entschlüsseln
function decode(input:widestring;codeword:string):widestring;
var   buffer  : widestring;
   vigTab  : array[97..122,97..122] of integer;
   i,j,c   : integer;
begin
  // kleine Buchstaben:
  input:=lowercase(input);
  codeword:=lowercase(codeword);
  // nur Buchstaben rauskopieren:
  buffer:='';
  while input<>'' do
  begin
 if ((input[1]>='a') and (input[1]<='z')) then
   buffer:=buffer+input[1];
 Delete(input,1,1);
  end; {while input<>''}
  // bilden der Vigenere Tabelle: (k.a. ob das kürzer geht!)
  for i:=97 to 122 do
  begin
 for j:=97 to 122 do
 begin
   c:=i+(j-97);
   if c>122 then
  c:=c-(122-97);
   vigTab[i,j]:=c; // hier wird der integer Wert des Buchstaben eingetragen
 end;
  end;
  i:=1;
  result:='';
  //
  while buffer<>'' do
  begin
 // an welcher Stelle steht der codierte Wert:
 for j:=97 to 122 do
 begin
   if (vigTab[integer(codeword[i]),j])=integer(buffer[1]) then
   begin
  result:=result+char(j);
  break;
   end;
 end;
 Delete(buffer,1,1);
 inc(i);
 if i>length(codeword) then
   i:=1;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
memo2.text := code( memo1.text, 'Edit1.text');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
memo2.text := decode( memo1.text, 'Edit1.text');
end;
end.
PS: seid mir nicht böse... ich bin nur ein Delphi n00b!
mfg
Ironcheese
 

maquai

Active Member
#11
Um die Eingabe des Code-Wortes richtig zu nutzen, keine Anführungszeichen um den Objektnamen! Hast du ja bei memo1.text auch nicht gemacht!

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  memo2.text := code( memo1.text, Edit1.text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  memo2.text := decode( memo1.text, Edit1.text);
end;
Sollten die Ausgaben nun immer noch fehlerhaft sein, musst du mal deine Eingaben und die resultierende Ausgabe posten.
 
#12
Hallo, ich bin leider nicht gut in Info und diese Frage wird für euch albern sein. Könnte mir trz jemand dabei helfen für diesen Quelltext bei Lazarus die Form/Maske zu erstellen. Würde mich sehr freuen.

Ganz liebe Grüße
 
Oben