Ajuda com Cifra de César

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>

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

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?

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

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

[code]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);[/code]

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?

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 ?

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

[quote=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 ?[/quote]

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

O problema é que está criptografando errado agora

Enfim:

[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

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

Sou iniciante em java.

[quote=LucasAdri07]O problema é que não consegui entender o algoritmo :confused:

Sou iniciante em java.[/quote]

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

Eu que fiz aquele algorítmo mesmo.

Outro que considero engenhoso é esse de esteganografia:

O fonte está escondido na logo do GUJ.

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

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

Bom consegui resolver.

A criptografia ficou assim:

[code]

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!”);
}[/code]

E a descriptografia:

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