[Java]Verschlüsselung mit der monoalphabetischen Substitution

10/05/2011 20:05 XxharCs#1
Hallo,
da ich in der Schule Java lerne/mache bekamen wir eine Aufgabe:
Quote:
Die Klasse Verschluesselung soll ein allgemeines Substitutionsverfahren implementieren. Diese soll Verschlüsselungen nach dem Prinzip der einfachen monoalphabetischen Substitution realisieren. Dabei wird ein Geheimalphabet erstellt. Dieses muss alle erwünschten Zeichen abdecken, z.B.

Klaralphabet: a b c d e f g h i j k l m n o p q r s t u v w x y z
Geheimalphabet: U F L P W D R A S J M C O N Q Y B V T E X H Z K G I

Dieses Geheimalphabet soll als Attribut in der Klasse gespeichert werden. Die Verschlüsselung erfolgt nun so, dass der Text Buchstabe, für Buchstabe durchgegangen wird, und das aktuelle Zeichen durch den entsprechenden Buchstabe im Geheimalphabet ersetzt wird. So wird kann Hallo z.B. folgendermaßen verschlüsselt werden:

Klartext: hallo
Geheimtext: AUCCQ

Es ist üblich verschlüsselte Texte in Großbuchstaben und unverschlüsselte Texte in Kleinbuchstaben auszugeben. Es soll neben den Konstruktoren, sowie den setter- und getter-Methoden für das Attribut eine Methode verschluesseln und eine Methode entschluesseln, je mit einem Text als Parameter geben. Beide Methoden sollen den ver- bzw. entschluesselten Text zurück geben. Teste deine Klasse mit einer eigenen Testklasse.
Ich lerne zu Hause Java vor als in der Schule, das heißt arrays etc kann ich schon machen. Da wir aber in der Schule keine arrays bis jetzt gemacht haben, hat uns die lehrerin verboten, arrays zu benutzen, für die die es schon können.

Also habe ich das ohne arrays gemacht und sogar ohne Switch und tausende if´s !
Jedoch habe ich das Problem das ich den verschlüsselten Text iwie nicht entschlüsseln kann.

Hier der Code ohne Arrays:
Klasse Verschluesselung
Code:
/**
 * Eine Klasse die ein allgemeines Substitutionsverfahren implementiert.
 * Diese soll Verschlüsselungen nach dem Prinzip der einfachen monoalphabetischen Substitution realisieren. 
 * 
 * @author *****
 * @version 2011-10-05
 */
public class Verschluesselung
{
    //Attribut für das GeheimAlphabet
    private String geheimAlphabet;
    
    /**
     * Erstellt eine Verschluesselung mit dem geheimAlphabet
     */
    public Verschluesselung(String g){
        if(g.length() == 26){
            geheimAlphabet = g;
        }
        else{
            geheimAlphabet = "uflpwdrasjmconqybvtexhzkgi";
        }
    }
    /**
     * Das Wort wird mit dem geheim Alphabet verschlüsselt
     * @param ver der eingegebene Text
     * @return den verschlüsselten Text
     */
    public String verschluesseln(String ver){
        String verschluesselterText = "";
        for(int i = 0; i < ver.length(); i++){
            verschluesselterText = verschluesselterText + geheimAlphabet.charAt((int)ver.charAt(i)-97);
        }
        return verschluesselterText.toUpperCase();
    }
    /**
     * Das verschlüsselte Wort wird wieder entschlüsselt
     * @param ent das zu entschlüsselte Wort
     * @return den entschlüsselten Text
     */
    // Funktioniert nicht bzw. weiß nicht wie ich das anstellen soll
    public String entschlüsseln(String ent){
        String entschluesselterText = "";
        String x = this.verschluesseln(ent);
        for(int i = 0; i < ent.length(); i++){
            entschluesselterText = entschluesselterText + x.charAt((int)ent.charAt(i)-97);
        }
        return entschluesselterText.toLowerCase();
    }
}
Kann mir vill jemand da helfen bzw sagen wie ich den verschlüsselten Text wieder entschlüssele ? Komme da iwie nicht weiter bzw weiß ned wie ich das anstellen soll :S

Klasse VerschluesselungTest
Code:
import javax.swing.JOptionPane;
/**
 * TestKlasse zur Klasse Verschlüsselung. Eingabe wird eingelesen und diese wird verschlüsselt und
 * wieder entschlüsselt
 * 
 * @author ******
 * @version 2011-10-05
 */
public class VerschluesselungTest
{
    public static void main(String[] args){
        String wort = "hallo";
        Verschluesselung v = new Verschluesselung("uflpwdrasjmconqybvtexhzkgi");
        String x = v.verschluesseln(wort);
        String y = v.entschlüsseln(wort);
        System.out.println(wort);
        System.out.println(x);
        System.out.println(y);
    }
}

Und hier die Klasse Verschluesselung mit arrays(falls ihr mir ned glaubt das ichs nicht mit arrays kann^^):
Code:
/**
 * Das hier ist eine Klasse Verschlüsseln die die monoalphabetische Substitution anwendet
 * @author *****
 * @version 2011-10-5
 */

public class Verschluesselung { 
	private char[] geheim;

