import java.util.Vector;

/*
// #############################################################################
// # NOTAS SOBRE DIREITO AUTORAL                                               #
// # Direitos Autorais (c) 1997, 1998, 1999 Alan Candido                       #
// # Todos os direitos reservados                                              #
// #                                                                           #
// # Esta rotina, pode ser utilizada, modificada, copiada e distribuída por    #
// # qualquer pessoa, em qualquer tempo, desde que esta nota de direito auto-  #
// # ral e demais comentários sejam mantidos, sem modificações de conteúdo,    #
// # forma ou apresentação.                                                    #
// #                                                                           #
// # Por usar este código, você concondar com estas normas e reconhece Alan    #
// # Candido como legal detentor dos direitos autorais e compromete-se a inse- #
// # rir uma nota, na caixa "Sobre..." ou equivalente, dos aplicativos que fi- #
// # zerem uso desta, com o endereço do meu "site"(1).                         #
// #                                                                           #
// # Alan Candido não se resposabilizam pelo uso deste ou por problemas que    #
// # este causar a seus usuários, devido a mal uso, uso indevido ou erros de   #
// # qualquer natureza. Fica claro, que não existe nenhum tipo de garantia,    #
// # implicita ou não no uso deste.                                            #
// #                                                                           #
// # A venda, distribuição ou qualquer forma de comercialização deste, por     #
// # terceiros, é expressamente proibida. Aqueles que infrigirem estas normas  #
// # e leis de direito autoral ficará sujeito as sanções e penalidades legais, #
// # podendo o inflator responder civil e criminalmente.                       #
// #---------------------------------------------------------------------------#
// # Sugestões, comentários ou melhorias efetuadas serão bem vindas. Passando  #
// # a fazer parte da versão oficial e você de nossa equipe de colaboradores.  #
// #---------------------------------------------------------------------------#
// # Caso voce encontre algum erro (bug), favor entrar em contato, por e-mail, #
// # relatando a versão, o erro e em que condições ocorreu, para que possamos  #
// # efetuar a correção.                                                       #
// #---------------------------------------------------------------------------#
// # (1) Almanauqe BRÓDÃO & bródinho                                           #
// #     http://albb.cjb.net                                                   #
// # (2) Nosso e-mail - acandido@albb.cjb.net                                  #
// #############################################################################
// # Versão # Autor/Data   # Comentários                                       #
// #############################################################################
// # 0.0.1  # Alan Candido # Implementação das funçoes de Criptografia         #
// #        # 15.02.99     #                                                   #
// # 0.0.2  # Alan Candido # Conversão de Delphi para Java                     #
// #        # 13.05.02     #                                                   #
// #############################################################################
*/
public class ACCripto
{
	static String aMinus[] = new String[26];
	static String aMaius[] = new String[26];

	/**
	 * Cripto
	 * 
	 * Criptografa um texto usando uma senha.
	 * @param senha, string, senha que deverá ser utilizada no processo
	 * @param texto, string, texto a ser processado
	 * @return String processada.
	*/
	static public String cripto(String senha, String texto)
	{
		return vigenere(true, senha, texto);
	}

	/**
	 * Decripto
	 * 
	 * Descriptografa um texto usando uma senha.
	 * @param senha, string, senha que deverá ser utilizada no processo
	 * @param texto, string, texto a ser processado
	 * @return String processada.
	*/
	static public String decripto(String senha, String texto)
	{
		return vigenere(false, senha, texto);
	}

