Verschlüsseln

Tamara.16

Mitglied
Hallo ich habe eine Aufgabe die ich zum Thema verschlüsseln nicht lösen kann: (aufgabe b):

In einer Schlange sind 100 zufällig generierte Zahlen gespeichert.
− Verschlüssele den nächsten Buchstaben des Wortes mit der ersten Zahl in der
Schlange analog zur Caesarverschlüsselung.
− Ist die Zahl eine gerade Zahl (x mod 2=0), so hänge die nachfolgende Zahl direkt
ans Ende der Schlange an und hänge anschließend die Zahl selbst an die Schlange
an.
− Ist die Zahl eine ungerade Zahl(x mod 2=1), so hänge das doppelte der Zahl an
das Ende der Schlange und hänge anschließend die Zahl selbst an die Schlange an.
− Wiederhole das Verfahren, bis der gesamte Text verschlüsselt ist.

Augabe a (hab ich geschafft):
Führe den beschriebenen Algorithmus an folgendem Beispiel aus: Klartext: „Hallo“
Queue: 3-4-9
Notiere nach jedem Verschlüsselungsdurchlauf die aktuelle Schlange.

Lösung:
H:3-4-9-6-3
a: 4-9-6-3-9-4
I: 9-6 -3 - 9-4-18-9
I: 6- 3- 9-4-18-9 - 3- 6
0:3-9-4-18-9 -3-6- 6-3

augabe b (wobei ich Hilfe brauche):
Schreibe die Methode „public String verschluesseln()“, die den
beschriebenen Algorithmus durchführt und den Chiffretext zurück gibt. Eine Implementierung der Klasse findest du im Anhang. Du darfst die Klasse Zahl wie die Klasse Integer betrachten.

anhang:
Java:
import java.util.Random;

public class Verschluesselung{ 
private Queue<Zahl> key;
Random zufallsZahl;
String klartext;

public Verschluesselung(){
key = new Queue<Zahl>();
zufallsZahl = new Random();
klartext="Hallo";
for(int i=0;i<100;i++){
key.enqueue(new Zahl(zufallsZahl.nextInt(100)));
 }
}

public String verschluesseln(){
 //implementiere dein Verschlüsselungsverfahren
return null; //Bitte ändern!
 }
Java:
public class Zahl {
}
private int x;
public Zahl(int pX){ x = pX;
public int getZahl(){ return x;
}
public void setZahl(int pX){ x=pX;
} }
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Lösung:
H:3-4-9-6-3
a: 4-9-6-3-9-4
I: 9-6 -3 - 9-4-18-9
I: 6- 3- 9-4-18-9 - 3- 6
0:3-9-4-18-9 -3-6- 6-3

Da der erste Wert doch entnommen wurde, ist der nach dem verschlüsseln des Buchstabens natürlich nicht mehr da. Also nach dem H ist die 3 entnommen und die 6 und 3 hinzu gefügt worden. Also nach dem H wäre es ein 4, 9, 6, 3

Der Fehler zieht sich komplett durch würde ich sagen.

Ansonsten gehe ich davon aus, dass ihr eine caesar Verschlüsselung schon implementiert habt. Du wirst also Code vorliegen haben, den du anpassen / nutzen kannst.
 

Tamara.16

Mitglied
Da der erste Wert doch entnommen wurde, ist der nach dem verschlüsseln des Buchstabens natürlich nicht mehr da. Also nach dem H ist die 3 entnommen und die 6 und 3 hinzu gefügt worden. Also nach dem H wäre es ein 4, 9, 6, 3

Der Fehler zieht sich komplett durch würde ich sagen.

Ansonsten gehe ich davon aus, dass ihr eine caesar Verschlüsselung schon implementiert habt. Du wirst also Code vorliegen haben, den du anpassen / nutzen kannst.
Nein, laut meinem Lehrer ist meine Lösung richtig.
 

temi

Top Contributor
Hast du denn schon Überlegungen angestellt, wie du vorgehen kannst?

Immer Schritt für Schritt. Du hast einen String klartext mit dem du etwas anstellen sollst. Was ist der erste Schritt?
 

KonradN

Super-Moderator
Mitarbeiter
Nein, laut meinem Lehrer ist meine Lösung richtig.
Wenn das Dein Lehrer sagt ...

Erst muss ich das Verschlüsselungsverafehren also den Code da einfügen.
Nein!

Der erste Schritt vor jeder Implementation ist und bleibt das Verständnis des Algorithmus.
==> Beschreibe den Algorithmus in Worten und dann spiele diesen Schritt für Schritt durch.

Ohne ein Verständnis des Algorithmus ist eine Implementierung schlicht unmöglich. Und wenn man den Algorithmus durchspielt, dann würde man:
a) verifizieren, ob die Ausgabe wirklich so ist, wie Du diese angegeben hast (Das ist mir eigentlich egal - das wäre nur ein kleiner "Beifang")
b) die Grundlagen schaffen, den Code zu schreiben.
 

