javaalgorithmvigenere

Vigenere Cipher Algorithm In Java - Decrypted Message to Plaintext


I am currently trying to write the Vigenere Cipher algorithm in Java. I have to change the decrypted message to the plaintext but having trouble. Below is what I have so far.

When I run it, the message is not deciphered properly. enter image description here

import java.util.Scanner;

public class VigenereCipher {
        public static void main(String arg[]) {
            String message = "";
            String keyword = "KISWAHILI";
            
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter a message: ");
            message = sc.nextLine();
            
            char msg[] = message.toCharArray();
            int msgLength = msg.length;
        
            
            char key[] = new char [msgLength];
            char decryptedText[] = new char[msgLength];
            
            for(int i = 0, j = 0; i < msgLength; i++, j++) {
                if(j == keyword.length()) {
                    j = 0;
                }
                key[i] = keyword.charAt(j);
            }
            
            // Decryption Code
            for(int i =0; i < msgLength; i++) {
                decryptedText[i] = (char)(((key[i] + 26) % 26) + 'A');
            }
            System.out.println("Decrypted Message: " + message);
            System.out.println("Keyword: " + keyword);
            System.out.println("Plaintext: " + String.valueOf(decryptedText));
        }
}

Solution

  • It seems that whitespaces need to be skipped while populating key array:

    for (int i = 0, j = 0; i < msgLength; i++) {
        if (msg[i] == ' ') {
            key[i] = ' ';
        } else {
            key[i] = keyword.charAt(j++ % keyword.length());
        }
    }
    System.out.println("Key Message:       " + new String(key));
    

    Similarly, it needs to be taken into account in the decrypting loop. And decryption has to be fixed:
    Di = (Mi - Ki + 26 ) mod 26

    for (int i =0; i < msgLength; i++) {
        char c = msg[i];
                
        decryptedText[i] = c == ' ' ? c : (char)(((msg[i] - key[i] + 26) % 26) + 'A');
    }
    

    Upon applying these changes, the output is as follows:

    Key Message:       KISW AH ILIKI SW AHILIKIS WAH ILI KISW AHILIKISW AHIL IKIS
    Encrypted Message: XQKP IZ IMWEB LK AUVZCXKW PHL VPE RIKD ASOZZSBZI TOIE ESTD
    Keyword: KISWAHILI
    Plaintext: NIST IS ABOUT TO ANNOUNCE THE NEW HASH ALGORITHM THAT WILL