Autor |
Beitrag |
Carola
Hält's aus hier
Beiträge: 6
Win XP
Delphi 4
|
Verfasst: Fr 24.02.06 19:08
Hallo!!!
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!!!
Liebe Grüße Carola 
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Fr 24.02.06 19:14
Wo genau liegt das Problem? Beim Kodieren mit Cäsar oder beim Erstellen des Schlüssels?
AXMD
|
|
Sirke
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: 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!
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 
Hält's aus hier
Beiträge: 6
Win XP
Delphi 4
|
Verfasst: 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
|
Verfasst: 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
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 public 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: string; var 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)=0) then 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 
Hält's aus hier
Beiträge: 6
Win XP
Delphi 4
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: 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  ).
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
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): string; overload; function entschluessle(s: string): string; overload; end;
implementation
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 result := result + value[i]; end;
function tCaesarCode.entschluessle(c: char): char; var j: integer; begin result := c; for j := 1 to length(c_alpha) do if c = s_Schluesselwert[j] then begin result := c_alpha[j]; exit; end; end;
function tCaesarCode.entschluessle(s: string): string; var i: integer; begin s := lowercase(s); result := ''; for i := 1 to length(s) do result := result + entschluessle(s[i]); 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; for j := 1 to length(c_alpha) do if c = c_alpha[j] then begin result := s_Schluesselwert[j]; exit; end; end;
function tCaesarCode.verschluessle(s: string): string; var i: integer; begin s := lowercase(s); result := ''; for i := 1 to length(s) do result := result + verschluessle(s[i]); 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
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: 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!
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..#90] then 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
|
Verfasst: 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..#90] then ... 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 
Hält's aus hier
Beiträge: 6
Win XP
Delphi 4
|
Verfasst: 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!!!!!!!
|
|