KonradN

Super-Moderator
Mitarbeiter
Also nur um es einmal etwas vorran zu bringen. Den Algorithmus kann man einfach einmal ganz grob beschreiben:

Für jedes zu verschlüsselnde Zeichen z:
  • Versatz := Nächster Wert aus Schlange (mit Umsetzung der genannten Regeln!)
  • verschlüsseltesZeichen := Caesar Verschlüsselung von z mit Versatz.
  • Hinzufügen von verschlüsseltesZeichen zu Lösung.

Zu jedem einzelnen Punkt kannst Du das ähnlich aufschlüsseln. Und Du kannst alles schön in eine eigene Methode schreiben, so dass es übersichtlich und verständlich bleibt.

Und Du kannst gerne an das Ende der Schleife (Das wäre der Zeitpunkt "nach jedem Verschlüsselungsdurchlauf") die Queue ausgeben. Nur um zu sehen, was da drin steht (und um mir zu zeigen, dass ich Unrecht hatte!)
 

temi

Top Contributor
Erst muss ich das Verschlüsselungsverafehren also den Code da einfügen.
Das wäre ja "alles auf einmal" und damit das Gegenteil von "Schritt für Schritt".

Am Anfang lässt man sich gerne von der schieren Komplexität der gesamten Aufgabe verunsichern. Darum ist es eine gute Idee, die Gesamtaufgabe in ganz kleine Abschnitte zu zerlegen, die sich einfach(er) lösen lassen. Erst zusammen ergeben diese den gesamten Algorithmus.

Du möchtest den in klartext gespeicherten String (das Wort "Hallo") verschlüsseln also ist der erste Schritt an die einzelnen Zeichen dieses Strings zu kommen, also erstes Zeichen, zweites Zeichen, usw. bis zu Schluss. Falls es dir hilft, schreibe den Code und lass dir jedes Zeichen einzeln auf der Konsole ausgeben, dann weißt du schon mal, dass dieser Schritt funktioniert. Diese "Hilfsausgaben" kannst du am Ende wieder entfernen, sie dienen nur zu Debugzwecken.

Im nächsten Schritt möchtest du mit jedem dieser Zeichen etwas tun.
 
Zuletzt bearbeitet:

Tamara.16

Mitglied
Das wäre ja "alles auf einmal" und damit das Gegenteil von "Schritt für Schritt".

Am Anfang lässt man sich gerne von der schieren Komplexität der gesamten Aufgabe verunsichern. Darum ist es eine gute Idee, die Gesamtaufgabe in ganz kleine Abschnitte zu zerlegen, die sich einfach(er) lösen lassen. Erst zusammen ergeben diese den gesamten Algorithmus.

