A descrição deste exercício é essa:
O algoritmo de César pode ser implementado de maneira mais complexa (e difícil de ser quebrada) se, em vez de uma única chave, várias forem usadas. O primeiro caracter da string será codificado com a primeira chave, o segundo caracter com a segunda chave etc. Quando as chaves acabarem, a primeira será reutilizada, até o final da string a ser codificada. A chave pode ser especificada por outra string, onde cada caracter tem um valor numérico correspondente, de forma que a string ?AEIY? corresponde a quatro chaves (1, 5, 9, 25). Dessa forma, se a string ?Programa? fosse codificada com a chave ?aeb? (correspondente aos valores 1, 5 e 2) o resultado seria ?Qwqhwcnf? (?P? foi adicionada a 1 e o resultado é ?Q?, ?r? foi adicionada a 5 e o resultado é ?w?, ?o? foi adicionada a 2 e o resultado é ?q?, ?g? foi adicionada a 1 e o resultado é ?h?, ?r? foi adicionada a 5 e o resultado é ?w? etc.) ? note o uso cíclico dos valores da chave. Escreva um método estático codificaCésar na classe Criptografia que implemente o algoritmo de César modificado, recebendo duas strings como argumento: a primeira será a string a ser criptografada e a segunda será a chave. Esse método deverá retornar outra instância da classe String correspondendo ao primeiro argumento, criptografado. Esse método deve considerar que somente as letras não-acentuadas devem ser criptografadas; as letras acentuadas, números, espaços e outros símbolos devem continuar como estão. Escreva também o método decodificaCésar, que também recebe duas strings como argumentos e retorna a string decodificada.
e o que eu fiz é isso:
public class Criptografia {
public static String codificacacao(String passwd, String chave) throws Exception
{
int i=0;
int[] numSenha = new int[passwd.length()];
int[] numChave = new int[passwd.length()];
int[] contador = new int[passwd.length()];
int[] rot = new int[passwd.length()];
String aChar="";
// O while irá incrementar a string chave de acordo com a quantidade de letra da variável passwd.
while(chave.length()!=passwd.length())
{
i=0;
do
{
chave += chave.charAt(i);
i++;
}while(i!=chave.length() && chave.length()!=passwd.length());
}
// Esse for irá adicionar o numero de cada letra contida na palavra passwd e da senha
for(i=0; i<passwd.length(); i++)
{
contador[i]=0;
rot[i]=0;
if(passwd.charAt(i)>=65 && passwd.charAt(i)<=90)
{
numSenha[i] = passwd.charAt(i);
}
numChave[i] = chave.charAt(i);
}
// Esse for com while irá verificar quantas vezes a numChave[i] é maior que numSenha[i]
for(i=0; i<passwd.length(); i++)
{
while(numChave[i]>numSenha[i])
{
numSenha[i]++;
contador[i]++;
System.out.println(contador[i]);
}
}
// Esse for vai trocar as letras
for(i=0; i<passwd.length(); i++)
{
rot[i]= passwd.charAt(i) + contador[i];
}
// Esse for vai passar para caractere;
for(i=0; i<passwd.length(); i++)
{
aChar = new Character((char)rot[i]).toString();
}
return aChar;
}
import java.util.*;
public class Main extends Criptografia{
public static void main(String[] args) {
try
{
Scanner sc = new Scanner(System.in);
String passwd="";
String chave="";
String valida="";
System.out.println("Entre com a senha: ");
passwd= sc.nextLine();
do
{
System.out.println("Entre com a chave(somente 'A' à 'Z'): ");
chave = sc.nextLine();
for(int i=0; i<chave.length();i++)
{
if(chave.charAt(i)>=65 && chave.charAt(i)<=90)
{
valida += chave.charAt(i);
}
}
}while(chave.length()!=valida.length());
System.out.println("");
System.out.println("A codificacação é:");
System.out.println(codificacacao(passwd, chave));
System.out.println("");
System.out.println("A decodificacação é:");
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
Está certo a parte dos FORs, Whiles?
Muito Obrigado
Att, André