	/**
	 * Vigenere
	 * 
	 * Criptografa ou descriptografa strings, usando o método de Vigenère.
	 * @param cripto, boolean que indica se é para criptografar ou descriptografar
	 * @param senha, string, senha que deverá ser utilizada no processo
	 * @param texto, string, texto a ser processado
	 * @return String processada.
	*/
	static private String vigenere(boolean cripto, String senha, String texto)
	{
		String cRet = "";

		if (senha.length() != 0)
		{
			senha = senha.toUpperCase();
			aMaius[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
			aMaius[1] = "BCDEFGHIJKLMNOPQRSTUVWXYZA";
			aMaius[2] = "CDEFGHIJKLMNOPQRSTUVWXYZAB";
			aMaius[3] = "DEFGHIJKLMNOPQRSTUVWXYZABC";
			aMaius[4] = "EFGHIJKLMNOPQRSTUVWXYZABCD";
			aMaius[5] = "FGHIJKLMNOPQRSTUVWXYZABCDE";
			aMaius[6] = "GHIJKLMNOPQRSTUVWXYZABCDEF";
			aMaius[7] = "HIJKLMNOPQRSTUVWXYZABCDEFG";
			aMaius[8] = "IJKLMNOPQRSTUVWXYZABCDEFGH";
			aMaius[9] = "JKLMNOPQRSTUVWXYZABCDEFGHI";
			aMaius[10] = "KLMNOPQRSTUVWXYZABCDEFGHIJ";
			aMaius[11] = "LMNOPQRSTUVWXYZABCDEFGHIJK";
			aMaius[12] = "MNOPQRSTUVWXYZABCDEFGHIJKL";
			aMaius[13] = "NOPQRSTUVWXYZABCDEFGHIJKLM";
			aMaius[14] = "OPQRSTUVWXYZABCDEFGHIJKLMN";
			aMaius[15] = "PQRSTUVWXYZABCDEFGHIJKLMNO";
			aMaius[16] = "QRSTUVWXYZABCDEFGHIJKLMNOP";
			aMaius[17] = "RSTUVWXYZABCDEFGHIJKLMNOPQ";
			aMaius[18] = "STUVWXYZABCDEFGHIJKLMNOPQR";
			aMaius[19] = "TUVWXYZABCDEFGHIJKLMNOPQRS";
			aMaius[20] = "UVWXYZABCDEFGHIJKLMNOPQRST";
			aMaius[21] = "VWXYZABCDEFGHIJKLMNOPQRSTU";
			aMaius[22] = "WXYZABCDEFGHIJKLMNOPQRSTUV";
			aMaius[23] = "XYZABCDEFGHIJKLMNOPQRSTUVW";
			aMaius[24] = "YZABCDEFGHIJKLMNOPQRSTUVWX";
			aMaius[25] = "ZABCDEFGHIJKLMNOPQRSTUVWXY";

			for (int nInd = 0; nInd < aMaius.length; nInd++)
				aMinus[nInd] = aMaius[nInd].toLowerCase();

			int nKey;
			String cSenha;
			int nPos;

			nKey = 0;
			cSenha = senha; //uppercase

			for (int nInd = 0; nInd < texto.length(); nInd++)
			{
				char cAux = texto.charAt(nInd);
				if ((cAux >= 'a' && cAux <= 'z') || (cAux >= 'A' && cAux <= 'Z'))
				{
					if (cripto)
					{
						if (cAux >= 'a' && cAux <= 'z')
						{
							cRet += aMinus[cAux - 'a'].charAt(senha.charAt(nKey) - 'A');
						} else
						{
							cRet += aMaius[cAux - 'A'].charAt(senha.charAt(nKey) - 'A');
						}
					} else
					{
						String cLetras;
						for (int nRow = 0; nRow < aMinus.length; nRow++)
						{
							cAux = senha.charAt(nKey);
							cAux -= 'A';
							if ((texto.charAt(nInd) >= 'A') && (texto.charAt(nInd) <= 'Z'))
							{
								cLetras = aMaius[nRow];
							} else
							{
								cLetras = aMinus[nRow];
							}
					
							if (cLetras.charAt(cAux) == texto.charAt(nInd))
							{
								cRet += cLetras.charAt(0);
								break;
							}
						}
					}
					nKey++;
					if (nKey == senha.length())
					{
						nKey = 0;
					}
				} else
				{
					cRet += cAux;
				}
			}
		} else
		{
			cRet = texto;
		}
		return cRet;
	}
}