Du möchtest den in klartext gespeicherten String (das Wort "Hallo") verschlüsseln also ist der erste Schritt an die einzelnen Zeichen dieses Strings zu kommen, also erstes Zeichen, zweites Zeichen, usw. bis zu Schluss. Falls es dir hilft, schreibe den Code und lass dir jedes Zeichen einzeln auf der Konsole ausgeben, dann weißt du schon mal, dass dieser Schritt funktioniert. Diese "Hilfsausgaben" kannst du am Ende wieder entfernen, sie dienen nur zu Debugzwecken.

Im nächsten Schritt möchtest du mit jedem dieser Zeichen etwas tun.
Und wie zerlege ich das Wort in einzelne Zeichen?
 

KonradN

Super-Moderator
Mitarbeiter
Also ein Ansatz, wie es gehen könnte, wurde gezeigt, aber das Ansatz wird ja nicht gewünscht. Zumal dieser ja auch zu einem falschen Ergebnis führt (hat Ihr Lehrer gesagt!).

Erst einmal die Klasse Zahl um eine toString erweitert .. (Das der Lehrer so eine Klasse einführt, ist schon weit über meinem Niveau - daher nicht wundern, wenn da gleich falsche Dinge raus kommen!)

Java:
public class Zahl {
    private int x;

    public Zahl(int pX) {
        x = pX;
    }
    public int getZahl () {
        return x;
    }
    public void setZahl ( int pX){
        x = pX;
    }

    @Override
    public String toString() {
        return String.valueOf(x);
    }
}

Dann die Klasse Verschluesselung mal etwas erweitert. Kurzer Hinweis: Es wird wohl eine eigene Klasse Queue verwendet. Da diese nicht vorliegt, habe ich Queue / ArrayDequeue des Java Frameworks verwendet.

Ich habe die Zufalls-Initialisierung des key ersetzt durch die 3, 4, 9 der Aufgabe - damit man anhand der Ausgabe der Queue eine Überprüfung hat. Da die Queue anders aussieht als beschrieben, muss mein Code falsch sein ... Das einfach nur als Hinweis - nicht dass sowas als Lösung angesehen wird. Und dann natürlich eine main Methode, damit man das mal aufrufen kann.
Und die Methode für die caesar Verschlüsselung macht noch eine Ausgabe - das hilft dann beim prüfen, ob das Ergebnis richtig ist. Also H um 3 Zeichen verschoben ... I (1 Zeichen), J (2 Zeichen) , K (3 Zeichen) ...

Java:
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Random;

public class Verschluesselung {
    private Queue<Zahl> key;

    Random zufallsZahl;

    String klartext;

    public Verschluesselung() {
        key = new ArrayDeque<>();
        zufallsZahl = new Random();
        klartext = "Hallo";
        /*
        for (int i = 0; i < 100; i++) {
            key.add(new de.kneitzel.Zahl(zufallsZahl.nextInt(100)));
        }
         */
        key.add(new Zahl(3));
        key.add(new Zahl(4));
        key.add(new Zahl(9));
    }

    public String verschluesseln() {
        String result = "";
        for (char zeichen : klartext.toCharArray()) {
            int versatz = holeNaechstenVersatz();
            char verschluesseltesZeichen = codiereZaesar(zeichen, versatz);
            result = result + verschluesseltesZeichen;
            System.out.println("Key nach " + zeichen + " := " + key);
        }
        return result;
    }

    private char codiereZaesar(char zeichen, int versatz) {
        char firstChar = 'a';
        if (Character.isUpperCase(zeichen)) firstChar = 'A';

        char result =  (char) ((zeichen - firstChar + versatz) % 26 + firstChar);
        System.out.println("Caesar Verschluesslung von " + zeichen + " bei " + versatz + " := " + result);
        return result;
    }

    private int holeNaechstenVersatz() {
        Zahl versatz = key.remove();
        if (versatz.getZahl() % 2 == 0) {
            key.add(key.element());
        } else {
            key.add(new Zahl(versatz.getZahl() * 2));
        }
        key.add(versatz);
        return versatz.getZahl();
    }

