Vigenere Verschlüsselung funktioniert nicht richtig

Spranta

Erfahrenes Mitglied
Hallo

ich habe mich mal an eine Vigenere Verschlüsselung gemacht. Hier erstmal die beiden Methoden zum Ver bzw Entschlüsseln
Java:
    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();
        
        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.toUpperCase().charAt(i);
                nCh = (char)(aCh + 65 - key);
                if((int)nCh < 65){
                    nCh += 26;
                }
                if(NText.charAt(i) >= 97){
                    nCh += 32;
                }
                System.out.println(aCh+":"+key+":"+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;
                }
                ctext.append(nCh);
                System.out.println(aCh+":"+key+":"+nCh);
                a++;
            }else{
                System.out.println(aCh);
                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.


Habe 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ß
Spranta
 
Das mit dem Problem beim ß ist korrekt. Die Vigenere-Verschlüsselung durchläuft alle Zeichen und macht sich die Dezimal-Darstellung eines ASCII Zeichens (A-Z von 65 - 90) zu nutze. ß kommt in der ASCII-Tabelle jedoch nicht vor.
 
genau daher habe ich auch nur die Zeichen A-Z(65-90) und a-z(97-122) einbezogen auch nur dort wird der Verschlüsselungscode angewendet alle anderen werden ausgelassen. So zu mindest meine Überlegung nur funktioniert es ja leider net.
 
So hab ne Lösung gefunden. Poste für andere auch mal den Quellcode
Java:
    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();
    }
 
hallo na ja iwi t das bei mir immer noch nicht ganz ... fehlermeldung wegen dem STringbuilder... hoffe mir kann noch jemand antworten!!
 

Neue Beiträge

Zurück