import javax.swing.JOptionPane;
import java.util.Random;

public class  SimpleVigenereCipher {
    public  SimpleVigenereCipher() {
        // Instead of always shifting the same the Vigenere cipher shifts differnet amounts
        //int[] key = {4,6,2,3,8,15,20,14};
        
        String keyString = "florida";
        char[] keyArray = keyString.toCharArray();
        /*
        String alphabet =  "abcdefghijklmnopqrstuvwxyz{";
        char[] keyArray = alphabet.toCharArray();
        permute(keyArray);
         */
        int low = (int)'a' - 1;
        String keys = "";
        int[] key = new int[keyArray.length];
        for(int i = 0; i < key.length; i++ ) {
            key[i] = keyArray[i] - low;
            keys += key[i] + " ";
        } // end for
        keys += "\n";
        JOptionPane.showMessageDialog(null,"Combination is " + keys);
        
        while( true ) {
            String input = JOptionPane.showInputDialog("Enter Message","meet vaslik at the usual place at ten pm");
            if( input == null ) break;
            input = input.toLowerCase();
            String encrypted = SimpleVigenereEncrypt(input,key);
            JOptionPane.showMessageDialog(null,"Encrypted message is <" + encrypted + ">");
            String decrypted = SimpleVigenereDecrypt(encrypted,key);
            JOptionPane.showMessageDialog(null,"Decrypted message is <" + decrypted + ">");
        } // end while
    } // end constructor
    
    String SimpleVigenereEncrypt(String input, int[] key) {
        input = input.replace(' ','{');
        char[] message = input.toCharArray();
        String encrypted = "";
        for( int i = 0; i < message.length; i++ ) {
            int charInt = (int)message[i];
            charInt = (charInt - 'a' + key[i%key.length])%27 + 'a';
            encrypted += (char)charInt;
        } // end for
        encrypted = encrypted.replace('{',' ');
        return encrypted;
    } // end SimpleVigenereEncrypt
    
    String SimpleVigenereDecrypt(String encrypted, int[] key) {
        encrypted = encrypted.replace(' ','{');
        char[] message = encrypted.toCharArray();
        String decrypted = "";
        for( int i = 0; i < message.length; i++ ) {
            int charInt = (int)message[i];
            charInt = (charInt - 'a' - key[i%key.length]+27)%27 + 'a';
            decrypted += (char)charInt;
        }// end for
        decrypted = decrypted.replace('{',' ');
        return decrypted;
    } // end SimpleVigenereDecrypt
    
    public static void main(String[] a) {
        new  SimpleVigenereCipher();
    } // end main
    
    public final void permute(char[] chars) {
        Random r = new Random();
        for( int i = 1; i < chars.length; i++ ) {
            char ch = chars[i];
            int j = r.nextInt(i);
            chars[i] = chars[j];
            chars[j] = ch;
        } // end for
    } // end permute
    
} // end SimpleVigenereCipher
