Zaiendo Wir sind die Community


Neueste Ankündigungen:
Zaiendo.de ist auf FaceBook und Youtube.

Witz des Tages:
"Würden Sie meine Tochter auch heiraten, wenn sie kein Geld hätte?" "Natürlich!" "Dann wird nichts draus. Dummköpfe kann ich in meiner Familie nicht gebrauchen."

Teilen auf:
Twitter Facebook Stumble Upon Delicious Google

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Java: Caesar Chiffrierung
» Benötige dringend eure Hilfe
#1
Moin alle zusammen,

wir haben im Datenverarbeitungsunterricht in der Schule (12. Klasse) bis zum 22. Januar folgende Aufgabe bekommen.
Wir sollen mit NetBeans, also mit Java, ein Programm entwickeln, das eingegebene Texte im Caesar-Verfahren verschlüsselt, d.h. jeden Buchstaben im Alphabet, inkl. die Umlaute und ß, um sieben Stellen erhöht.
Ich und mein Teampartner haben jetzt seit drei Wochen im Internet nach Erklärungen gesucht und heute mal den Rest der Klasse befragt - bisher hat Niemand auch nur einen Ansatz, wie man an das Problem herangehen könnte. Deshalb habe ich mir gedacht, ich frage mal im Forum meines Vertrauens Smile
Es wäre echt spitze, wenn mir jemand erklären könnte, wie ich das Programm mit Java code, die Lösung reicht mir (oder besser gesagt meinem Lehrer) nicht, ich muss den Quellcode später erklären können und würde ihn deshalb auch gerne selbst verstehen.
Ich hoffe ihr könnt mir helfen. Ich zähle auf euch Wink

Gruß, Steffen

€: Das Programm muss auch den Text wieder dechiffrieren können, aber ich hoffe den Teil des Codes selbst hinzubekommen, wenn ich das Chiffrieren erstmal verstanden habe.
Antworten
#2
An welcher Stelle kommen denn die Umlaute und das ß? am Ende, also so "ABCDE[...]XYZÄÖÜß" ?
Caesarverfahren, bedeutet doch eigentlich nicht nur 7 Stellen weitterücken, sondern beliebig. Es wird der Schlüssel mit angegeben. Wenn dieser z.B. C ist, werden alle Buchstaben um 3 verschoben bedeutet A=D.
Ich kann kein Java, aber in Delphi hätte ich das so gemacht, dass ich mit einer For-Schleife Buchstabe für Buchstabe auslese, in seinen Entsprechenden Bytecode umwandele, den Schlüssel dazurechne/abziehe (Ver- und Entschlüsseln) und den Spaß wieder zurückwandele in einen Buchstaben.
Warum das ganze funktionieren würde: http://www.torsten-horn.de/techdocs/ascii.htm
Dritte Spalte, siehst du die Buchstaben und ihre ASCII-Werte. Logischerweise müsste man beachten, dass ab 90 wieder bei 65 angefangen wird.

Das Problem ist jetzt, dass dein Lehrer auch Umlaute haben will. (Garantiert, damit das ganze nicht so leicht wird Wink )

Das könntest du entweder mit ein paar If-Abfragen lösen, was aber definitiv unübersichtlich werden würde.

Nächste Idee: Array machen und von 65 - 94 nummerieren und mit deinem Alphabet füllen, auch mit Umlauten und ß, dazu ne kleine Funktion basteln die Zeichen in Zahlen umwandeln kann und ÄÖÜß die Zahlen von 91-94 zuweist. Dann könnte man das ganze rotieren lassen. Ich habs grad, probiert, aber weil ich grad nur Lazarus zur Hand habe ist es mir unmöglich, weil Lazarus in Hinsicht auf Umlaute ein Krampf ist, weil die mit ihrer Zeichenkodierung auf UTF8 umgestiegen sind und jetzt keiner richtig weiß wie man mit Umlauten umzugehen hat. Theoretisch funktioniert das ganze aber, ich hab die Umlaute durch normale Buchstaben ersetzt und es hat geklappt.

Wobei es sehr wahrscheinlich auch eine elegantere Lösung gibt, aber Arrays sind da glaube ich recht praktisch. Smile
I'm sorry, Dave. I'm afraid I can't do that.
Antworten
#3
Hmm, auch als PHPler würde ich das ganze mit einer Foreach-Schleife lösen, gamer94's Ansatz erscheint mir soweit gut durchdacht. Ob aber die Byte-Angabe nötig ist - man könnte doch vermutlich auch einfach ein Register anlegen in dem alle Buchstaben der Reihenfolge nach gespeichert sind und dann das Register durchzählen je nach Codierung oder? Dann müsste man auch auf ASCII gar nicht eingehen.
Registerbeispiel mit PHP:
PHP-Code:
$buchstaben[a] = 1;
$buchstaben[b] = 2;
$buchstaben[c] = 3;
$buchstaben[d] = 4;
//...

foreach($buchstaben AS $buchstabe)
   {
   
$neuer_wert $codierung $buchstabe;
   }



echo 
$buchstabe[$neuer_wert];

//Beispiel:
//Codierung 2 -> Alle Buchstaben um 2 verschoben
// 4 = 2+2  -> Aus b wird d 
Nachteil ist natürlich eine Festlegung auf eine Ansammlung von Buchstaben und ein langes Register.
[Bild: zaiendosig.php]
Antworten
#4
$buchstaben[a] = 1;
$buchstaben[b] = 2;
$buchstaben[c] = 3;
$buchstaben[d] = 4;
...

Genau sowas wollte ich vermeiden, weils einfach umständlich und, versteh mich jetzt nicht falsch, unprofessionell ist. Meist lässt sich sowas vermeiden und eleganter lösen.

Allgemein problematisch ist, dass ich keinen Plan von Java habe Big Grin
I'm sorry, Dave. I'm afraid I can't do that.
Antworten
#5
Danke erstmal für eure Antworten.
Eure Ansätze gefallen mir schon richtig gut, ganz verstehe ich es aber noch nicht. Die Umlaute und das ß sollen ans Ende des Texts und ihr braucht euch gar nicht zu viel Mühe geben, es soll ja so aussehen, als ob ich es programmiert hätte Big Grin
Ich hätte es bisher am ehesten so gemacht wie Lennart, dass ich jedem Buchstaben eine Zahl zugeordnet hätte. Ich weiß nur halt leider nicht wie...
Ich habe auch noch mal mit nem Freund gesprochen, der mir gesagt hat, dass es noch wichtig wäre zu erwähnen, dass wir mit objektorientierter Programmierung arbeiten.
Antworten
Werbeagentur gesucht? PRinguin, die Digitalagentur. Für Web Entwicklung und Online Marketing.
Registriere dich (kostenlos) um diese Werbung zu verbergen.
#6
Du brauchst nicht jedem Buchstaben eine Zahl zuordnen, die haben alle schon eine. Wink

Also ich hab jetzt mal Delphi benutzt, damit ich mich nicht mit UTF8 rumschlagen muss.
Download (Virengeprüft)
Das Programm erklärt sich eigentlich von selber soweit. Oben was eingeben und unten den verschlüsselten Text anschauen. Außerdem kann der Schlüssel geändert werden. Laut Wikipedia ist das Wort "CAESAR" mit dem C-Schlüssel "FDHVDU", wenn das bei euch auch so ist, dann stimmt wohl alles. Smile
Wie ich's gemacht habe:
So wie ichs oben beschrieben habe. Nur halt in Delphi, jetzt weiß aber zumindest wie es zu machen ist. Array von 65-94, mit for befüllen und die Umlaute nachträglich die Nummern 91-94 zuweisen. Kleine Funktion die die Buchstaben in ihre Nummern umwandelt (Bei Delphi heißt die "ord()") mit der Erweiterung, dass Umlaute 91-94 bekommen, damit wird nicht mit If und case rumhantieren müssen.

Dann wird jeder Buchstabe einzeln abgefragt in seine Nummer umgewandelt, der Schlüssel dazuaddiert und zum entsprechenden Zeichen zurückgewandelt. Vorher prüfen ob die Nummer größer als 94 ist (ab ß muss man ja von vorne anfangen) und ggf. 30 abziehen (zum neuanfangen).
Die Buchstaben ausgeben und fertig. Smile
I'm sorry, Dave. I'm afraid I can't do that.
Antworten
#7
(02.12.2010, 21:13)gamer94 schrieb: Genau sowas wollte ich vermeiden, weils einfach umständlich und, versteh mich jetzt nicht falsch, unprofessionell ist. Meist lässt sich sowas vermeiden und eleganter lösen.

Allgemein problematisch ist, dass ich keinen Plan von Java habe Big Grin

Stimme dir generell zu allerdings kannst du nicht in allen Programmiersprachen einfach auf ASCII zugreifen und dann wärst du mit einem Array besser bedient. Nebenbei kannst du so natürlich nicht nur mit Buchstaben arbeiten sondern es wäre eine generelle Lösung.
Wie aber schon gesagt - ein Register ist zeitaufwändig und eingeschränkt, mir gefällt in diesem Falle auch deine ASCII-Lösung besser.
[Bild: zaiendosig.php]
Antworten
#8
Jo, auf ASCII kann man nicht immer zugreifen, aber meistens. Wink Außerdem sind die Standartbuchstaben in den meisten Zeichentabellen an der selben Stelle, nur Sonderzeichen nicht. Da wäre auch schon das Problem: Umlaute sind immer sehr gewagtes Gebiet in der Programmierung, vorallem in Java, dass ja auf vielen Systemen laufen soll, die sich mit Umlauten in den Haaren haben könnten.
I'm sorry, Dave. I'm afraid I can't do that.
Antworten


Verlinke dieses Thema:

Teile es auf:
Twitter Facebook Stumble Upon Delicious Google GMail LinkedIn



Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste