Ajuda com Cifra de César

17 respostas
LucasAdri07

Olá pessoal, estou com um problema e não estou conseguindo encontrar uma solução.

Tenho o seguinte código para realizar a criptografia de César:

private void btDescriptografarActionPerformed(java.awt.event.ActionEvent evt) { String palavra; int cifra; palavra = txtPalavra.getText(); cifra = Integer.parseInt(txtChave.getText()); if(palavra.equals("") || cifra != 0){ int i, num = palavra.length(); String vaz = ""; for (i=0; i<num; i++) { vaz = vaz + (char)(palavra.charAt(i) - cifra); lblDes.setText(vaz); } }else{ JOptionPane.showMessageDialog(null, "Complete os campos!"); } // TODO add your handling code here: }
Ele está criptografando como desejo, por exemplo se coloco a palavra lucas e uma cifra de número 3 ele me retorna o valor de oxfdv.

O problema é por exemplo se coloco a letra z e coloco cifra 2 ele vai me exibir um caractere, no caso | e eu preciso que ele exiba o B, sendo assim ele tem de voltar a contagem pro A.

Gostaria de saber se alguem tem alguma solução.

O erro está ocorrendo com a descriptografia também, se coloco por exemplo A e uma cifra 3 para descriptografar ele me exibi um caractere também, sendo que era pra exibir a letra x.

Grato, Lucas>

17 Respostas

Rodrigo_Sasaki

porque você não cria um array só com os caracteres que quer, e manipula pelo índice?

LucasAdri07

Pensei em usar algo do tipo como String alfabeto = new StringBuffer("abcdefghijklmnopqrstuvwxyz"); só que acabou ficando mais facil fazer do modo que postei. Será que é melhor usar um array então?

Rodrigo_Sasaki

Qualquer tipo de estrutura de dados onde você consiga resgatar valores por índice, e consiga definir os caracteres que deseja.

Lembre-se que tem que tratar a ida do final para o começo, e vice-versa

LucasAdri07

Estou tentando fazer desse modo mas a criptografia está saindo errada:

String texto;
    int cifra;
           char alfabeto[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
                             'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
                             'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
                             'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    int tamAlfabeto = 26;
    
    texto = txtPalavra.getText();
    cifra = Integer.parseInt(txtCifra.getText());
    
     if (cifra >= tamAlfabeto) {
            cifra = cifra % tamAlfabeto;
        }
 
        char textoarray[] = texto.toCharArray(); 
 
        for (int i = 0; i < textoarray.length; i++){
            for (int j = 0; j < tamAlfabeto; j++){
                if (textoarray[i] == alfabeto[j]) {
                    textoarray[i] = alfabeto[j+cifra];
                    break;
                }
            }
        }
        
        lblDesc.setText("Texto criptografado: " + textoarray);
ViniGodoy

Use o operador de resto.

Observe:
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2

Isso não te dá nenhuma idéia?

Rodrigo_Sasaki

Lucas, por que você adicionou 2x as letras no array?

e Vini… sinceramente fiquei confuso… tem como você explicar um pouco mais sobre como resolver dessa forma ?

ViniGodoy

Enquanto eu postava, ele colocou uma nova versão do algorítmo que usa o que sugeri.

LucasAdri07

digaoneves:
Lucas, por que você adicionou 2x as letras no array?

e Vini… sinceramente fiquei confuso… tem como você explicar um pouco mais sobre como resolver dessa forma ?

o alfabeto está repitido pois se a letra ‘z’ precisar de deslocamento, não irá conseguir pois não haveria casas depois do z.

LucasAdri07

O problema é que está criptografando errado agora

ViniGodoy

Enfim:

Rodrigo_Sasaki

[quote=ViniGodoy]Enfim:

Barbaridade, cara… hahahahaha…

demorei pra entender esse algoritmo, pra ver o quanto ele é prático.
Realmente, se foi você quem implementou isso, tiro o chapéu! rs

LucasAdri07

O problema é que não consegui entender o algoritmo :confused:

Sou iniciante em java.

Rodrigo_Sasaki

LucasAdri07:
O problema é que não consegui entender o algoritmo :confused:

Sou iniciante em java.

eu tive que debugar ele passo a passo pra entender hehehe… com valores diferentes ainda

ViniGodoy

Eu que fiz aquele algorítmo mesmo.

Outro que considero engenhoso é esse de esteganografia:

O fonte está escondido na logo do GUJ.

LucasAdri07

Achei essa solução…

palavra = txtPalavra.getText(); cifra = Integer.parseInt(txtChave.getText()); if(palavra.equals("") || cifra != 0){ int i, num = palavra.length(); String vaz = ""; for (i=0; i<num; i++) { int xis = palavra.charAt(i) + cifra; if (xis > 'z' && palavra.charAt(i)>= 97 && palavra.charAt(i) <= 122 ) /* pega o alfabeto pela tabela ASCII que vai de a até z */ { xis = 'a' + (xis - 'z' - 1); } if (xis > 'Z' && palavra.charAt(i)>= 65 && palavra.charAt(i) <= 90 ) /* pega o alfabeto pela tabela ASCII que vai de A até Z */ { xis = 'A' + (xis - 'Z' - 1); } vaz = vaz + (char)(xis); lblCrip.setText(vaz); } }else{ JOptionPane.showMessageDialog(null, "Complete os campos!"); } }

Porém com o botão de descriptografar não resolve a solução.

Meu código para descriptografar ficou assim:

palavra = txtPalavra.getText(); cifra = Integer.parseInt(txtChave.getText()); if(palavra.equals("") || cifra != 0){ int i, num = palavra.length(); String vaz = ""; for (i=0; i<num; i++) { int xis = palavra.charAt(i) - cifra; if (xis < 'a' && palavra.charAt(i)>= 97 && palavra.charAt(i) <= 122 ) /* pega o alfabeto pela tabela ASCII que vai de a até z */ { xis = 'z' - (xis + 'z' + 1); } if (xis < 'A' && palavra.charAt(i)>= 65 && palavra.charAt(i) <= 90 ) /* pega o alfabeto pela tabela ASCII que vai de A até Z */ { xis = 'Z' - (xis + 'Z' + 1); } vaz = vaz + (char)(xis); lblDes.setText(vaz); } }else{ JOptionPane.showMessageDialog(null, "Complete os campos!"); } }

