[Resolvido]O que estou errando neste exercício de Criptografia?[Resolvido]

7 respostas
A

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;
	}
******************* E a Main ************************************
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é

7 Respostas

LucasAdri07

Estava com o mesmo problema há alguns dias atrás…

http://guj.com.br/java/271548-ajuda-com-cifra-de-cesar/2

A

LucasAdri07:
Estava com o mesmo problema há alguns dias atrás…

http://guj.com.br/java/271548-ajuda-com-cifra-de-cesar/2

Obrigado pela reposta, mas

estou precisando saber o que estou errando, pois já revisei a lógica várias vezes e por mim está tudo certo…

Eu posso fazer um vetor de contador? Dá certo isso?

Att, André Vieira

KamikazeBr

Olá. Testei seu código. Bem pelo que percebi primeiramente deve-se usar a senha e a chave em MAIUSCULOS, caso contrário tem inconsistencias na criação de um dos “for’s” que faz essa verificação.

Sua lógica não está incorreta ao todo, penso que o fato por não ter a saída esperada é o conceito da Cifra de Cesar realizar um loop. Antes de explicar isso vejamos o código:

1- Linha 51 da sua classe Criptografia:

aChar = new Character((char)rot[i]).toString();

Em vez disso falta uma concatenação (sinal +) de char’s devendo ficar assim:

aChar += new Character((char)rot[i]).toString();

2 - Linha 36 da sua classe Criptografia:

while(numChave[i]&gt;numSenha[i])

Vemos aqui uma comparação de maior, mas…

http://pt.wikipedia.org/wiki/Cifra_de_César

Observe que no exemplo, se temos uma letra X (ascii 88 ) e avançamos 3 "casas" ela deverá se tornar A(ascii 65), portanto [i]numChave contém uma parte da sua chave em codigo ascii no meu exemplo de 3 casas então ela seria a letra C (ascii 67) em seguida temos [i]numSenha que seria a parte correspondente que deve ser criptografada minha letra X (ascii 88 ) ou avançada a quantidade de casas que a chave determina…ops…

Debug on the table…

while (67 &gt; 88)

No Wikipedia temos até uma formula de como proceder.

Deixarei que tu pense o restante.

Qualquer dúvida poste.
Até+

A

KamikazeBr:
Andr?de Souza Vieira:

Obrigado pela reposta, mas

estou precisando saber o que estou errando, pois já revisei a lógica várias vezes e por mim está tudo certo…

Eu posso fazer um vetor de contador? Dá certo isso?

Att, André Vieira

Olá. Testei seu código. Bem pelo que percebi primeiramente deve-se usar a senha e a chave em MAIUSCULOS, caso contrário tem inconsistencias na criação de um dos “for’s” que faz essa verificação.

Sua lógica não está incorreta ao todo, penso que o fato por não ter a saída esperada é o conceito da Cifra de Cesar realizar um loop. Antes de explicar isso vejamos o código:

1- Linha 51 da sua classe Criptografia:

aChar = new Character((char)rot[i]).toString();

Em vez disso falta uma concatenação (sinal +) de char’s devendo ficar assim:

aChar += new Character((char)rot[i]).toString();

2 - Linha 36 da sua classe Criptografia:

while(numChave[i]&gt;numSenha[i])

Vemos aqui uma comparação de maior, mas…

http://pt.wikipedia.org/wiki/Cifra_de_César

Observe que no exemplo, se temos uma letra X (ascii 88 ) e avançamos 3 "casas" ela deverá se tornar A(ascii 65), portanto [i]numChave contém uma parte da sua chave em codigo ascii no meu exemplo de 3 casas então ela seria a letra C (ascii 67) em seguida temos [i]numSenha que seria a parte correspondente que deve ser criptografada minha letra X (ascii 88 ) ou avançada a quantidade de casas que a chave determina…ops…

Debug on the table…

while (67 &gt; 88)

No Wikipedia temos até uma formula de como proceder.

Deixarei que tu pense o restante.

Qualquer dúvida poste.
Até+

