Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jesus Gast
|
Verfasst am: 19. Jun 2005 16:36 Titel: Cäsar-Verschlüsselung |
|
|
Muss ein Programm zum ver- und entschlüsseln entwickeln. Bin in Delphi nicht mehr so gängig, Pseudo-Code folgt. Man kann wahrscheinlcih viele Schritte zusammenfassen, aber wir haben in letzter Zeit viel mit Assembler gearbeitet...
1. Was ich erstmal bestätigt haben muss ist mein theoretischer Ansatz
Verschlüsseln:
- 3 Edit-Felder, (a) für Text, (b) für Schlüssel, (c) für verschlüsselten Text, Button zum Verschlüsseln
- Schlüssel in (b) als Zahlangeben (Verschiebungszahl - var vz)
- OnClick: Text aus (a) wird in ASCii-Code verwandelt, var vz wird addiert, von ASCii in Buchstabe umgewandelt und ausgegeben. Will dieses mit einer For-To Schleife machen. Code: | z := length(editA) //glaube das war so um chars zu zählen.
for i:=1 to z do
begin
y := read.editA(i);
x := ord(y);
w := x + vz;
v := char(w);
write.editC(v);
inc(i); |
Entschlüsseln:
- Die selben Edit-Felder, Button zum Entschlüsseln
- Schlüssel wird in (b) geschrieben (Verschiebungzahl - var vz)
- OnClick: Text aus (c) wird in ASCii-Code verwandelt, var vz wird subtrahiert, von ASCii in Buchstabe umgewandelt und ausgegeben. Code eigentlich gleich wie oben, außer:
Ist das alles richtig so? Oder habe ich etwas verpasst?
2. Ich bin mir unsicher darüber ob ich zwischen groß und klein Buchstaben unterscheiden muss, wenn ja müsste doch ein If-Then genügen, oder? Vielleicht lieber Repeat, while, until?
3. Warum ist Pascal und Delphi getrennt, ist doch das Gleiche
4. Danke für jede Hilfe |
|
Nach oben |
|
 |
|
Erchamion
Anmeldungsdatum: 07.06.2005 Beiträge: 13
|
Verfasst am: 19. Jun 2005 18:38 Titel: |
|
|
1. Da stimmt imo einiges nicht, obwohl das Prinzip der Caesarverschlüsselung richtig ist. Sieh dir am besten nochmal die Klasse TEdit, for-Schleifen und Strings an.
Ansonsten: Warum probierst du den Quelltext nicht einfach aus, der Compiler wird dir schon die Fehler anzeigen ...
2. Ich würde vor dem codieren alles mit lowercase() in Kleinbuchstaben verwandeln.
3. Pascal ist nicht das selbe wie Delphi. Pascal ist imho wesentlich älter, unterstützt keine Objektorientierung und keine Windowsoberflächen. Delphi ist quasi eine Erweiterung zu Pascal. |
|
Nach oben |
|
 |
ED209
Anmeldungsdatum: 30.05.2005 Beiträge: 122
|
Verfasst am: 21. Jun 2005 11:20 Titel: |
|
|
1. Hmm besteht der Caesar-Schluessel nur aus einer Zahl?
2. Muss da nicht irgendwo noch ein Modulo in den Code?
3. Wirklich zeitgemaess ist der Chiffre nicht :) _________________ +++++++++++++[>++++>+<<-]>.--.>---. |
|
Nach oben |
|
 |
