Problema Criptografia - VIGENERE

Boa noite pra todos.

Tenho um problema que ja ta me deixando sem cabelo, não aguento mais mexer nesse código e não dar resultado … olha o que eu preciso :

Cifra de Vigenere :

Suponhamos que o cara digite “MATEMATICA” e “BRASIL” como chave , o programa tem que criptogrfar a palavra ‘‘matematica’’ de acordo com a chave ‘‘Brasil’’ de acordo com o codigo de Vigenere.

B R A S I L B R A S
M A T E M A T I C A

MENSAGEM CRIPTOGRAFADA: NRTWULUZCS = matematica.

Exemplo e como funciona vigenere: http://www.numaboa.com.br/criptologia/brinca/vigenere.php

É um trabalho de faculdade que o professor mando fazer, keria saber pelo menos a logica do programa, como cifra e decifra a palavra de acordo com vigenre, sem mta complicacoes msm pois eh primeiro semestre de ‘‘logica de programacao’’ com base em java. o programa tem q ser em java e n por javascript, abraço. Marcus - Fortaleza-ce

Eu não conheço esse método mas tenta algo assim,
Pega a palavra a ser criptografada e a palavra chave

pegue o char[] deles palavra.toCharArray();
de um for que some os valores do char em um terceiro char[] depois transforme esse terceiro na palavra criptografada.

=/
Eu fiquei curioso entrei no link e vi que é bem diferente do que fiz, não tenho ideia do que fazer.

[quote=marcuss]Boa noite pra todos.

Suponhamos que o cara digite “MATEMATICA” e “BRASIL” como chave , o programa tem que criptogrfar a palavra ‘‘matematica’’ de acordo com a chave ‘‘Brasil’’ de acordo com o codigo de Vigenere.
B R A S I L B R A S
M A T E M A T I C A
MENSAGEM CRIPTOGRAFADA: NRTWULUZCS = matematica.
[/quote]

Vamos lá…vou tentar ajudar…

1 - Crie o quadrado de Vigenère com um array de chars. Aqui vc pode criar o quadro de forma “mais inteligente” utilizando loops varrendo os caracteres A-Z e deslocando os caracteres para cada linha :wink: .

        char[][] quadradoVigenere = new char[26][];
        
       quadradoVigenere[0] = new char[] {'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'};
       quadradoVigenere[1] = new char[] {'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'};
       quadradoVigenere[2] = new char[] {'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'};
       quadradoVigenere[3] = new char[] {'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'};
       quadradoVigenere[4] = new char[] {'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'};
       .......
       quadradoVigenere[25] = new char[] {'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'};

2- Para cada letra da palavra a ser criptografada localize o alfabeto que será utilizado para cifrar cada letra.

palavra - chave - alfabeto
M - B - 1 (indice do array)
A - R - 17
T - A - 0
E - S - …
M - I
A - L
T - B
I - R
C - A
A - S

Código abaixo criptografa utilizando o quadro.


        char [] palavra = "MATEMATICA".toCharArray();
        char [] chave =   "BRASILBRAS".toCharArray();
        char [] palavraCript = new char[palavra.length];
        
        for(int c = 0; c<chave.length; c++) {
            for(int i=0; i<quadradoVigenere.length; i++) {
                if(quadradoVigenere[i][0] == chave[c]) {
                    System.out.println("Alfabeto utilizado para criptografar letra -> " +i);
                    palavraCript[c] = quadradoVigenere[i][((int)palavra[c]-65)]; //65 é o código da letra 'A' (ou seja letra 'A' é indice 0 (65 -65))
                }
            }
        }

         System.out.println("Palavra criptografada: " + String.valueOf(palavraCript));

Fica para vc a decriptografia, que é bem parecido com a criptografia, basta vc localizar o alfabeto utilizado para criptografar (com a chave), localizar o indice da letra (da palavra criptografada) neste alfabeto e obtenha a letra da palavra original no alfabeto normal (de indice ZERO).

Falow

Eu sei que se passou uma semana mas hoje me bateu a curiosidade de como fazer e fui fazer^^

É façil se você analizar a tabela de Vigenere.
A resultado da letra a ser criptografada é o seu valor original mais o valor da letra chave menos 97 (valor do caractere ‘A’).
Isso agora na era da computação, queria ver como conseguiam ficar com um monte de tabela naquela época^^
Aqui vai o que fiz, sem a descriptografia(To fazendo)
PS: O meu código também funciona com letras minusculas, só não usem espaçospois senão os resultados não ficam muito bonitos^^
Post abaixo tem o novo código

mto obrigado bombr e mark pela ajuda =) problema resolvido =D

Eu fiz mais testes ontem e vi que não da certo onde a soma das letras seja maior que ‘z’ ou ‘Z’
^^
Mas já to trabalhando nisso eu acho que vou usar isso na criptografia das senhas do meu programa^^

Perfeito^^
agora funciona e quem quiser ta ai o código

A tabela para comparar se está certo:

Não use minusculas nem letras acentuadas

public class Vigenere {
	public String getCompatibleKey(String key, String word) {
		if (key.length() < word.length()) {
			StringBuilder sb = new StringBuilder();
			int pos = 0;
			char[] keyWord = key.toCharArray();
			for (int i = 0; i < word.length(); i++) {
				if (pos == key.length())
					pos = 0;
				sb.append(keyWord[pos]);
				pos++;
			}
			return sb.toString();
		}
		return key;
	}

	private char getVigenereCriptChar(char key, char word) {
		if ((int) word == 32)
			return word;
		boolean upperCase = (key >= 'A');
		int keyValue = key - (upperCase ? 'A' : 'a');

		if ((word + keyValue) > (upperCase ? 'Z' : 'z')) {
			int rest = (word + keyValue) - (upperCase ? 'Z' : 'z');
			return (char) (((upperCase ? 'A' : 'a') + --rest));
		}

		return (char) (word + keyValue);
	}

	private char getVigenereDescriptChar(char key, char word) {
		if ((int) word == 32)
			return word;
		boolean upperCase = (key >= 'A');
		int keyValue = key - (upperCase ? 'A' : 'a');
		if ((word - keyValue) < (upperCase ? 'A' : 'a')) {
			int rest = word - (upperCase ? 'A' : 'a');
			return (char) ((upperCase ? 'A' : 'a') + ++rest);
		}
		return (char) (word - keyValue);
	}

	public String getCriptedWord(String key, String word) {
		if (key.length() < word.length())
			key = getCompatibleKey(key, word);

		char[] keyChars = key.toCharArray();
		char[] wordChars = word.toCharArray();
		StringBuilder criptWord = new StringBuilder();

		for (int i = 0; i < wordChars.length; i++)
			criptWord.append(getVigenereCriptChar(keyChars[i], wordChars[i]));

		return criptWord.toString();
	}

	public String getDescriptedWord(String key, String criptedWord) {
		if (key.length() < criptedWord.length())
			key = getCompatibleKey(key, criptedWord);

		char[] keyChars = key.toCharArray();
		char[] wordChars = criptedWord.toCharArray();
		StringBuilder descriptWord = new StringBuilder();

		for (int i = 0; i < wordChars.length; i++)
			descriptWord.append(getVigenereDescriptChar(keyChars[i],
					wordChars[i]));

		return descriptWord.toString();
	}

	public static void main(String[] args) {
		Vigenere vig = new Vigenere();
		String key = "XYZ", word = "XYZ";
		String criptedWord = vig.getCriptedWord(key, word);
		System.out.println(criptedWord);
		String originalWord = vig.getDescriptedWord(key, criptedWord);
		System.out.println(originalWord);
	}
}

Boa noite Pessoal, eu estou fazendo um trabalho em java justamente sobre a cifra de cesar e de vigenere, o meu codigo terá que cifrar uma palavra usando a cifra de cesar e o resultado deverá ser cifrado usando o vigenere e depois armazenar isso num banco de dados… O meu problema é que a decriptografia do codigo do Mark_Ameba num tah funfando, fiz varios testes aqui e a decriptografia estah com algum erro que naum consigo resolver… será que alguém pode ajudar??

Nossa nem lembrava que fiz aquilo…

Mas voce ta criptografando de um jeito e descriptografando de outro jeito?
Ai nao da certo mesmo.

Ou voce ta usando o método criptografar/descriptografar que fiz?
até onde lembro(quase nada) isso funcionava.

Mark_Ameba, eu estou usando o método do jeitinho que você fez… ele criptografa certinho mais na hora de fazer a decriptografia dá alguns erros, se a chave tiver caracteres acima da letra H começa a dar erros, testando com a chave e a palavra iguais funciona, como foi o seu teste no código: “XYZ”… meus conhecimentos em JAVA são básicos e bem limitados, por exemplo, dentro do código, em varios lugares tem: ? ‘A’ : ‘a’, o que isso faz? qual a função do ? e ‘A’ no JAVA??
Vê se vc consegue me ajudar aih…

Abrassss

E aih galera, alguém tem mais alguma sugestão de como resolver isso?? Abrasss

int keyValue = key - (upperCase ? 'A' : 'a');

Isso é a mesma coisa que isso:

int keyValue = key;
if(upperCase)
 keyValue -= 'A';
else
 keyValue-= 'a';

Fiz deste modo para que o modo de criptação funcionasse com letras maiusculas e minusculas…
um char(que fica entre aspas simples), tem seu valor matematico como um inteiro… por isso usei eles para fazer as contas.

Tudo bem que eu repeti essa expressao varias vezes dificultando a leitura. Mas a lógica esta certa.
E realmente o código não funciona… mas acho que não esta muito dificil concertar.