Entwickler-Ecke

Sonstiges (Delphi) - Chiffrierung mit einem Schlüsselwort


DissA$teR! - Sa 17.11.07 15:04
Titel: Chiffrierung mit einem Schlüsselwort
Hallo.
Zuerst einmal Entschuldigung, falls dies das falsche Unterforum ist, aber ich wusste nicht wo ich es sonst hätte reinschreiben sollen.
Ich bin 12. Klasse an einem Gymnasium und wir behandeln gerade die Chiffrierung in Informatik. Zwar habe ich den Grundgedanken verstanden, habe jedoch keine Ahnung, wie ich dies mit Delphi (können wahlweise auch Turbo Pascal verwenden) umsetzen kann. Leider schreiben wir nächste Woche einen Test dazu und ich hoffe dass ihr mir vielleicht die Vorgehensweise mit Delphi erklären könnt. Zur Veranschaulichung des Problems möchte ich euch erst einmal ein Beispiel geben:

Chiffrierung mit einem Schlüssel

Bsp:
Schlüsselwort (W): Geheimschrift
Schlüsselbuchstabe (S): E

___ 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 (Klartextalphabet)
--> U X Y Z G E H I M S C R F T A B D J K L N O P Q U V (Geheimtextalphabet)

Man soll praktisch in dem fertigen Programm W, S und den Klartext eingeben und der Geheimtext soll ausgegeben werden. Mein Problem ist jedoch, dass ich noch nicht mal weiß, wie ich auf das Geheimtextalphabet komme. Könnt ihr mir das erklären?
Dankeschön schonmal im Voraus.

Mfg, DissA$teR!


Moderiert von user profile iconjasocul: Topic aus VCL (Visual Component Library) verschoben am Di 20.11.2007 um 08:31


IceBube - Sa 17.11.07 16:19

Hallo!

Ich weiß nicht ob ich das jetzt richtig verstanden habe, jedoch habe ich mir mal erlaubt einen Code zu schreiben.

Sicher ein bissl umständlich...


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:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
function ZahlToBuchstabe(Zahl:integer):string;
begin
Result := '';
//
if Zahl = 1 then Result := 'a';
if Zahl = 2 then Result := 'b';
if Zahl = 3 then Result := 'c';
if Zahl = 4 then Result := 'd';
if Zahl = 5 then Result := 'e';
if Zahl = 6 then Result := 'f';
if Zahl = 7 then Result := 'g';
if Zahl = 8 then Result := 'h';
if Zahl = 9 then Result := 'i';
if Zahl = 10 then Result := 'j';
if Zahl = 11 then Result := 'k';
if Zahl = 12 then Result := 'l';
if Zahl = 13 then Result := 'm';
if Zahl = 14 then Result := 'n';
if Zahl = 15 then Result := 'o';
if Zahl = 16 then Result := 'p';
if Zahl = 17 then Result := 'q';
if Zahl = 18 then Result := 'r';
if Zahl = 19 then Result := 's';
if Zahl = 20 then Result := 't';
if Zahl = 21 then Result := 'u';
if Zahl = 22 then Result := 'v';
if Zahl = 23 then Result := 'w';
if Zahl = 24 then Result := 'x';
if Zahl = 25 then Result := 'y';
if Zahl = 26 then Result := 'z';

if Result = '' then Result := 'a';
exit;
end;

function BuchstabeToZahl(Buchstabe:char):integer;
begin
Result := -1;
//
if LowerCase(Buchstabe)='a' then Result := 1;
if LowerCase(Buchstabe)='b' then Result := 2;
if LowerCase(Buchstabe)='c' then Result := 3;
if LowerCase(Buchstabe)='d' then Result := 4;
if LowerCase(Buchstabe)='e' then Result := 5;
if LowerCase(Buchstabe)='f' then Result := 6;
if LowerCase(Buchstabe)='g' then Result := 7;
if LowerCase(Buchstabe)='h' then Result := 8;
if LowerCase(Buchstabe)='i' then Result := 9;
if LowerCase(Buchstabe)='j' then Result := 10;
if LowerCase(Buchstabe)='k' then Result := 11;
if LowerCase(Buchstabe)='l' then Result := 12;
if LowerCase(Buchstabe)='m' then Result := 13;
if LowerCase(Buchstabe)='n' then Result := 14;
if LowerCase(Buchstabe)='o' then Result := 15;
if LowerCase(Buchstabe)='p' then Result := 16;
if LowerCase(Buchstabe)='q' then Result := 17;
if LowerCase(Buchstabe)='r' then Result := 18;
if LowerCase(Buchstabe)='s' then Result := 19;
if LowerCase(Buchstabe)='t' then Result := 20;
if LowerCase(Buchstabe)='u' then Result := 21;
if LowerCase(Buchstabe)='v' then Result := 22;
if LowerCase(Buchstabe)='w' then Result := 23;
if LowerCase(Buchstabe)='x' then Result := 24;
if LowerCase(Buchstabe)='y' then Result := 25;
if LowerCase(Buchstabe)='z' then Result := 26;
end;

function ChiffreWord(Word:string;Key:integer):string;
var i : integer;
Zahl,cZahl : integer;
begin
//Buchstaben verwechseln
Result := '';

for i := 1 to Length(Word) do begin
Application.ProcessMessages;

Zahl := BuchstabeToZahl(Word[i]);
//
if Zahl <> -1 then begin

//
cZahl := Key-Zahl;
if cZahl < 1 then cZahl := 26-(cZahl * (-1));
//
if Word[i] = LowerCase(Word[i]) then begin
Result := Result + ZahlToBuchstabe(cZahl);
end else begin
Result := Result + Uppercase(ZahlToBuchstabe(cZahl));
end;
//
end
else
begin
Result := Result + Word[i];
end;
end;

