Vigenere KleinBuchstaben/Special Characters

dehlen

Bekanntes Mitglied
Hallo ich schreibe zurZeit der Schule wegen an einer Vigenere Verschlüsselung alles klappt wunderbar habe auch schon eine GUI drum gebastelt etc allerdings klappt meine Verschlüsselung nur für GroßBuchstaben

ich würde gerne noch die Möglichkeit hinzufügen das der Benutzer wählen kann ob er Kleinbuchstaben und Special Characters noch hinzufügen will

wie stell ich das an ?!
hier mal mein Code den ich habe für die GroßBuchstaben:

Java:
public class Vigenere {

private final String code; 
private int count = 0; 
public Vigenere(String code) {
this.code = code; 
}


//Verschlüsseln
public char encode(char chr) { 
int c = chr; 

if (c > 64 && c < 91) { 
int code = this.code.charAt(count) - 65; 
c += code;

if (c > 90) {
c-=26;
}

count = (count < this.code.length() -1) ? ++count : 0;
}
return (char) c; 
}
//Entschlüsseln

public char decode(char chr) {  
int c = chr;

if (c > 64 && c < 91) {
int code = this.code.charAt(count) - 65;
c -= code;

if (c < 65) { 
c+=26;
}
count = (count < this.code.length() -1) ? ++count : 0; 
}
return (char) c;
}


}


und dann hier was ich in der GUI Aufrufe um mit den Werten der Textfelder zu encode/decoden:
Java:
input = eingabe.getText(); 
input = input.toUpperCase();
schluessel = schluesselfeld.getText();
schluessel = schluessel.toUpperCase();
Vigenere Buchstabe = new Vigenere(schluessel);
StringBuilder output = new StringBuilder();

for (char i : input.toCharArray())

output.append(Buchstabe.decode(i)); //bzw encode
ausgabe.setText("" + output);
 
das imho keine Vigenere Verschlüsselung. Wenn ich das richtig verstanden habe, addiert diese keine ASCII zeichen sondern funktioniert ähnlich der Cäsar-Verschlüsselung mit alphabetischer Verschiebung.
 
hm aber wenn ich die Beispiel z.B von Wikipedia bei mir durchführe dann klappt das wunderbar
naja wie müsste ich es sonst machen und hast du auch eine Lösung für mein anderes Problem (lowerCase und Special Characters) ?
 
naja ok. hatte mich nur auf eine andere lösung festgefahren 🙂. ascii verschiebung ist ja im Grunde alphabetische verschiebung 😉. war weng quatsch. du müsstest halt auch die Bereiche der Kleinbuchstaben erlauben
 
Zuletzt bearbeitet:
ja ich hatte es so versucht aber das klappt gar nicht :
Java:
public char encode(char chr) { 
int c = chr; 
 
if (c > 64 && c < 91 ||*c >96 && c<123)) {  // so decke ich doch die Kleinbuchstaben ab oder ?
int code = this.code.charAt(count) - 65; 
c += code;
 
if (c > 90) { // Hier weiß ich nicht weiter
c-=26;
}
 
count = (count < this.code.length() -1) ? ++count : 0;
}
return (char) c; 
}
//Entschlüsseln
 
public char decode(char chr) {  
int c = chr;
 
if (c > 64 && c < 91 ||*c >96 && c<123) { // Kleinbuchstane abgedeckt
int code = this.code.charAt(count) - 65;
c -= code;
 
if (c < 65) {  // Hier ist der Fehler
c+=26;
}
count = (count < this.code.length() -1) ? ++count : 0; 
}
return (char) c;
}
 
ungetestet aber könnte so ungefähr funktionieren:
Java:
		boolean lowerCase = false;
		if ((c > 64 && c < 91) || (lowerCase = (c > 96 && c < 123))) {
			int code = lowerCase ? this.code.charAt(count) - 97 : this.code.charAt(count) - 65; 
			c += code;
			if ((!lowerCase && c > 90) || (lowerCase && c > 122)) {
				c-=26;
			}
		}

edit: specialchars könnte man unverändert zurückgeben. man könnte sie auch verschieben sollte aber aufpassen, dass kein A-Za-z dabei herauskommt, sonst gibt es vermutlich probleme beim decodieren.
 
Zuletzt bearbeitet:
hm klappt leider nicht -.-
wenn ich das beispiel aus wikipedia also geheimnis mit dem schlüssel: akeyakeya
verschlüssel dann bekomme ich das:murƒo}x‡y anstatt das:GOLCIWRGS
 
ich habs wie gesagt überhaupt nicht getestet. eher so in den browser getippt. das ist nichtmal eine garantie, dass es kompiliert. ich kucks mir kurz mal an... (edit: wobei etwas mehr als "klappt nicht..." sollte von dir auch kommen - das war eher als Anregung gedacht)
 
ich schätze es klappt nicht weil du mit dieser Zeile:
Java:
if ((!lowerCase && c > 90) || (lowerCase && c > 122)) {
nicht den Fall abdeckst das es zwischen 91 und 96 liegt oder ? ich werde es mal einbauen und schauen obs klappt
 
ein fehler ist zumindest mal, dass ich immer 65 subrahiere. für kleinbuchstaben müsste man 97 abziehen. gibt gleich edit. diesmal teste ich es 🙂

Java:
public class VigenereCoder {

	private final String code;
	
	public VigenereCoder(String code) {
		this.code = code; 
	}

	//Verschlüsseln
	public String encode(String s) {
		StringBuilder sb = new StringBuilder();
		boolean lowerCase = false;
		int i = 0;
		for (char c : s.toCharArray()) {
			if ((c > 64 && c < 91) || (lowerCase = (c > 96 && c < 123))) { 
				c += lowerCase ? code.charAt(i) - 97 : code.charAt(i) - 65;
				i = i < code.length()-1 ? i + 1 : 0;
				if ((!lowerCase && c > 90) || (lowerCase && c > 122)) c -= 26;
			}
			sb.append(c);
		}
		return sb.toString(); 
	}
	
	//Entschlüsseln kannste selber machen

	public static void main(String[] args) {
		VigenereCoder vc = new VigenereCoder("akey");
		System.out.println(vc.encode("geheimnis"));
	}
}

zum runtertippen fand ich das jetzt einfacher, den encode gleich komplett zu machen. kannst du ja umschreiben. du musst im Grunde nur, wie schon gesagt, die eine Zeile beachten:
Java:
c += lowerCase ? code.charAt(i) - 97 : code.charAt(i) - 65;

edit: an dein Code angelegt siehe edit oben.

und ich mach jetzt Feierabend 🙂
 
Zuletzt bearbeitet:
klappt aber noch nicht ganz =) wenn ich geheimnis und akeyakeya ausprobiere funktionierts aber wenn ich das G von geheimnis groß mache dann bekomme ich Molciwrgs ansttat Golciwrgs woran kann das liegen ?!
 
Kleiner Tipp am Rande:
Man kann bei chars die Vergleiche und Berechnungen auch mit den Einzelzeichen anstellen und braucht nicht über die Zahlenwerte gehen. Erhöht meiner Meinung die Lesbarkeit ungemein.

Also
Java:
if(c >= 'A' && c <= 'Z') {}
statt
Java:
if(c >= 65 && c <= 90) {}
 
also habe nun versucht die entschlüsseln methode selber zu schreiben doch irgendwie hakt es obwohl ich denke das es richtig ist:
Java:
public String decode(String s) {
    StringBuilder sb = new StringBuilder();
    boolean lowerCase = false;
    int i = 0;
    for (char c : s.toCharArray()) { //für jeden Buchstaben aus s
        if ((c > 64 && c < 91) || (lowerCase = (c > 96 && c < 123))) {  //prüfe ob er ein GroßBuchstabe oder ein Kleinbuchstabe ist
            c += lowerCase ? code.charAt(i) - 97 : code.charAt(i) - 65; //falls Kleinbuchstabe subtrahiere -97 falls GroßBuchstabe subtrahiere 65
            i = i < code.length()-1 ? i + 1 : 0; 
            if ((!lowerCase && c < 65) || (lowerCase && c < 97)) c += 26; // das müsste doch richtig sein oder ?! 
        }
        sb.append(c);
    }
    return sb.toString(); 
}

EDIT:
Achja und das Problem ist auch noch das Problem das wenn es ein MischMasch ist also ein paar Groß und paar klein klappt die verschlüsselung auch nicht mehr klappt nur bei nur klein oder nur Groß
 
Zuletzt bearbeitet:
so sollte es jetzt aber passen. man muss natürlich das Codeword auch dementsprechend anpassen. Ausserdem sollte der boolean lowerCase als erste stehen. sonst wird er teilweiße nicht zugewießen.
(ich habe mal Haave's Rat angenommen - zur besseren Lesbarkeit):
Java:
    public String encode(String s) {
        StringBuilder sb = new StringBuilder();
        boolean lowerCase = false;
        int i = 0;
        for (char c : s.toCharArray()) {
            if ((lowerCase = (c >= 'a' && c <= 'z')) || (c >= 'A' && c <= 'Z')) {
                c += lowerCase ? Character.toLowerCase(code.charAt(i)) - 'a' : Character.toUpperCase(code.charAt(i)) - 'A';
                i = i < code.length()-1 ? i + 1 : 0;
                if ((!lowerCase && c > 'Z') || (lowerCase && c > 'z')) c -= 26;
            }
            sb.append(c);
        }
        return sb.toString(); 
    }
 
riesen Dank für deine Mühe mittlerweile hab ich auch noch Verstärkung bekommen und jetzt läufts danke für deine Mühen ;-) ich denke der Thread kann nun aber geschlossen werden
 

Neue Themen


Zurück
Oben