Tobias
Anmeldungsdatum: 15.02.2005 Beiträge: 149
|
Verfasst am: 22. Jun 2005 16:41 Titel: |
|
|
Ja, der Casesar-Schlüssel besteht aus einer Zahl. Die Zahl gibt an um wieviele Buchstaben das Alphabet verschoben wird.
Dann darf man nicht einfach nur addieren sondern muss auf Überträge achten.
Wenn ich in ASCII einfach eine Zahl auf "Z" addiere, dann lande ich außerhalb des Alphabets. Du musst aber nach "Z" wieder bei "A" anfangen.
Am einfachsten ist es, den ASCII-Code in eine Zahl zwischen 0 für "A" und 25 für "Z" umzuwandeln. Dann kannst du deinen Schlüssel addieren und für den Rest die Modulo-Operation verwenden.
Beim Entschlüsseln hast du dieselben Probleme auf der anderen Seite des Alphabets. Hier darfst du nicht einfach von "A" noch etwas abziehen sondern musst wieder bei "Z" beginnen. Die Entschlüsselung ist aber dasselbe wie die Verschlüsselung mit dem Schlüssel 25-Key. |
|
Nach oben |
|
 |
Jesus Gast
|
Verfasst am: 22. Jun 2005 21:31 Titel: |
|
|
mit Pascal = Delphi sprach ich nicht vom Program sondern von der SPrache.
Problem : Delphi gibt es nur an den Schulrechnern und wir sollen dieses Program zu Hause entwickeln. Deswegen ist Trial & Error leider nicht möglich.
Edit-Felder: Code: | edText
edKey
edEnkrypted | Buttons: Code: | btEnkrypt
btDekrypt | Variablen:[code]a, b, c, e, f: integer
d: char[/char]a ist die länge vom eingegebenen Text
b ist der Schlüssel
c ist einfach nur eine integer-var
d speichert Buchstabe in lowercase ab
e speichert ASCii-Code vom Buchstaben ab
f speichert die neue Nummer für den Buchstaben ab[code]OnClick btEnkrypt
a := length(edTexT); // stimmt das so?
b := strtoint(edKey.text);
for c := 1 to a do
begin
d := lowercase(edText.text(b))
e := ord(d); // ist die Frage ob der dann an Stelle "c" den einen Buchstaben liest
f := e + b;
edEnkrypted.text := char(f); // wird das Programm dann nicht für jedes "c" den Text neu Speichern anstatt hinzufügen?
inc(c);
end;
OnClick btDekrypt
a := length(edEnkrypted);
b := strtoint(edKey.text);
for c := 1 to a do
begin
d := lowercase(edEnkrypted.text(b))
e := ord(d);
f := e - b;
edText.text := char(f);
inc(c);
end;[/code]
Die Zahlen von 0-25 als das Alphabet zu benutzen anstatt den Standard ASCii code ist doch viel zu umständlich, dann muss ich einmal dass hier machen:
e := ord(d) - 97; // weil a = 97
und dann später zu f wieder addieren damit auch der richtige Buchstabe rauskommt. Für die Rechnung bei f>'z' wäre das natürlich hilfreich, aber man könnte doch auch:[code]If f>122 then
f := 97 + (f - 122)[/code]
oder etwa nicht?
Hilfe wie immer willkommen! |
|
Nach oben |
|
 |
Jesus
Anmeldungsdatum: 22.06.2005 Beiträge: 2 Wohnort: Neben Gott
|
Verfasst am: 22. Jun 2005 22:06 Titel: |
|
|
Jetzt mal richtig:
Edit-Felder: Code: | edText
edKey
edEnkrypted | Buttons: Code: | btEnkrypt
btDekrypt | Variablen: Code: | a, b, c, e, f: integer
d: char | a ist die länge vom eingegebenen Text
b ist der Schlüssel
c ist einfach nur eine integer-var
d speichert Buchstabe in lowercase ab
e speichert ASCii-Code vom Buchstaben ab
f speichert die neue Nummer für den Buchstaben ab Code: | OnClick btEnkrypt
a := length(edTexT); // stimmt das so?
b := strtoint(edKey.text);
for c := 1 to a do
begin
d := lowercase(edText.text(b))
e := ord(d); // ist die Frage ob der dann an Stelle "c" den einen Buchstaben liest
f := e + b;
edEnkrypted.text := char(f); // wird das Programm dann nicht für jedes "c" den Text neu Speichern anstatt hinzufügen?
inc(c);
end;
OnClick btDekrypt
a := length(edEnkrypted);
b := strtoint(edKey.text);
for c := 1 to a do
begin
d := lowercase(edEnkrypted.text(b))
e := ord(d);
f := e - b;
edText.text := char(f);
inc(c);
end; |
Die Zahlen von 0-25 als das Alphabet zu benutzen anstatt den Standard ASCii code ist doch viel zu umständlich, dann muss ich einmal dass hier machen:
e := ord(d) - 97; // weil a = 97
und dann später zu f wieder addieren damit auch der richtige Buchstabe rauskommt. Für die Rechnung bei f>'z' wäre das natürlich hilfreich, aber man könnte doch auch: Code: | If f>122 then
f := 96 + (f - 122) | oder etwa nicht?
beim entschlüsseln dann: Code: | If f<97 then
f := 123 - (97 - f) |
|
|
Nach oben |
|
 |