exit;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
//KEY = 1-26
Edit2.Text := ChiffreWord(Edit1.Text,23);
end;


P.s.: Habs jedoch nicht mit einer Zahl von 1-26 gemacht...

PP.s.: Sicher ists leider nicht.... :/

lg


ub60 - Sa 17.11.07 19:57

Also, als erstes, der erste Buchstabe im Geheimtextalphabet sollte ein W sein.
Dann noch ein kleiner Schnipsel, der etwas kürzer und leichter zu ändern sein sollte:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Klartextalphabet:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Geheimtextalphabet:='WXYZGEHIMSCRFTABDJKLNOPQUV'
Geheimtext:=''
for i:=1 to Length(KlarText) do
  begin
    Position:=Pos(Klartext[i],KlartextAlphabet);
    Buchstabe:=GeheimtextAlphabet[Position];
    Geheimtext:=Geheimtext+Buchstabe;
  end;

ub60


gispos - So 18.11.07 22:02

Also wenn ich es richtig verstanden habe, dann geht es um eine Verschlüsselung eines String?
Dies macht z.B. die untere Function. aText ist der String der verschlüsselt werden
soll, Schluessel ist eben der Schlüssel mit dem Verschlüsselt wird (das Passwort).
Rückgabe ist der verschlüsselte String. Zum endschlüsseln, wird das Result als aText
mit gleichem Schlüssel wieder übergeben.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function XORString(const aText, Schluessel: String): String;
var i,q: integer;
    sc: String;
begin
  q:= 1;
  if Trim(Schluessel)= '' then
    sc:= 'xyqwejwughb' // wenn kein Schlüssel übergeben wird, wird default gesetzt.
  else sc:= Schluessel;
  Result:= aText;
  // Hier wird verschlüsselt
  If Result<> '' then
  for i:= 1 to Length(Result) do
  begin
    Result[i]:= Chr(Ord(aText[i]) XOR Ord(sc[q]));
    inc(q);
    if q> length(sc) then q:= 1;
  end;
end;

Als Nachtrag ein kleines Beispiel.
Gruß gispos


Delete - So 18.11.07 23:24

guckste hier: http://www.delphi-forum.de/viewtopic.php?t=68558&highlight=caesar


DissA$teR! - Mo 19.11.07 18:20

Dankeschön für eure schnellen und konstruktiven antworten. Ich werde es gleich heute abend mal ausprobieren und falls ich dann noch fragen haben sollte, werde ich sie morgen stellen.


Xion - Mo 19.11.07 18:46

user profile iconub60 hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
Klartextalphabet:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Geheimtextalphabet:='WXYZGEHIMSCRFTABDJKLNOPQUV';



dabei sollte man bedenken, dass so der Schlüssel im Klartext in der exe steht :wink:


ub60 - Mo 19.11.07 21:12

user profile iconXion hat folgendes geschrieben:
user profile iconub60 hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
Klartextalphabet:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Geheimtextalphabet:='WXYZGEHIMSCRFTABDJKLNOPQUV';



dabei sollte man bedenken, dass so der Schlüssel im Klartext in der exe steht :wink:

@Xion:
Wir reden von monoalphabetischer Substitution! Nicht von Fort Knox. :D :lol: :D
Aber wenn Du schon dabei bist: Gib doch mal einen Weg an, wie Du einen Schlüssel angibst, der nicht in der EXE steht.

ub60


Xion - Mo 19.11.07 21:22

klar steht er in der exe (irgendwie). Aber z.B. so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Str:='';
Str:=Str+'H';
Str:=Str+'e';
Str:=Str+'l';
Str:=Str+'l';
Str:=Str+'o';
Str:=Str+' ';
Str:=Str+'W';
Str:=Str+'o';
Str:=Str+'r';
Str:=Str+'l';
Str:=Str+'d';

nicht im Klartext ;)

grundsätzlich finde ich auch die Verschlüsselungen, wo ein Buchstabe immer genau einem andren zugeordnet wird, nicht so toll (vor allem im Zeitalter des Computers). z.B. könnte man nicht den andren Buchstaben nehmen, sondern erst noch die Position im Wort dazuzählen.
Bsp:
Schlüssel=WHEODRL
Hello=>EDEOH (die beiden l's werden zu verschiedenen Buchstaben)

//PS: das hat aber irgendwie nichts mehr mit dem Topic zu tun ;)


jaenicke - Di 20.11.07 09:19

user profile iconDissA$teR! hat folgendes geschrieben:
Chiffrierung mit einem Schlüssel

Bsp:
Schlüsselwort (W): Geheimschrift
Schlüsselbuchstabe (S): E

___ 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 (Klartextalphabet)
--> U X Y Z G E H I M S C R F T A B D J K L N O P Q U V (Geheimtextalphabet)

Man soll praktisch in dem fertigen Programm W, S und den Klartext eingeben und der Geheimtext soll ausgegeben werden. Mein Problem ist jedoch, dass ich noch nicht mal weiß, wie ich auf das Geheimtextalphabet komme. Könnt ihr mir das erklären?

Was passiert ist ja, dass alle doppelten Buchstaben aus dem Schlüsselwort entfernt werden.
Geheimschrift --> Gehimscrft
Nun wird das Resultat den Buchstaben ab dem Schlüsselbuchstaben zugeordnet:
E --> G, F --> E, G --> H, usw.
Der Rest wird dann nach dem Alphabet zugerodnet, wobei bereits verwendete Buchstaben ignoriert werden.

Im Anhang befindet sich ein Beispielprogramm, das ich bei mir liegen hatte.