Muito Obrigado pela resposta, consegui arrumar aquele meu while estava errado mesmo…
Então com a ajuda de vocês e de uma outra pessoa consegui resolver meu problema…
como consta abaixo…

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()]; String rot = new String(""); String aChar=""; while(chave.length()!=passwd.length()) { i=0; do { chave += chave.charAt(i); i++; }while(i!=chave.length() && chave.length()!=passwd.length()); } for(i=0; i&lt;passwd.length(); i++) { contador[i]=0; numSenha[i] = passwd.charAt(i); numChave[i] = chave.charAt(i); } System.out.println(passwd.length()); for(i=0; i&gt;&lt;passwd.length(); i++) { rot += (char)(numSenha[i] + (numChave[i]-64)); } return rot; }

Esse está corrreto!.. >

KamikazeBr

Infelizmente não está correto.

numSenha[i] + (numChave[i]-64)

Troquemos isso por ascii

88 + ( 67 - 64 ) = ?

Sim 91, fora do faixa de numero A e Z.

No Wikipedia naquela formula voce pode reparar que tem uma palavra na formula chamada MOD

Ate++

PS: Acabou indo duas vezes a mensagem. :frowning:

KamikazeBr

Infelizmente não está correto.

numSenha[i] + (numChave[i]-64)

Troquemos isso por ascii

88 + ( 67 - 64 ) = ?

Sim 91, fora do faixa de numero A e Z.

No Wikipedia naquela formula voce pode reparar que tem uma palavra na formula chamada MOD

Ate++

A
KamikazeBr:
Infelizmente não está correto.

numSenha[i] + (numChave[i]-64)

Troquemos isso por ascii

88 + ( 67 - 64 ) = ?

Sim 91, fora do faixa de numero A e Z.

No Wikipedia naquela formula voce pode reparar que tem uma palavra na formula chamada MOD

http://www.guj.com.br/java/138355-mod--div

Ate++


Agora está certo sim... olha aí...

Entre com a senha: 
XXXX
String recebida:XXXX
Entre com a chave(somente 'A' à 'Z'): 
B

A codificacação é:
ZZZZ

A decodificacação é:
XXXX
*** O código inteiro está aqui ***
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()];
		String rot = new String("");
		while(chave.length()!=passwd.length())
		{
			i=0;
		    do
		    {
		    	chave += chave.charAt(i);
		    	i++;
		    }while(i!=chave.length() && chave.length()!=passwd.length());
		}
		for(i=0; i<passwd.length(); i++)
		{
		    numSenha[i] = passwd.charAt(i);
			numChave[i] = chave.charAt(i);
		}
		for(i=0; i<passwd.length(); i++)
		{
			rot += (char)(numSenha[i] + (numChave[i]-64));  
		}
		return rot;
	}
	public static String deCodificacacao(String passwd, String chave) throws Exception
	{
		String codificado = new String("");
		codificado = codificacacao(passwd,chave);
		int[] numSenha = new int[codificado.length()];
		int[] numChave = new int[codificado.length()];
		String rot = new String("");
		int i=0;
		while(chave.length()!=passwd.length())
		{
			i=0;
		    do
		    {
		    	chave += chave.charAt(i);
		    	i++;
		    }while(i!=chave.length() && chave.length()!=passwd.length());
		}
		
		for(i=0; i<codificado.length(); i++)
		{
		    numSenha[i] = codificado.charAt(i);
			numChave[i] = chave.charAt(i);
		}
		for(i=0; i<passwd.length(); i++)
		{
			rot += (char)(numSenha[i] - (numChave[i]-64));  
		}
		
		return rot;
	}
	
	

}
*** e a MAIN ***
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="";
			String passwdUp="";
			System.out.println("Entre com a senha: ");
			passwd= sc.nextLine();
			passwdUp = passwd.toUpperCase();
			System.out.println("String recebida:"+passwdUp);
			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(passwdUp, chave));
			System.out.println("");
			System.out.println("A decodificacação é:");
			System.out.println(deCodificacacao(passwdUp,chave));
		
		}
		catch(Exception e)
		{
			System.out.println(e.getMessage());
		}
		

	}

}

Obrigado pela atenção!

Criado 16 de maio de 2012
Ultima resposta 17 de mai. de 2012
Respostas 7
Participantes 3