Vigenere Verschlüsselung funktioniert nicht richtig

Status
Nicht offen für weitere Antworten.

Lazybone

Aktives Mitglied
Hallo

ich habe mich mal an eine Vigenere Verschlüsselung gemacht. Hier erstmal die beiden Methoden zum Ver bzw Entschlüsseln
Code:
    public static String code(String NText, String code) {
        
        StringBuilder ctext = new StringBuilder();
        for(int i = 0, a = 0; i < NText.length(); i++) {
            char key = code.toUpperCase().charAt(a%code.length());
            char aCh = NText.toUpperCase().charAt(i);
            char nCh = ' ';
            if(aCh >= 65 && aCh <= 90) {
                nCh = (char)(aCh - 65 + key);
                if((int)nCh > 90){
                    nCh -= 26;
                }
                if(NText.charAt(i) >= 97){
                    nCh += 32;
                }
                ctext.append(nCh);
                a++;
            }else{
                ctext.append(aCh);
            }
            
        }
        return ctext.toString();
    }
    
    public static String decode(String NText, String code) {
        StringBuilder ctext = new StringBuilder();
        StringBuilder btext = new StringBuilder();
        for(int i = 0, a = 0, b = 0; i < NText.length(); i++) {
            
            char key = code.toUpperCase().charAt(a%code.length());
            char aCh = NText.charAt(i);
            char nCh = ' ';
            if(aCh >= 65 && aCh <= 90) {
                aCh = NText.toUpperCase().charAt(i);
                nCh = (char)(aCh + 65 - key);
                if((int)nCh < 65){
                    nCh += 26;
                }
                if(NText.charAt(i) >= 97){
                    nCh += 32;
                }
                ctext.append(nCh);
                a++;
            }else if(aCh >= 97 && aCh <= 122){
                aCh = NText.toUpperCase().charAt(i);
                nCh = (char)(aCh + 97 - key);
                if((int)nCh < 97){
                    nCh += 26;
                }
                ctext.append(nCh);
                a++;
            }else{
                ctext.append(NText.charAt(i));
            }
        }
        return ctext.toString();
    }

Die Verschlüsselung funktioniert einwandfrei. Bei der Entschlüsselung gibt es allerdings noch probleme undzwar funktioniert die am Anfang sehr gut nur nach ner Zeit macht Sie nurnoch unsinn. Ich habe es mal mit den folgenden Text probiert.

Code:
CrypTool ist ein Programm, mit dessen Hilfe Sie kryptografische Verfahren anwenden und 
analysieren können. So können Sie neue Dokumente erstellen und bestehende Dokumente 
öffnen und weiter bearbeiten. 
Ein Dokument kann mittels verschiedener Verschlüsselungsverfahren ver- und entschlüsselt 
werden. Es stehen sowohl klassische (zum Beispiel das Caesar-Verschlüsselungsverfahren) 
als auch moderne Verschlüsselungsverfahren (beispielsweise das RSA- und das DES-Verfahren 
sowie auf elliptischen Kurven basierende Verfahren) zur Verfügung. Eine Übersicht über alle 
Verschlüsselungsverfahren in CrypTool findet man auf der Hilfeseite zum Menü 
Ver-/Entschlüsseln.

Außerdem kann CrypTool von einem Dokument Hashwerte berechnen (siehe Menü Hashwerte). 
Für die klassischen Verschlüsselungsverfahren stehen automatische Analysen zur Verfügung, 
die Sie in die Lage versetzen, mit Kenntnis des verschlüsselten Dokuments und eventuell 
weiterer Informationen (unverschlüsseltes Dokument oder Sprache des Dokuments) den 
Schlüssel zu ermitteln. Für weitere Informationen zur automatischen Analyse gehen Sie zur 
Hilfe für das Menü Analyse und wählen dort das zu analysierende Verschlüsselungsverfahren.

Zur Unterstützung der eigenen Analyse von Dokumenten kann CrypTool von einem Dokument 
das Histogramm anzeigen und die Entropie und Autokorrelation berechnen.
Ferner gibt es in CrypTool die Möglichkeit, Dateien zu packen oder entpacken (ZIP).

Code:
VvqiMsge bwl xbr Hkhkjtfq, ebm hwllif Abpxx Lmw dkchmhkjtymkvai Nxkjsakif tgawgwif ngh 
sgtpqlbijxg oöfgxr. Kh dörfxg Wax gimx Wscnfifmx ijlmidexr mgw fwlmizxghw Whomfxrlx 
öyjfxg yfw piamxv txtvtxbxwg. 
Xmf Whomfxrl dtrf fbxlxew nxkwuabivxgij Oxvkvapüklxpmgzwnxkjsakif oxv- mgw ifmlgzeülwwem 
awkwif. Xl wlxaif lhagae odtlwalvlw (snq Txbwhbxp vtl Gsxlej-Oxvkvapüklxpmgzwnxkjsakif) 
tew snvl ehwijgx Zwklgzeülwwenryloijytljxg (fwbltaxewoxbww wtw JLT- yfw wek WXW-Nxkjsakif 
lhaax tyx xepaimmkvaif Dnvnxg fslbijxghw Oxvxtavwg) syj Oxvxüznry. Xbrw Üuxvkbvll üuxv seei 
Nxkwuaeüwkxeyfzlzwkyezkxr ag VvqiMsge ymfwxx etg emy wij Abpxxliamx dmf Fifü 
Oxv-/Wgmwuaeüwkxer.

Snßxvvxf osgg GjriXghe zgg xmfxf Hgdnqwgm Lslaawkmi txkiuagif (lbizx Fifü Atwzpxvlx). 
Yüv vbx odtlwalvlwg Oijlvldüllidngkkoxvxtavwg lxwaxr snmsetmmkvai Sgtpqlxr rnk Zwkyükmgz, 
hax Lmw bg hax Eeyx oijlxxrxg, qam Difgmral wik oxvkvapüklxplxg Hgdnqwgmw mgw inxgxmxep 
oxbxwkxv Agysjftxahgif (ngzwklgzeülwwemik Whomfxrl hwij Livsvai vxl Hgdnqwgmw) vxg 
Wuaeüwkxe dm xkqammidg. Yüv oxbxwkx Mfyhvetmmggxr rnk emmhqsmbwuaxr Sgtpqlx kwaxr Kbx dmk 
Amdyx jüj wtw Exgü Efteckx nrv päapwg wsjm wek sn efteckbxvwgwi Nxkwuaeüwkxeyfzlzwkyezkxr.

Rnk Yfmxvkmümdmgz hwk xmyxgif Tgedrli nhg Hgdnqwgmif dtrf VkchMhsd ohr wbgie Whomfxrl 
wtw Zblxgzkeef trrxbkwg nrv wbi Wgmvgibi mgw Emmhogkkidtmmgg uijxvlfxg.
Jwkgij zbfl xl mf VkchMhsd wbi Eözemuadiam, Welxbif sn tsvdif hwij xgxhtvowg (SMH).

Schlüssel: test

Der Text ist richtig verschlüsselt worden. Dies geschar mit einem anderen Programm. Ich bekomme den Text nur bis zur hälfte richtig entschlüsselt mit meinen Programm ich finde leider auch nicht den Fehler habe mir auch schon die zwischenschritte ausgeben lassen allerdings ohne erfolg. Würde mich freuen wenn einer eine lösung findet.


//EDIT: Hab festgestellt das sobald ein ß vorkommt er danach nicht mehr zurecht kommt. Kennt da einer ne Lösung das zu beheben hab da leder nichts hinbekommen

Gruß
Lazybone[/code]
 

Marco13