zoiX
Anmeldungsdatum: 28.06.2005 Beiträge: 8
|
Verfasst am: 29. Jun 2005 15:27 Titel: |
|
|
Jesus: For-Schleifen solltest du dir dringend nochmal anschauen.
Das Increment in deinen Schleifen ist (zumindest bei meinem Delphi) nicht nötig. Dafür fehlt ein End - dann sähe der Code schonmal so aus (Variablen bennen ich mal um)
Variablen:
TextLen = a -> Textlänge
Key = b -> Schlüssel
n = c -> Integervariable
LowCase = d -> Zeichen in lowercase
PlainASCii = e -> ASCii-Code im Klartext
CodeASCii = f -> ASCii-Code "verschlüsselt"
Dazu kommen neu:
Code: |
Plaintext: String;
Crypttext: String;
|
Die sollten selbsterklärend sein.
Code: |
//Variablenwerte festlegen
Crypttext := ''
Plaintext := edText.text;
Key := strtoint(edKey.text);
TextLen := length(Plaintext);
//Verschlüsselung
For i := 1 to TextLen do begin
LowCase := lowercase(Plaintext[i]);
PlainASCii := ord(LowCase);
CodeASCii := PlainASCii + Key;
Crypttext := Crypttext + char(CodeASCii);
End;
//Ausgabe
edEnkrypted.text := Crypttext;
End;
|
Die Entschlüsselung ist quasi das umgekehrte (man ändere das Vorzeichen von Key).
Probleme bisher:
-Wir "verlassen" unter Umständen das Alphabet
-Groß-/Kleinschreibung werden nicht unterschieden (Dafür müsste man allerdings einfach nur ein "lowercase" entfernen, solange man nicht beachtet, dass man u.U. das Alphabet verlässt)
Allerdings hab ich nu keine Zeit mehr, sonst würd ich mich noch dransetzen... |
|
Nach oben |
|
 |
Jesus
Anmeldungsdatum: 22.06.2005 Beiträge: 2 Wohnort: Neben Gott
|
Verfasst am: 29. Jun 2005 20:25 Titel: |
|
|
zoiX hat Folgendes geschrieben: | Jesus: For-Schleifen solltest du dir dringend nochmal anschauen.
Das Increment in deinen Schleifen ist (zumindest bei meinem Delphi) nicht nötig. Dafür fehlt ein End - dann sähe der Code schonmal so aus (Variablen bennen ich mal um) |
das stimmt allerdings, wie geagt wir haben in letzter zeit viel mit assembler gearbeitet und plötzlich sollten wir wieder delphi und wenn man über 3 monate mit assembler programmiert gewöhnt man sich daran alles schritt für schritt zu machen, inc ist bei for-schleife logischer weise vorhanden, heißt ja for-to
leider ist der beitrag zu spät und ich habe meinen code schon eingereicht. ich habe den fast genau so abgegeben wie hier gepostet, nur dass ich meine idee für das beschränken des alphabets eingebracht habe. mein lehrer ist ein spaten, daher werde ich niemals eine verbesserung bekommen. immerhin habe ich in der letzten klausur (heute bekommen, was über assembler) 12 punkte bekommen |
|
Nach oben |
|
 |
|