2017-09-27 1 views
3

In dieser Caesar-Chiffre erhalte ich die falsche Ausgabe für Großbuchstaben. Der Code ist wie folgt:Java Caesar Cipher

public class CaesarCipherCaseSensitive 
{ 
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz"; 

public static String encrypt(String pt, int shiftKey) 
{ 
    String ct = ""; 
    for (int i = 0; i < pt.length(); i++) 
    { 
     int charPosition = ALPHABET.indexOf(pt.charAt(i)); 
     int keyVal = (shiftKey + charPosition) % 26; 
     char replaceVal = ALPHABET.charAt(keyVal); 
     ct += replaceVal; 
    } 
    return ct; 
} 

public static String decrypt(String ct, int shiftKey) 
{ 
    String pt = ""; 
    for (int i = 0; i < ct.length(); i++) 
    { 
     int charPosition = ALPHABET.indexOf(ct.charAt(i)); 
     int keyVal = (charPosition - shiftKey) % 26; 
     if (keyVal < 0) 
     { 
      keyVal = ALPHABET.length() + keyVal; 
     } 
     char replaceVal = ALPHABET.charAt(keyVal); 
     pt += replaceVal; 
    } 
    return pt; 
} 

public static void main(String[] args) 
{ 
    String message1 = "ABCDEFGHIJKLMOPQRSTUVWXYZ"; 
    System.out.println(encrypt(message1, 3)); 
    System.out.println(decrypt(encrypt(message1, 3), 3)); 
    System.out.println(encrypt(message1.toLowerCase(),5)); 
    System.out.println(decrypt(encrypt(message1.toLowerCase(),5),5)); 

} 
} 

Die Ausgabe sieht so aus: ccccccccccccccccccccccccc zzzzzzzzzzzzzzzzzzzzzzzzz fghijklmnopqrtuvwxyzabcde abcdefghijklmopqrstuvwxyz

Wunsch Ausgabe lautet: DEFGHIJKLMOPQRSTUVWXYZABC ABCDEFGHIJKLMOPQRSTUVWXYZ fghijklmnopqrtuvwxyzabcde abcdefghijklmopqrstuvwxyz

+0

Nur ein kleiner Tipp: Ich würde empfehlen, dass Sie ein Stringbuilder-Objekt verwenden, um viele verketten von Strings anstelle der Verwendung des Operators "+ =". Es wird Ihren Code viel effizienter machen. – Discoverer98

Antwort

0

Das Problem besteht darin, dass Sie einen Großbuchstaben an die Methode indexOf() übergeben, die ALPHABET überprüft, sie jedoch nicht findet und daher -1 zurückgibt. Sie müssen entweder den Großbuchstaben in Kleinbuchstaben umwandeln oder ein Großbuchstabenalphabet hinzufügen.

Meine Lösung, die Großbuchstaben auf Kleinbuchstaben umzuwandeln und dann die Verschlüsselung/Entschlüsselung ist:

public class CaesarCipherCaseSensitive{ 
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz"; 

public static String encrypt(String pt, int shiftKey){ 
    String ct = ""; 
    for (int i = 0; i < pt.length(); i++){ 
     char letter = pt.charAt(i); 
     boolean upperCase = false; 
     if((int)letter < 91){ 
      letter = (char)((int)letter + 32); 
      upperCase = true; 
     } 
     int charPosition = ALPHABET.indexOf(letter); 
     int keyVal = (shiftKey + charPosition) % 26; 
     char replaceVal = ALPHABET.charAt(keyVal); 
     if(upperCase){ 
      replaceVal = (char)((int)replaceVal - 32); 
     } 
     ct += replaceVal; 
    } 
    return ct; 
} 

public static String decrypt(String ct, int shiftKey){ 
    String pt = ""; 
    for (int i = 0; i < ct.length(); i++){ 
     char letter = ct.charAt(i); 
     boolean upperCase = false; 
     if((int)letter < 91){ 
      letter = (char)((int)letter + 32); 
      upperCase = true; 
     } 
     int charPosition = ALPHABET.indexOf(letter); 
     int keyVal = (charPosition - shiftKey) % 26; 
     if (keyVal < 0){ 
      keyVal = ALPHABET.length() + keyVal; 
     } 
     char replaceVal = ALPHABET.charAt(keyVal); 
     if(upperCase){ 
      replaceVal = (char)((int)replaceVal - 32); 
     } 
     pt += replaceVal; 
    } 
    return pt; 
} 

public static void main(String[] args){ 
    String message1 = "ABCDEFGHIJKLMOPQRSTUVWXYZ"; 
    System.out.println(encrypt(message1, 3)); 
    System.out.println(decrypt(encrypt(message1, 3), 3)); 
    System.out.println(encrypt(message1.toLowerCase(),5)); 
    System.out.println(decrypt(encrypt(message1.toLowerCase(),5),5)); 
} 
} 
Verwandte Themen