    public static void main(String[] args) {
        Verschluesselung verschluesselung = new Verschluesselung();
        System.out.println(verschluesselung.verschluesseln());
    }
}

Und das bringt dann die Ausgabe:
Code:
Caesar Verschluesslung von H bei 3 := K
Key nach H := [4, 9, 6, 3]
Caesar Verschluesslung von a bei 4 := e
Key nach a := [9, 6, 3, 9, 4]
Caesar Verschluesslung von l bei 9 := u
Key nach l := [6, 3, 9, 4, 18, 9]
Caesar Verschluesslung von l bei 6 := r
Key nach l := [3, 9, 4, 18, 9, 3, 6]
Caesar Verschluesslung von o bei 3 := r
Key nach o := [9, 4, 18, 9, 3, 6, 6, 3]
Keurr
 

Jw456

Top Contributor
Caesar Verschluesslung von H bei 3 := K Key nach H := [4, 9, 6, 3]
3 ist ungerade also das doppelte 6 hinzufügen.

Da du ja die 3 aus der Schlange gelesen hast sollten jetzt nur noch zwei in der Schlange sein.
Jetzt die 6 hinzufügen, und es sind wieder drei in der Schlange.
Für mich wird die Schlange nicht grösser bleibt immer bei drei Elemente.

Bei einer geraden Zahl liest du zweimal aus der Schlange und fügst auch wieder zwei hinzu.

So lese ich die Aufgabe.
 

KonradN

Super-Moderator
Mitarbeiter
Wie die Werte in der Schlage auszusehen haben erkennt man ja auch prinzipiell bei der gegebenen Lösung. Nur eben wurde da vergessen, den ersten Wert auch zu entfernen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Email mit public-key verschlüsseln Allgemeine Java-Themen 0
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
D Passwort verschlüsseln - Wo Allgemeine Java-Themen 2
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
Bluedaishi Jar Datei Sichern bzw Verschlüsseln !!!!!! Allgemeine Java-Themen 47
C Dateien komprimieren und verschlüsseln Allgemeine Java-Themen 3
R Java Dateien "verschlüsseln" Allgemeine Java-Themen 2
T In Java String sicher verschlüsseln Allgemeine Java-Themen 6
A Texte mit .pem datei Verschlüsseln Allgemeine Java-Themen 6
D Nur Teile einer Datei symetrisch Verschlüsseln Allgemeine Java-Themen 4
F Verschlüsseln, aber welcher Algo Allgemeine Java-Themen 29
K ByteBuffer verschlüsseln Allgemeine Java-Themen 14
F Internet Verbindung verschlüsseln Allgemeine Java-Themen 17
I Passwort verschlüsseln Allgemeine Java-Themen 22
L Logindaten verschlüsseln Allgemeine Java-Themen 3
calzone Passwortabfrage, Verschlüsseln wie realisieren ? Allgemeine Java-Themen 3
T Datei beim schreiben verschlüsseln beim lesen entschlüsseln Allgemeine Java-Themen 11
G XML- Datei verschlüsseln Allgemeine Java-Themen 13
G Arbeitsspeicher verschlüsseln Allgemeine Java-Themen 25
R Verschlüsseln Allgemeine Java-Themen 3
J Java - ent/verschlüsseln Allgemeine Java-Themen 20
zilti Code verschlüsseln Allgemeine Java-Themen 17
H strings in datei verschlüsseln , auslesen mit klartext aber! Allgemeine Java-Themen 2
B In Java verschlüsseln - mit C# entschlüsseln Allgemeine Java-Themen 7
P JavaCode verschlüsseln / verschlüsselte Werte Allgemeine Java-Themen 3
sparrow Datenbestand verschlüsseln Allgemeine Java-Themen 3
S Datei Verschlüsseln Allgemeine Java-Themen 6
G Properties Datei verschlüsseln. WIE? Allgemeine Java-Themen 6
G class datein verschlüsseln Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben