Autor Beitrag
Carola
Hält's aus hier
Beiträge: 6

Win XP
Delphi 4
BeitragVerfasst: Fr 24.02.06 19:08 
Hallo!!! :gruebel:

Ich hab ein großes Problem! Ich muss bis Montag ein Programm schreiben bei dem man mit einem Schlüsselwort einen Text verschlüsseln kann. Wir haben auch schon mit dem CäsarCode verschlüsselt aber mein Problem bei der Verschlüsselung mit einem Schlüsselwort ist, dass ich keine Ahnung davon hab wie ich das mit Schlüsselwort machen soll. Da das Schlüsselwort frei wählbar ist kann jeder x-beliebige Buchstabe dann in dem Schlüsselwort vorkommen.

ein Beispiel: Schlüsselwort : Computer

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
C O M P U T E R a b d f g h i j k l n q s v w x y z

Ich hoffe ihr hab mein Problem erkannt!! Bitte helft mir!!! :( :autsch: :flehan:

Liebe Grüße Carola :beer:
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 24.02.06 19:14 
Wo genau liegt das Problem? Beim Kodieren mit Cäsar oder beim Erstellen des Schlüssels?

AXMD
Sirke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 208
Erhaltene Danke: 2



BeitragVerfasst: Fr 24.02.06 19:39 
Wenn du wissen möchtest, wie man den Schlüssel generiert, dann wäre der Code vllt nicht schlecht, wenn auch nicht perfekt!

ausblenden 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:
var i : Integer;
    Schluessel : String;
    Alphabet : String;
    CodeAlphabet : String;
    IsSet : array[1..26]of Boolean;
begin
  Schluessel := 'COMPUTER';
  Alphabet := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  CodeAlphabet := '';
  for i := 1 to 26 do IsSet[i] := false;
  for i := 1 to Length(Schluessel) do
    if not IsSet[ Ord(Schluessel[i]) - 65 ] then
    begin
      CodeAlphabet := CodeAlphabet + Schluessel[i];
      IsSet[ Ord(Schluessel[i]) - 65 ] := true;
    end;
  for i := 1 to Length(Alphabet) do
    if not IsSet[ Ord(Alphabet[i]) - 65 ] then
    begin
      CodeAlphabet := CodeAlphabet + Alphabet[i];
      IsSet[ Ord(Alphabet[i]) - 65 ] := true;
    end;
end;


CodeAlphabet ist dann n String mit dem Alphabet zum Verschlüsseln!

Is nur ne Idee, ka ob sie funzt!

mfg Sirke
Carola Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 4
BeitragVerfasst: Fr 24.02.06 19:55 
Titel: Problem
Der Cäsar-Code ist ja einfach!! Das macht man ein Editirfeld für den Schlüssel. Den kann man ja dann beliebig verändern. Aber bei dem Schlüsselwort ist ja das Problem das die Buchstaben aus dem Schlüsselwort auch dem Alphabet rausfallen. So verschieben sich ja dann die Zahl die zu dem Buchstaben gehört! Wie ich das eben in dem Beispeil versucht hab zu zeigen! Da man das Schlüsselwort frei wählen kann, fällt bei einem andern wort als Computer ja auch andere Buchstaben aus dem Alphabet raus!!
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.02.06 21:58 
ich verderb dir mal den spass. aber den cäsar mit passwort kannte ich noch nicht. kannst ja die routine zum wiederherstellen des textes posten ;-)


ausblenden volle Höhe 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:
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:
unit uCC;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm5 = class(TForm)
    ev: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    ek: TEdit;
    Button1: TButton;
    Memo: TMemo;
    Label3: TLabel;
    msg: TPanel;
    Label4: TLabel;
    cytxt: TMemo;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Bevel3: TBevel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form5: TForm5;

implementation
{$R *.dfm}
 const
  c_alpha = 'abcdefghijklmnopqrstuvwxyz';

procedure TForm5.Button1Click(Sender: TObject);
 procedure compress(var txt: string);
 var
  i: byte;
  help: string;
 begin
  help := '';
  for i := 1 to length(txt) do
  begin
   if txt[i] <> ' ' then
   begin
    help := help + txt[i];
   end;
  end;
  txt := help;
 end;

 function tolower(txt: string): string;
  var
   i: integer;
 begin
  for I := 1 to length(txt) do
  begin
   if  (ord(txt[i])>= ord('A'))
   and (ord(txt[i]) <= ord('Z')) then
   begin
    txt[i] := char(ord(txt[i]) + (ord('a')- ord('A')));
   end;
  end;
  tolower := txt;
 end;

 procedure entferne_doppelte_zeichen(var txt: string);
 var
  i: integer;
  b: byte;
  s: string;
 begin
  s := c_alpha;
  for i := 1 to length(txt) do
  begin
   b := byte(ord(txt[i]) - ord('a')+1);
   if (s[b] = ' 'then
   begin
    txt[i] := ' ';
   end
   else
   begin
    s[b] := ' ';
   end;
  end;
 end;

 function entferne_zeichen_vom_schluessel(k, s: string): string;
 var
  i, j: integer;
 begin
  for I := 1 to length(k) do
   for j := 1 to length(s) do
    if k[i] = s[j] then
     s[j] := ' ';
  result := s;     
 end;

 function cyber(c: stringvar Schluessel: string): string;
 var
  i,j: integer;
 begin
  for I := 1 to length(c) do
  begin
   for j := 1 to length(c_alpha) do
   begin
    if c[i] = c_alpha[j] then
    begin
     c[i] := schluessel[j];
     break;
    end;
   end;
  end;
  result := c;
 end;

var
 Schluessel: string;
 help: string;
 i   : integer;
begin
 cytxt.Clear;

 schluessel := c_alpha;
 if (strtoint(ev.text) = 0)
 or (length(ek.Text)=0then
 begin
  msg.caption := 'Schlüssel nicht definiert';
  exit;
 end;

 help := copy(schluessel,1,strtoint(ev.text));
 delete(schluessel,1,strtoint(ev.Text));
 schluessel := schluessel + help;

 help := tolower(ek.text);
 entferne_doppelte_zeichen(help);
 compress(help);
 schluessel := entferne_zeichen_vom_schluessel(help, schluessel);
 compress(schluessel);
 schluessel := help + schluessel;

 for I := 0 to memo.Lines.Count - 1 do
  cytxt.Lines.Add(cyber(tolower(memo.lines[i]), schluessel));

 msg.Caption := schluessel;
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
 msg.caption := '';
 ev.Text := '';
 ek.text := '';
 memo.Text := '';
 cytxt.Text := '';
end;

end.
Einloggen, um Attachments anzusehen!
Carola Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 4
BeitragVerfasst: Sa 25.02.06 00:41 
cool danke für den ganzen Quelltext aber 1. hab ich das Proble das ich Delphi 4 hab, da wir in der Schule leider nur damit Porgrammieren und 2. was auch viel wichtiger ist, ist das ich auch wenn ich das alles so übernehmen würde, ich es leider nicht erklären könnte.. gibt es da nicht eine einfacherer Lösung.. vielleicht auch noch mit ner passenden Erklärung dazu so dass es auch Leute verstehen die gerade mal ein 3/4 Jahr Info haben?!
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 25.02.06 01:03 
<smile> aber dies ist dein task, dies zu erklären. der code der läuft wahrscheinlich sogar mit TP5. für delphi müsstest dir noch zwei TEdits und zwei TMemos und 'n TButton reinbasteln. wenn du die exe haben willst, kann ich sie gern noch zusätzlich hochladen. aberer ein wenig was zum nachdenken muss ja schon dabei sein.

sonnst kannst ja auch gar nicht die fragen beantworten die da kommen mögen. nimms einfach als anregung um deine eigene lösung zu entwickeln.

ps.: wäre noch schön, wenn du deine lösung, inkl. entschlüsselung, hier mit veröffentlichen könntest, damit andere auch was davon haben.

nun, noch viel spass und erfolg.

grüsse
wolf


PS: müsstest halt ORD(..) nach CHAR(..) oder byte(..) konvertieren. dann müssts auch noch in TP4 laufen.

PPS: ich würde dir empfehlen den code lauffähig zu machen, und dann mit dem debugger durchzuhoppeln. dann sieht das ganze schon viel angenehmer aus.
Sirke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 208
Erhaltene Danke: 2



BeitragVerfasst: Sa 25.02.06 13:37 
@Grenzgaenger: Ich steige zwar durch deinen Code durch, aber finde es sehr umständlich programmiert und für Leute die nicht mal 1 jahr Informatik haben sind Locale-Funktionen auch nicht so sinnvoll. Außerdem würde ich das Leerzeichen-Entfernen und das Groß-/Kleinschreibeungsproblem in einer Funktion lösen. Das generieren des Schlüssels ist mit meiner Funktion auch einfacher (vllt auch verständlicher :P).
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 26.02.06 20:47 
dann machen wir das halt mal ein wenig einfacher. wird aber nicht mit den niedrigen delphi versionen laufen. dennoch viel spass.


ausblenden volle Höhe 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:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
unit uCCC;

interface
uses sysutils;

type tCaesarCode = class
  const
   c_alpha = 'abcdefghijklmnopqrstuvwxyz';
 private
  i_Anfang: integer;
  s_Schluesselwert: string;
  procedure Set_SchluesselWort(const Value: string);
  procedure set_schluessel(const Value: string);
  function get_schluessel: string;
  function get_anfang: integer;
  procedure set_anfang(i: integer);
  function entferne_doppelte_zeichen(const value: string): string;
  procedure Rotiere_Schluessel;
  function verschluessle(c: char): char; overload;
  function entschluessle(c: char): char; overload;
 published
  constructor create;
  property Anfang: integer read get_anfang write set_anfang;
  property Schluesselwort: string write Set_SchluesselWort;
  property Schluessel: string read get_schluessel write set_schluessel;
  function verschluessle(s: string): stringoverload;
  function entschluessle(s: string): stringoverload;
end;

implementation

{ tCaesarCode }

constructor tCaesarCode.create;
begin
 inherited;
 s_schluesselwert := c_alpha;
 i_anfang := 0;
end;

function tCaesarCode.entferne_doppelte_zeichen(const value: string): string;
var
 i: integer;
begin
 result := '';
 for i := 1 to length(value) do
  if pos(value[i],result)=0 then //Wenn Zeichen nicht vorhanden
   result := result + value[i]; //Zeichen aufnehmen
end;

function tCaesarCode.entschluessle(c: char): char;
var
 j: integer;
begin
 result := c; //standard rückgabewert setzen
 for j := 1 to length(c_alpha) do //ermittle zeichen
  if c = s_Schluesselwert[j] then      //stimmt überein
  begin
   result := c_alpha[j]; //schluesselwert zurückgeben
   exit;
  end;
end;

function tCaesarCode.entschluessle(s: string): string;
var
 i: integer;
begin
 s := lowercase(s);
 result := '';
 for i := 1 to length(s) do  //durchlauf den string
  result := result + entschluessle(s[i]); //entverschluessle
end;

function tCaesarCode.get_anfang: integer;
begin
 result := i_anfang;
end;

function tCaesarCode.get_schluessel: string;
begin
 result := s_schluesselwert;
end;

procedure tCaesarCode.set_schluessel(const Value: string);
begin
 s_schluesselwert := value;
end;

procedure tCaesarCode.Set_SchluesselWort(const Value: string);
begin
 s_schluesselwert := entferne_doppelte_zeichen(lowercase(value)+s_schluesselwert);
end;

function tCaesarCode.verschluessle(c: char): char;
var
 j: integer;
begin
 result := c; //standard rückgabewert setzen
 for j := 1 to length(c_alpha) do //ermittle zeichen
  if c = c_alpha[j] then      //stimmt überein
  begin
   result := s_Schluesselwert[j]; //schluesselwert zurückgeben
   exit;
  end;
end;

function tCaesarCode.verschluessle(s: string): string;
var
 i: integer;
begin
 s := lowercase(s);
 result := '';
 for i := 1 to length(s) do  //durchlauf den string
  result := result + verschluessle(s[i]); //verschluessle
end;

procedure tCaesarCode.Rotiere_Schluessel;
var
 help: string;
begin
 help := copy(s_Schluesselwert,1,anfang);
 delete(s_Schluesselwert,1,anfang);
 schluessel := schluessel + help;
end;

procedure tCaesarCode.set_anfang(i: integer);
begin
 i_anfang := i;
 rotiere_schluessel;
end;

end.
Sirke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 208
Erhaltene Danke: 2



BeitragVerfasst: So 26.02.06 21:25 
Warum benutzt du diese Funktionsflut ? Ich würde das so programmieren und mir damit sehr viel Rechenleistung und Quellcode sparen!

ausblenden volle Höhe 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:
function caesar_clear(str: String): String;
var i: Integer;
begin
  Result := '';
  str := UpperCase( str );
  for i := 1 to length(str) do
    if str[i] in [#65..#90then Result := Result + str[i];
end;

function caesar_key(key: String): String;
var i : Integer;
    IsSet : array[1..26]of Boolean;
begin
  key := caesar_clear( key );
  key := key + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  Result := '';
  for i := 1 to 26 do IsSet[i] := false;
  for i := 1 to Length(key) do
    if not IsSet[ Ord(key[i]) - 64 ] then
    begin
      Result := Result + key[i];
      IsSet[ Ord(key[i]) - 64 ] := true;
    end;
end;

function caesar_encrypt(txt, key: String): String;
var i: Integer;
begin
  Result := '';
  txt := caesar_clear( txt );
  for i := 1 to length(txt) do
    Result := Result + key[ Ord(txt[i]) - 64 ];
end;

function caesar_decrypt(txt, key: String): String;
var i: Integer;
begin
  Result := '';
  txt := caesar_clear( txt );
  for i := 1 to length(txt) do
    Result := Result + Chr( 64 + Pos(txt[i],key) );
end;
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 28.02.06 01:20 
weil es übersichtlich ist und der verständlichkeit dient.

sorry wenn ich dies sage, aber dein code ist kryptisch, da blickt kaum einer durch....

anmerkung:  if str[i] in [#65..#90then ... sollte doch if str[i] in [#65..#91]] then ... heissen, oder nutzt du das "Z" nicht? mal davon abgesehen ist den code vom zeichensatz abhängig. besser wäre es doch, wenn du schreiben würdest: if str[i] in ['A'..'Z']] then ... was denn auch verständlicher wäre...

ps: du hast recht, man könnte hier und da schon noch ein inline; hinzufügen, damit es der compiler auch besser optimieren kann.

noch einen schönen tag.
Carola Threadstarter
Hält's aus hier
Beiträge: 6

Win XP
Delphi 4
BeitragVerfasst: Di 28.02.06 22:58 
Titel: Ich glaub ich bin blöd!!
Also ich find es echt geil was ihr da so hinbekommt!!!!!
Aber ich kann euch sagen diese Aufgabe hat bis jetzt noch keiner aus meinem Kurs und eure Lösungen verstehe ich auch leider nur Ansatzweise!
Also ich hab jetzt herausgefunden das wir das irgendwie auch mit Case lösen sollen, da wir aber noch was mit case gemacht haben, hab ich da nicht wirklich so ne Ahnung von!!! Wenn mir das einer erklären könnte und mir irgendwie helfen kann das programm so simpel wie möglich zuprogrammieren wäre das super klasse!! Sorry aber ich bin leider weiblich!! :-( aber wenn mir das einer ganz genau erklärt dann verstehe ich das auch so mit der Zeit!! Wenn das einer macht bitte bitte bei mir melden!! Hab aus ICQ oder so was womit es ja dann einfach wäre sich zu unterhalten!!!!
BITTE BITTE BITTE HELFT MIR!!!!!!!! SOS SOS SOS SOS!!!!!!!