How to do Cifra de cesar

Asked

Viewed 3,158 times

-2

When colo (ABCDE) with displacement 5 he encrypts (FGHIJ), when actually it should be (EFGHI). I’ve tried everything I can not solve. In case he’s making the next shift to my input.

package cifracesar;

import java.util.Scanner;

public class Cifracesar {

public static String encriptar(int chave, String texto) {
    StringBuilder textoCifrado = new StringBuilder();
    int tamanhoTexto = texto.length();

    for (int c = 0; c < tamanhoTexto; c++) {
        int letraCifradaASCII = ((int) texto.charAt(c)) + chave;

        while (letraCifradaASCII > 126) {
            letraCifradaASCII -= 94;
        }

        textoCifrado.append((char) letraCifradaASCII);
    }

    return textoCifrado.toString();
}

public static String decriptar(int chave, String textoCifrado) {
    StringBuilder texto = new StringBuilder();
    int tamanhoTexto = textoCifrado.length();

    for (int c = 0; c < tamanhoTexto; c++) {
        int letraDecifradaASCII = ((int) textoCifrado.charAt(c)) - chave;

        while (letraDecifradaASCII < 32) {
            letraDecifradaASCII += 94;
        }

        texto.append((char) letraDecifradaASCII);
    }

    return texto.toString();
}

public static void main(String[] args) {

    try {
        Scanner entrada = new Scanner(System.in);

        System.out.println("*****************************************************");

        System.out.print("Informe o texto a ser criptografado: ");
        String texto = entrada.nextLine();
        System.out.print("Informe a chave de deslocamento: ");
        int chave = entrada.nextInt();

        String textoCriptografado = encriptar(chave, texto);
        String textoDescriptografado = decriptar(chave, textoCriptografado);

        System.out.println("\n\nTEXTO CRIPTOGRAFADO: " + textoCriptografado);
        System.out.println("TEXTO DESCRIPTOGRAFADO: " + textoDescriptografado);

        System.out.println("*****************************************************");

    } catch (RuntimeException e) {
        System.out.println("A chave de deslocamento foi informada incorretamente.");
        System.out.println("Execute o programa novamente e entre com uma chave valida.");
    }

}
}

1 answer

2


You should consider that the indexes start at 0 and not at 1. So, if the desired shift key is 5, the number used to shift the character should be 4. Change the following line of the method encriptar:

...
int letraCifradaASCII = ((int) texto.charAt(c)) + chave;
...

To:

...
int letraCifradaASCII = ((int) texto.charAt(c)) + (chave - 1);
...

And the method decriptar:

...
int letraDecifradaASCII = ((int) textoCifrado.charAt(c)) - chave;
...

To:

...
int letraDecifradaASCII = ((int) textoCifrado.charAt(c)) - (chave - 1);
...
  • 1

    Man, thanks for thinking so much, but I forgot about the vlw index.

  • 1

    Usually in the Cezar cipher, z map to a with key 1. I also believe it is not necessary to cast the character for integer

Browser other questions tagged

You are not signed in. Login or sign up in order to post.