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);
 

nrg

Top Contributor
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.
 

dehlen

Bekanntes Mitglied
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) ?
 

nrg

Top Contributor
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:

dehlen

Bekanntes Mitglied
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;
}
 

nrg

Top Contributor
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:

dehlen

Bekanntes Mitglied
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
 

nrg

Top Contributor
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)
 

dehlen

Bekanntes Mitglied
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
 

nrg

Top Contributor
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:

dehlen

Bekanntes Mitglied
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 ?!
 

Haave

Top Contributor
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) {}
 

dehlen

Bekanntes Mitglied
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:

nrg

Top Contributor
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(); 
    }
 

dehlen

Bekanntes Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Vigenere Verschlüsselung Java Basics - Anfänger-Themen 2
A Vigenere Veschlüsselung Java Basics - Anfänger-Themen 4
T Verständnisproblem beim Vigenere-Verfahren Java Basics - Anfänger-Themen 2
A Vigenere Verschlüsselung Java Basics - Anfänger-Themen 2
Lazybone Vigenere Verschlüsselung funktioniert nicht richtig Java Basics - Anfänger-Themen 8
MiMa String in Gross und Kleinbuchstaben umwandeln Java Basics - Anfänger-Themen 10
S Groß- und Kleinbuchstaben gleich behandeln Java Basics - Anfänger-Themen 3
D Groß/KleinBuchstaben zählen Java Basics - Anfänger-Themen 21
R Kleinbuchstaben in Großbuchstaben Java Basics - Anfänger-Themen 6
L Großbuchstaben in kleinbuchstaben wandeln Java Basics - Anfänger-Themen 5
J Bestimmen ob String aus Kleinbuchstaben besteht Java Basics - Anfänger-Themen 16
J Java-Array abwechselnd Gross- und Kleinbuchstaben Java Basics - Anfänger-Themen 5
D KeyListener, Unterscheidung Groß/Kleinbuchstaben Java Basics - Anfänger-Themen 3
U Kleinbuchstaben in Großbuchstaben umwandeln Java Basics - Anfänger-Themen 5
F Groß- und Kleinbuchstaben in String Java Basics - Anfänger-Themen 11
M Palindrom mit Groß & kleinbuchstaben Java Basics - Anfänger-Themen 19
H Großbuchstaben in Kleinbuchstaben Java Basics - Anfänger-Themen 18
T Vererbung eines Konstruktors - Special Edition Java Basics - Anfänger-Themen 6
T Special Character darstellung Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben