Criptografia

2 respostas
M

E ai pessoal, é o seguinte! to tentando fazer uma função que implemente a criptografia ROT13, é assim! eu recebo uma String, e devo substituir cada caracter pelo valor do caracter + 13, e subtrair 26 caso o resultado seja maior que a última letra.
Por exemplo “abCde” fica “noPqr” e “UVWxyz” fica “HIJklm”, mas só os caracteres não acentuados devem ser modificados(letras acentuadas, números, espaços e outros símbolos devem continuar como estão) e caso a string codificada seja passada de novo pelo programa a String original será mostrada!

No caso eu fiz uma parte de um jeito bem simples e trabalhoso rsrs
no caso to substituindo de A até M pelos caracteres de N até Z ou seja treze posições acima até ai tudo bem ! mas não to conseguindo fazer o inverso, e também não to conseguindo retorna o valor original!

Só o que fiz foi isso, tentei algumas estruturas de seleção mas não deu certo, e também não tenho entendimento sobre array e tals, então tá dificil!!
Se puderem me dar uma mãozinha agradeço!!!

public String criptografia (String palavra){
        for (int cont = 0; cont < palavra.length(); cont++) {
            palavra = palavra.replace("A", "N");
            palavra = palavra.replace("B", "O");
            palavra = palavra.replace("C", "P");
            palavra = palavra.replace("D", "Q");
            palavra = palavra.replace("E", "R");
            palavra = palavra.replace("F", "S");
            palavra = palavra.replace("G", "T");
            palavra = palavra.replace("H", "U");
            palavra = palavra.replace("I", "V");
            palavra = palavra.replace("J", "W");
            palavra = palavra.replace("K", "X");
            palavra = palavra.replace("L", "Y");
            palavra = palavra.replace("M", "Z");
            palavra = palavra.replace("a", "n");
            palavra = palavra.replace("b", "o");
            palavra = palavra.replace("c", "p");
            palavra = palavra.replace("d", "q");
            palavra = palavra.replace("e", "r");
            palavra = palavra.replace("f", "s");
            palavra = palavra.replace("g", "t");
            palavra = palavra.replace("h", "u");
            palavra = palavra.replace("i", "v");
            palavra = palavra.replace("j", "w");
            palavra = palavra.replace("k", "x");
            palavra = palavra.replace("l", "y");
            palavra = palavra.replace("m", "z");
        }
        return palavra;
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String palavra;
        String palavraCriptografada;
        palavra = JOptionPane.showInputDialog(null, " Digite a palavra ou frase à ser criptografada ", null, JOptionPane.INFORMATION_MESSAGE);
        palavraCriptografada = criptografia(palavra);
        JOptionPane.showMessageDialog(null, " Resultado da Criptografia é " + palavraCriptografada , null, JOptionPane.PLAIN_MESSAGE);

2 Respostas

S

Ola amigo, tudo bem?

Você pode fazer um for para percorrer a palavra e pegar o valor ascii de cada letra. A partir dai, você pode fazer a soma ou subtração do valor ascii de cada letra e obter a resposta. Você encontra o valor ascii com uma simples busca no google, mas vou colocar aqui abaixo para ajudar:

A = 65  ||  a = 97
B = 66  ||  b = 98
C = 67  ||  c = 99
D = 68  ||  d = 100
E = 69  ||  e = 101
F = 70  ||  f = 102
G = 71  ||  g = 103
H = 72  ||  h = 104
I = 73  ||  i = 105
J = 74  ||  j = 106
K = 75  ||  k = 107
L = 76  ||  l = 108
M = 77  ||  m = 109
N = 78  ||  n = 110
O = 79  ||  o = 111
P = 80  ||  p = 112
Q = 81  ||  q = 113
R = 82  ||  r = 114
S = 83  ||  s = 115
T = 84  ||  t = 116
U = 85  ||  u = 117
V = 86  ||  v = 118
W = 87  ||  w = 119
X = 88  ||  x = 120
Y = 89  ||  y = 121
Z = 90  ||  z = 122

A partir dai é só fazer simples contas a partir de cada letra que você consegue fazer a conversão.
Segue código de exemplo para te ajudar.

public String rot13(String entrada) {
		String saida = new String();
		
		// Vars
		int asc = 0; // Utilizada para obter o valor ascii de cada letra
		boolean upper = false; // Utilizada para dizer se e maiuscula ou nao
		
		for (int i = 0; i < entrada.length(); i++) {
			
			// Reinicia as variaveis
			asc = 0;
			upper = false;
			
			// Verifica se a letra e maiuscula ou nao
			upper = Character.isUpperCase(entrada.charAt(i));
			
			// Obtem o valor ascii de cada letra
			asc = entrada.charAt(i);
			
			if (upper) {
				asc = asc - 64;
			} else {
				asc = asc - 96;
			}
			
			// Verifica se vamos somar 13 ou subtrair o valor ascii de 26
			if (asc <=13 ) {
				asc += 13;
			} else {
				asc = 26 - asc;
			}
			
			// Converte o valor ascii obtido em letra novamente
			if (upper) {
				saida = saida + (char)(asc + 64);
			} else {
				saida = saida + (char)(asc + 96);
			}
		}
		return saida;
	}

Espero que ajude.
Valeu.

M

Nossa, ajudou muito!!
Muito obrigado meu amigo!!!

Criado 31 de agosto de 2014
Ultima resposta 31 de ago. de 2014
Respostas 2
Participantes 2