	public char[] getArray() { // getter-Methode
		return geheim;
	}
	public void setArray(char[] geheim) { // setter-Methode
		this.geheim = geheim;
	}
	/**
	 * Ein default Konstruktor der im falle das nix im Paramter steht,automatisch das Alphabet um 3 Stellen verschiebt
	 */
	public Verschluesselung () {
		int zahl = 0;
		geheim = new char [((int)'z')];	
		for(char i ='a';i<'z';i++) {
			geheim[i] = "DEFGHIJKLMNOPQRSTUVWXYZABC".charAt(zahl);
			zahl++;
		}
	}
	/**
	 * Ein Konstruktor der jeden Buchstaben des Geheimalphabets durchgecheckt und immer weiter checkt bis es zu Ende ist
	 * @param geheim das übergeben Geheimalphabet
	 */
	public Verschluesselung (String geheimniss) {
		int zahl = 0;
		geheim = new char [((int)'z')];	
		for(char i ='a';i<'z';i++) {
			geheim[i] = geheimniss.charAt(zahl);
			zahl++;
		}
	}
	/**
	 * Die Methode verschlüsseln die den Klartext in einen Geheimtext umwandelt
	 * @param eingabe der Klartext
	 * @return den verschlüsselten Text
	 */
	public String verschluesseln(String klartext) {
		klartext = klartext.toLowerCase();
		for(char i ='a';i<'z';i++) {
			klartext = klartext.replace(i,geheim[i]); // hier wird das "ursprüngliche" Alphabet durch Geheimalphabet das im [i] gespeichert ist ersetzt

		}
		return klartext;

	}
	/**
	 * Die Methode entschlüsseln die den Geheimtext in einen Klartext umwandelt
	 * @param eingabe der Geheimtext
	 * @return den Klartext
	 */
	public String entschluesseln(String geheimtext) {
		geheimtext = geheimtext.toUpperCase();
		for(char i ='a';i<'z';i++) {
			geheimtext = geheimtext.replace(geheim[i],i); // hier wird das Geheimalphabet  durch das "ursprüngliche" Aplhabet ersetzt

		}
		return geheimtext;

	}

}
Danke im vorraus das ihr euch die zeit genommen habt das durchzulesen und eventuell mir zu helfen =)
10/05/2011 20:35 SmackJew#2
Arrays sind verboten aber Strings sind erlaubt, schlaues Lehrerchen.
10/05/2011 20:51 XxharCs#3
Quote:
Originally Posted by SmackJew View Post
Arrays sind verboten aber Strings sind erlaubt, schlaues Lehrerchen.
Verboten/nicht erlaubt, da wirs nicht gemacht haben und es unfär gegenüber den anderen wäre~

Denkst du nach bevor du was postest ?
Entweder antworte was sinnvolles zum Thema, oder poste garnichts.
10/05/2011 21:04 SmackJew#4
Quote:
Originally Posted by XxharCs View Post
Verboten/nicht erlaubt, da wirs nicht gemacht haben und es unfär gegenüber den anderen wäre~

Denkst du nach bevor du was postest ?
Entweder antworte was sinnvolles zum Thema, oder poste garnichts.
Den Mund verbieten lasse ich mir nicht. Schon gar nicht von 'nem 14 jährigen der nicht "fair" buchstabieren kann und seine Sätze mit 'nem Tilde beendet. Du willst hier deine Hausaufgaben gelöst haben, und dazu dann noch sowas lächerliches wie 'nen Cäsar Chiffre. Versuch's mal mit Nachdenken, oder noch besser, (da beim Nachdenken wahrscheinlich ohnehin nichts 'rauskommt), Google oder einen der vielen Hausaufgaben Dienstleister.
10/05/2011 22:04 link#5
Du solltest evtl. den Index, den du durch das Subtrahieren von 'a' berechnest, prüfen, ob er auch innerhalb der Grenzen des Strings liegst, oder halt den zu verschlüsselnden Text komplett zu LowerCase konvertieren. Mit Großbuchstaben oder Sonderzeichen würde es nämlich nicht funktionieren, einfach nur 'a' abzuziehen.
Darin liegt nämlich auch der Fehler im Entschlüsseln:
Es handelt sich um Großbuchstaben und du ziehst 'a' ab, was einen Index von unter 0 ergibt.
10/06/2011 02:31 omer36#6
Code:
public String entschlüsseln(String ent){
  ent = ent.toLowerCase();
  String entschluesselterText = "";
  String x = "abcdefghijklmnopqrstuvwxyz";

  for(int i = 0; i < ent.length(); i++){
      entschluesselterText = entschluesselterText + x.charAt(geheimAlphabet.indexOf( ent.charAt(i)));
  }
  return entschluesselterText;
}
und im main:
Code:
String x = v.verschluesseln(wort);
String y = v.entschlüsseln(x);    // <--
denn du willst ja das verschlüsselte wieder entschlüsseln, sonnst könntest du das "wort" ja direkt ausgeben.
10/06/2011 09:22 XxharCs#7
Quote:
Originally Posted by omer36 View Post
Code:
public String entschlüsseln(String ent){
  ent = ent.toLowerCase();
  String entschluesselterText = "";
  String x = "abcdefghijklmnopqrstuvwxyz";

  for(int i = 0; i < ent.length(); i++){
      entschluesselterText = entschluesselterText + x.charAt(geheimAlphabet.indexOf( ent.charAt(i)));
  }
  return entschluesselterText;
}
und im main:
Code:
String x = v.verschluesseln(wort);
String y = v.entschlüsseln(x);    // <--
denn du willst ja das verschlüsselte wieder entschlüsseln, sonnst könntest du das "wort" ja direkt ausgeben.
Danke :D
Hab überhaupt ned gedacht das normale alphabet aufzulisten und es mit dem machen. Habe immer iwie versucht das verschlüsselte mit dem geheim alphabet zu entschlüsseln.

Für den main teil hast recht, hard failed da :o xD

Naja kann geclosed werden =)
10/06/2011 09:26 Obilee#8
#closed