Não consegui entender porque ele continua me dando caracteres quando passo uma cifra e uma letra que me de um valor menor que A ou a

LucasAdri07

Nossa, ja inverti de todos os jeito os sinais para ver se funciona a descriptografia e de jeito nenhum vai…

Alguem tem alguma idéia?

Grato, Lucas

LucasAdri07

Bom consegui resolver.

A criptografia ficou assim:

String palavra;
int cifra;
   palavra = txtPalavra.getText(); 
   cifra = Integer.parseInt(txtChave.getText());
   if(palavra.equals("") || cifra != 0){ 
      int i, num = palavra.length();
      String vaz = "";
      for (i=0; i<num; i++) {
        int xis = palavra.charAt(i) + cifra;
        if (xis > 'z' && palavra.charAt(i)>= 97 && palavra.charAt(i) <= 122 ) /* Verifica se o caractere está entre "a" e "z" na tabela ASCII */ {
         xis = 'a' + (xis - 'z' - 1);    
        }
        if (xis > 'Z' && palavra.charAt(i)>= 65 && palavra.charAt(i) <= 90 ) /* Verifica se o caractere está entre "A" e "Z" na tabela ASCII */ {
         xis = 'A' + (xis - 'Z' - 1);    
        }
        vaz = vaz + (char)(xis);
        lblCrip.setText(vaz); 
             }
          }else{ 
JOptionPane.showMessageDialog(null, "Complete os campos!");
        }

E a descriptografia:

String palavra;
int cifra;
palavra = txtPalavra.getText(); 
   cifra = Integer.parseInt(txtChave.getText());
   if(palavra.equals("") || cifra != 0){ 
      int i, num = palavra.length();
      String vaz = "";
      for (i=0; i<num; i++) {
        int xis = palavra.charAt(i) - cifra;
        if (xis >< 'a' && palavra.charAt(i)>= 97 && palavra.charAt(i) <= 122 ) /* Verifica se o caractere está entre "a" e "z" na tabela ASCII */ {
         xis = 'z' - ('a' - xis - 1);    
        }
        if (xis < 'A' && palavra.charAt(i)>= 65 && palavra.charAt(i) <= 90 ) /* Verifica se o caractere está entre "A" e "Z" na tabela ASCII */ {
         xis = 'Z' - ('A' - xis - 1);    
        }
        vaz = vaz + (char)(xis);
        lblDes.setText(vaz);
             }
          }else{ 
JOptionPane.showMessageDialog(null, "Complete os campos!");
        }
Criado 27 de abril de 2012
Ultima resposta 9 de mai. de 2012
Respostas 17
Participantes 3