2017-09-27 5 views
3

Dans ce chiffrement César, j'obtiens la sortie incorrecte pour les majuscules. Le code est le suivant:Java César 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)); 

} 
} 

La sortie ressemble à: ccccccccccccccccccccccccc zzzzzzzzzzzzzzzzzzzzzzzzz fghijklmnopqrtuvwxyzabcde abcdefghijklmopqrstuvwxyz

sortie souhaitée est: DEFGHIJKLMOPQRSTUVWXYZABC ABCDEFGHIJKLMOPQRSTUVWXYZ fghijklmnopqrtuvwxyzabcde abcdefghijklmopqrstuvwxyz

+0

Juste un petit conseil: Je recommande fortement que vous utilisez un objet StringBuilder pour concaténer beaucoup de chaînes, au lieu de l'utilisation de l'opérateur "+ =". Cela va rendre votre code beaucoup plus efficace. – Discoverer98

Répondre

0

Le problème est que vous passez une lettre majuscule à la méthode indexOf(), qui vérifie ALPHABET mais ne le trouve pas, elle renvoie -1. Vous devez soit transformer la lettre majuscule en minuscule, soit ajouter un alphabet majuscule.

Ma solution, transformant la lettre majuscule à une lettre minuscule et le chiffrement/déchiffrage est:

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