Implementation of Vigenere Cipher

// CSci 4509 Vigenere Cipher implementation
// Elena Machkasova, 1/31/05

public class Vigenere {
    public static void main(String[] args) {

	if (args.length < 3) {
	    System.out.println("Usage: java Vigenere mode key message");
	    System.out.println("mode: e for encrypt. d for decrypt");
	    System.out.println("key: a sequence of letters, no spaces, etc.");
	    System.out.println("message: the message to encrypt or decrypt");
	    System.exit(0);
	}


	if (args[0].equals("e") || args[0].equals("E")) {
	    // encrypting
	    System.out.println(encrypt(args[2], args[1]));
	} else if (args[0].equals("d") || args[0].equals("D")) {
	    // decrypting
	    System.out.println(decrypt(args[2], args[1]));
	} else {
	    System.out.println("the first argument must be e or d");
	    System.exit(0);
	}
	
    }

    // computes n mod m defined as the smallest
    // non-negative integer r such that n = k * m + r, 
    // where k is an integer 
    // Assume that m > 0
    public static int mod(int n, int m) {
	int r = n % m;
	if (r < 0) r = r + m;
	return r;
    }

    // converts an upper or lower case letter
    // into an integer 0 <= n < = 25 which 
    // corresponds to the position of the letter in 
    // English alphabet
    public static int letterToNum(char letter) {
	int position = 0;
	if (Character.isUpperCase(letter)) {
		position = letter - 'A';
	    }
	    else if (Character.isLowerCase(letter)) {
		position = letter - 'a';
	    } else {
		System.out.println("Illegal character " + letter);
		System.exit(0);
	    }
	return position;
    }


    public static String encrypt(String plaintext, String key) {
	int messageLength = plaintext.length();
	int keyLength = key.length();
	StringBuffer ciphertext = new StringBuffer();
	int j = 0;
	for (int i = 0; i < messageLength; ++i) {
	    // convert the letter to a number 0 to 25
	    char letter = plaintext.charAt(i);
	    int position = letterToNum(letter);

	    // convert the next key letter to a number 0 to 25
	    char keyLetter = key.charAt(j);
	    int shift = letterToNum(keyLetter);
	    
	    // encrypt the letter
	    ciphertext.append((char) ('A' + mod(position + shift,26)));

	    // index of the next key letter (wraps around)
	    j = mod(j + 1, keyLength);
	}
	return ciphertext.toString();
    }

    public static String decrypt(String ciphertext, String key) {
	int messageLength = ciphertext.length();
	StringBuffer plaintext = new StringBuffer();

	int keyLength = key.length();
	int j = 0;

	for (int i = 0; i < messageLength; ++i) {
	    // convert the letter to a number 0 to 25
	    char letter = ciphertext.charAt(i);
	    int position = letterToNum(letter);

	    // convert the next key letter to a number 0 to 25
	    char keyLetter = key.charAt(j);
	    int shift = letterToNum(keyLetter);
	    
	    // encrypt the letter
	    plaintext.append((char) ('A' + mod(position - shift,26)));

	    // index of the next key letter (wraps around)
	    j = mod(j + 1, keyLength);
	}

	return plaintext.toString();
    }
}

Try encrypting this
idonotlikegreeneggsandhamidonotlikethemsamiam
using the key KEY and the key GREEN
The course main page.