Search code examples
javaencryptioncaesar-cipher

java caesar cipher code


i did caesar cipher code by java it runs but doesnt encrypt anything after user enter the key !

here is my code

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

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

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

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the String for Encryption: ");
        String message = new String();
        message = sc.next();
        System.out.println(encrypt(message, 3));
        System.out.println(decrypt(encrypt(message, 3), 3));
        sc.close();
    }
}

run:

Enter The Plain Text:
Reem LA
Enter The Key:
2
The Cipher Text

Solution

  • Using indexOf is not very efficient... You can do integer arithmetic on char values to get their indices.

    I included comments in the code to explain more, but this is what I came up with.

    public class CaesarCipher {
        // Rotate a character k-positions
        public static char cipher(char c, int k) {
            // declare some helping constants
            final int alphaLength = 26;
            final char asciiShift = Character.isUpperCase(c) ? 'A' : 'a';
            final int cipherShift = k % alphaLength;
    
            // shift down to 0..25 for a..z
            char shifted = (char) (c - asciiShift);
            // rotate the letter and handle "wrap-around" for negatives and value >= 26
            shifted = (char) ((shifted + cipherShift + alphaLength) % alphaLength);
            // shift back up to english characters
            return (char) (shifted + asciiShift);
        }
    
        // Rotate a string k-positions
        public static String cipher(String s, int k) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < s.length(); i++) {
                sb.append(cipher(s.charAt(i), k));
            }
            return sb.toString();
        }
    
        public static void main(String[] args) {
            Scanner keyboard = new Scanner(System.in);
            String password;
            int key;
    
            System.out.print("Please enter a password: ");
            password = keyboard.nextLine();
    
            do {
                System.out.print("Please enter a key between 1-25: ");
                key = keyboard.nextInt();
    
                if (key < 1 || key > 25) {
                    System.out.printf(" The key must be between 1 and 25, you entered %d.\n", key);
                }
            } while (key < 1 || key > 25);
    
    
            System.out.println("Password:\t" + password);
            String encryption = cipher(password, key);
            System.out.println("Encrypted:\t" + encryption);
            System.out.println("Decrypted:\t" + cipher(encryption, -key));
    
        }
    }
    

    The output should be something like

    Please enter a password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
    Please enter a key between 1-25: 1
    Password:   ABCDEFGHIJKLMNOPQRSTUVWXYZ
    Encrypted:  BCDEFGHIJKLMNOPQRSTUVWXYZA
    Decrypted:  ABCDEFGHIJKLMNOPQRSTUVWXYZ