Top Contributor
So beim ersten Drüberschauen: Sowas
Code:
if(aCh >= 65 && aCh <= 90) {
ist natürlich der Killer - die sind für ein "ß" oder für Umlaute einfach nicht erfüllt! So solltest derartige Abfragen durch
Character.isLetter(aCh)
und
Character.isOwerCase(aCh)
machen. Was genau das für Auswirkungen auf die Verschlüsselungsmethode hat, müsstest du dann noch genauer prüfen. Vermutlich wirst du nichtmehr einfach solche Rechnungen wie
Code:
if(NText.charAt(i) >= 97){
    nCh += 32;
}
machen können....
 

Lazybone

Aktives Mitglied
Er soll ja nur A-Z und a-z verschlüsseln alle anderen Zeichen soll er so wieder ausgeben wie er Sie eingelesen hat.
 

Marco13

Top Contributor
Der Text ist richtig verschlüsselt worden.
Was heißt "richtig" in diesem Fall?
Dies geschar mit einem anderen Programm.
Die Frage, wie das andere Programm mit einem "ß" umgeht, ist ja hierbei nicht ganz unwichtig... Interessant ist zumindest die Ausgabe dieses (compiliererbaren :meld: ) Testprogramms:
Code:
import java.util.*;

class Vigenere
{
    public static void main(String args[])
    {
        System.out.println(encode("etAußerdem", "test"));
        System.out.println(decode("xxSnßxvvxf", "test"));
        System.out.println(decode(encode("etAußerdem", "test"), "test"));
    }

    public static String encode(String NText, String code)
    {
        StringBuffer ctext = new StringBuffer();
        for(int i = 0, a = 0; i < NText.length(); i++) {
            char key = code.toUpperCase().charAt(a%code.length());
            char aCh = NText.toUpperCase().charAt(i);
            char nCh = ' ';
            if(aCh >= 65 && aCh <= 90) {
                nCh = (char)(aCh - 65 + key);
                if((int)nCh > 90){
                    nCh -= 26;
                }
                if(NText.charAt(i) >= 97){
                    nCh += 32;
                }
                ctext.append(nCh);
                a++;
            }else{
                ctext.append(aCh);
            }

        }
        return ctext.toString();
    }

    public static String decode(String NText, String code)
    {
        StringBuffer ctext = new StringBuffer();
        StringBuffer btext = new StringBuffer();
        for(int i = 0, a = 0, b = 0; i < NText.length(); i++) {

            char key = code.toUpperCase().charAt(a%code.length());
            char aCh = NText.charAt(i);

            //System.out.println("Input "+NText.charAt(i));

            char nCh = ' ';
            if(aCh >= 65 && aCh <= 90) {
                aCh = NText.toUpperCase().charAt(i);
                nCh = (char)(aCh + 65 - key);
                if((int)nCh < 65){
                    nCh += 26;
                }
                if(NText.charAt(i) >= 97)
                {
                    System.out.println("Passiert nie...");
                    nCh += 32;
                }
                //System.out.println("Output1 "+nCh);

                ctext.append(nCh);
                a++;
            }else if(aCh >= 97 && aCh <= 122){
                aCh = NText.toUpperCase().charAt(i);
                nCh = (char)(aCh + 97 - key);
                if((int)nCh < 97){
                    nCh += 26;
                }
                //System.out.println("Output2 "+nCh);

                ctext.append(nCh);
                a++;
            }else{
                //System.out.println("Not encrypted "+NText.charAt(i));
                ctext.append(NText.charAt(i));
            }
        }
        return ctext.toString();
    }
}

Die Ausgabe ist:

xxSnlwwkwi (das ist das Ergebnis DEINER encode-Methode, wobei die Methode des anderen Programms "xxSnßxvvxf" liefert)
etAußztdce (das ist der Versuch, mit DEINER decode-Methode den Verschlüsselten Text des anderen Programms zu decoden)
etAusserde (das ist eine Hintereinanderausführung DEINER encode/decode-Methoden - ß wird zu ss, aber es funktioniert asatzweise)

Wenn du mit deinem Programm die Ausgabe eines anderen Programms wieder entschlüsseln willst, müßt ihr euch schon "einigen", wie ihr mit einem "ß" umgehen wollt...
 

Lazybone

Aktives Mitglied
Das ß wird nicht bei der verschlüsselung einbezogen es bleibt so wie es ist genauso wie alle anderen sonderzeichen nur A-Z wird verschlüsselt.
 

Marco13

Top Contributor
Java ist manchmal doch um einiges schlauer, als einem recht sein kann:
System.out.println("Außerdem".toUpperCase()); // gibt AUSSERDEM aus
d.h. durch deine
aCh = NText.toUpperCase().charAt(i);
zerhaust du dir alles, was nach einem 'ß' kommt (nach einem 'ß' stimmt der Zugriffs-Index 'i' einfach nicht mehr).
Hm. Lösungsansätze gibt's da jetzt einige. Ich überlasse es dir, dir den besten rauszusuchen :bae:
 

Lazybone

Aktives Mitglied
Danke Marko hab dan mal wieder was dazu gerlernt ^^ ich schau mal das ich ne lösung finde danke
 
G

Guest

Gast
So hab ne Lösung gefunden. Poste für andere auch mal den Quellcode
Code:
    public static String code(String NText, String code) {
        
        StringBuilder ctext = new StringBuilder();
        for(int i = 0, a = 0; i < NText.length(); i++) {
            
            char key = code.toUpperCase(Locale.getDefault()).charAt(a%code.length());
            char aCh = NText.charAt(i);
            char nCh = ' ';
            
            if(aCh >= 65 && aCh <= 90) {
                aCh = NText.charAt(i);
                nCh = (char)(aCh + key - 65);
                if((int)nCh > 90){
                    nCh -= 26;
                }
                ctext.append(nCh);
                a++;
            }else if(aCh >= 97 && aCh <= 122){
                aCh = NText.charAt(i);
                nCh = (char)(aCh + key - 65 );
                if((int)nCh <= 97){
                    nCh += 26;
                }
                if((int)nCh > 122){
                    nCh -= 26;
                }
                
                ctext.append(nCh);
                a++;
            }else{
                nCh = (char)(aCh);
                ctext.append(nCh);
            }
        }
        return ctext.toString();
    }
    
    public static String decode(String NText, String code) {
        StringBuilder ctext = new StringBuilder();
        
        int a = 0;
        for(int i = 0; i < NText.length(); i++) {
            char key = code.toUpperCase().charAt(a%code.length());
            char aCh = NText.charAt(i);
            char nCh = ' ';
            
            if(aCh >= 65 && aCh <= 90) {
                aCh = NText.charAt(i);
                nCh = (char)(aCh + 65 - key);
                if((int)nCh < 65){
                    nCh += 26;
                }
                if(NText.charAt(i) >= 97){
                    nCh += 32;
                }
                ctext.append(nCh);
                a++;
            }else if(aCh >= 97 && aCh <= 122){
                aCh = NText.charAt(i);
                nCh = (char)(aCh + 65 - key);
                if((int)nCh < 97){
                    nCh += 26;
                }
                ctext.append(nCh);
                a++;
            }else{
                nCh = (char)(aCh);
                ctext.append(NText.charAt(i));
            }
        }
        return ctext.toString();
    }
 

Marco13

Top Contributor
Schön, dass das dann doch noch geklappt hat :)

In der Hoffnung, dass das jetzt dann nicht zu diskreditierend wirkt:
Code:
            char aCh = NText.charAt(i);
...
            if(aCh >= 65 && aCh <= 90) {
                aCh = NText.charAt(i);
...
                if(NText.charAt(i) >= 97){
                    nCh += 32;
                }
...
            }else if(aCh >= 97 && aCh <= 122){
                aCh = NText.charAt(i);
aCh ändert sich nach der ersten Zuweisung nichtmehr, d.h. die beiden anderen Zuweisungen sind überflüssig, und in der inneren if-Abfrage könntest du auch direkt aCh verwenden - aber die kann sowieso nie erfüllt sein, deswegen wäre da "weglassen" auch eine Alternative...

EDIT: Und wenn diese innere if-Abfrage wegfällt, sind die beiden Äußeren if-Blöcke doch sogar gleich oder...?
EDIT2: Nee, sind sie nicht. Aber fast :roll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Vigenere Verschlüsselung Java Basics - Anfänger-Themen 2
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
D Vigenere KleinBuchstaben/Special Characters Java Basics - Anfänger-Themen 14
U Cäsar Verschlüsselung Java Basics - Anfänger-Themen 8
Camoflasche RSA Verschlüsselung Java Basics - Anfänger-Themen 0
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M Verschlüsselung mit replace() Java Basics - Anfänger-Themen 35
P Cäsear verschlüsselung irgendwas passt noch nicht Java Basics - Anfänger-Themen 2
A Methoden Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 13
E Einfache Java Verschlüsselung Java Basics - Anfänger-Themen 4
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
Y Caesar Verschlüsselung Fehler Java Basics - Anfänger-Themen 4
Ä Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 5
N Caesar Verschlüsselung Java Basics - Anfänger-Themen 2
L Interpreter-Fehler RSA Verschlüsselung Fehler Java Basics - Anfänger-Themen 2
M Erste Schritte Verschlüsselung von text Java Basics - Anfänger-Themen 21
M Erste Schritte Verschlüsselung / Login-Sicherheit Java Basics - Anfänger-Themen 8
D Eine einfache Verschlüsselung schreiben Java Basics - Anfänger-Themen 3
B RSA Verschlüsselung für Aktivierunscode Java Basics - Anfänger-Themen 7
T Array Verschlüsselung Java Basics - Anfänger-Themen 5
Z Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 1
V Permutation, Verschlüsselung Java Basics - Anfänger-Themen 19
H Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 1
S Caesar Verschlüsselung Start Hilfe Java Basics - Anfänger-Themen 4
K Symmetrische Verschlüsselung von TextArea Java Basics - Anfänger-Themen 7
U Problem mit Verschlüsselung Java Basics - Anfänger-Themen 2
C Frage zu RSA-Verschlüsselung Java Basics - Anfänger-Themen 3
Y Applet: Verschlüsselung Java Basics - Anfänger-Themen 3
H Caesar-Verschlüsselung - Was stimmt nicht? Java Basics - Anfänger-Themen 6
V Ceasar Verschlüsselung Java Basics - Anfänger-Themen 9
D Verschlüsselung mit Java Java Basics - Anfänger-Themen 8
F Problem: Verschlüsselung von String in Array Fehler Java Basics - Anfänger-Themen 2
C Verschlüsselung Java Basics - Anfänger-Themen 8
R Frage zu Cäsar - Verschlüsselung! Java Basics - Anfänger-Themen 10
I Rc4 Verschlüsselung in BlueJ Java Basics - Anfänger-Themen 18
D Verschlüsselung Java Basics - Anfänger-Themen 4
C Compiler-Fehler Verschlüsselung Java Basics - Anfänger-Themen 2
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
S Caesar-Verschlüsselung Problem/Frage Java Basics - Anfänger-Themen 4
D Java Password verschlüsselung Java Basics - Anfänger-Themen 6
P RSA Verschlüsselung kleines Problem Java Basics - Anfänger-Themen 5
R Verschlüsselung von String Java Basics - Anfänger-Themen 4
J Cäsar Verschlüsselung Java Basics - Anfänger-Themen 12
G Verschlüsselung und Entschlüsselung von Texten Java Basics - Anfänger-Themen 7
D Java Verschlüsselung Java Basics - Anfänger-Themen 8
O Verschlüsselung mit Cipher & Key Java Basics - Anfänger-Themen 9
K Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 1
S Hill Verschlüsselung Java Basics - Anfänger-Themen 10
A Einfache java Verschlüsselung HILFE Java Basics - Anfänger-Themen 3
W Xor-Verschlüsselung Java Basics - Anfänger-Themen 15
Y verschlüsselung Java Basics - Anfänger-Themen 10
T Frage zur Verschlüsselung (RSA) Java Basics - Anfänger-Themen 6
A Java Verschlüsselung/Cipher Java Basics - Anfänger-Themen 12
S Verschlüsselung Key Splitting Java Basics - Anfänger-Themen 2
B Again, Verschlüsselung Java Basics - Anfänger-Themen 3
M Caeser Verschlüsselung ganz einfach(nicht für mich) Java Basics - Anfänger-Themen 6
L Frage zur Verschlüsselung in java Java Basics - Anfänger-Themen 3
D Verschlüsselung Java Basics - Anfänger-Themen 4
A verschlüsselung Java Basics - Anfänger-Themen 7
G Vergleich bei MD5-Verschlüsselung Java Basics - Anfänger-Themen 3
zilti md5-Verschlüsselung? Java Basics - Anfänger-Themen 7
L Caesar-Verschlüsselung programmieren Java Basics - Anfänger-Themen 12
S XOR-Verschlüsselung Java Basics - Anfänger-Themen 5
U "Einfache Verschlüsselung" Java Basics - Anfänger-Themen 17
K Verschlüsselung Java Basics - Anfänger-Themen 8
E Verschlüsselung mithilfe von Array Java Basics - Anfänger-Themen 2
S SHA? Hashcodes, Blowfish Verschlüsselung Java Basics - Anfänger-Themen 7
L Java und PGP Verschlüsselung, wie...??? Java Basics - Anfänger-Themen 2
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
monsterherz Punkt Notation funktioniert nicht Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
Garrit1994 Continue funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
B Methoden Übergebe Variabel funktioniert nicht Java Basics - Anfänger-Themen 17
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben