Boa noite computeros, cá estou eu depois de chegar de mais uma prova (dessa vez eu fui bem, muito bem, 2 em dois pontos), o assunto: Socket, Thread e criptografia…

Tudo a ver né huahuahuahuha, o que importa é que o exercício foi bacana e eu achei de postar pra vocês aqui…

Agora vamos ao que interessa, os fontes…

/*
 * ============================================================
 * Lucas Felix de Sousa - 736627
 * Avaliação Parcial de Técnicas de Programação II - A
 * Universidade Cruzeiro do Sul
 * http://blog.computero.com.br
 * =============================================================
 *
 * Classe com implementação de Thread, comunicação client-server
 * Utilização de Criptografia, Socket e Thread
 *
 * =============================================================
 * */

import java.io.*;
import java.net.*;
import java.util.*;

public class ServerCrypt extends Thread{
	private static Vector clientes;
	private Socket conexao;

	public ServerCrypt(Socket s){
    	conexao = s;
    }

	/*Método para criptografar um texto qualquer,
	 * passando como parâmetro a mensagem em string
	 * e a chave em inteiro
	 */
	public static String Crypt(String msg,int n){
		String newMsg="";

		/*for para deixar os caracteres ao contrario
		 * exemplo:
		 * aeiou - uoiea
		 */
		for (int i=msg.length()-1;i>=0;i--)
		{
			/*somar a quantidade de digitos (n) ao char*/
			newMsg += "" + (char)(msg.charAt(i)+n);
		}
		//retornando a mensagem criptografada
		return(newMsg);
	}	

	/*Método para desciptografar a criptografia anterior
	 * passando como parâmetro a mensagem a ser descriptografada em String
	 * e a chave em inteiro
	 */
	public static String Descrypt(String msg,int n){
		String newMsg="";
		/*for para deixar os caracteres de volta ao normal
		 * exemplo:
		 * uoiea - aeiou
		 */
		for (int i=msg.length()-1;i>=0;i--)
		{
			/*subtrair a quantidade de digitos (n) ao char*/
			newMsg += "" + (char)(msg.charAt(i)-n);
		}
		return newMsg;
	}

	public static void main(String args[]){
    	clientes = new Vector();
    	try{
    		ServerSocket s = new ServerSocket(6666);
    		while(true){
    			System.out.print("Esperando alguem se conectar...");
    			Socket conexao = s.accept();
   				System.out.println(" Conectou!");
   				Thread t = new ServerCrypt(conexao);
    			t.start();
    		}
    	}
    	catch(IOException e){
    	}
    }

	public void run(){
    	try{
    		//para receber os dados dos clientes
    		BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));

    		//para enviar os dados para os clientes
   			PrintStream saida = new PrintStream(conexao.getOutputStream());

   			//texto padrão ao cliente se conectar
   			String texto = "
Cliente" + conexao.getInetAddress() + " - " + conexao.getInetAddress().getHostName() + " tenta se comunicar
";
       		System.out.println(texto + "
Pronto para o envio dos dados...
");
       		try{
       			while(true)
       			{
       				String strCliente[] = entrada.readLine().toString().split(";"); 

       				/*verifica se os dados enviados pelo cliente estão em 3 parâmetros
       				 * opção - crypt ou descrypt (IgnoreCase)
       				 * num - Um digito inteiro entre 0 e 9
       				 * mensagem - uma string com QUALQUER texto, inclusive espaços
       				 */
       				if (strCliente.length != 3)
       				{
       					saida.println("Formato inválido. [OPCAO;NUM;MENSAGEM]");
       				}
       				else
       				{
       					try{
       						int num;
       						num = Integer.parseInt(strCliente[1]);

       						/*O número digitado é mudado de acordo com a tabela a seguir:
       						 * num: 0 ou 1 --> A = B (soma 1)
       						 * num: 2 ou 3 --> A = C (soma 2)
       						 * num: 4 ou 5 --> A = D (soma 3)
       						 * num: 6 ou 7 --> A = E (soma 4)
       						 * num: 8 ou 9 --> A = F (soma 5)
       						 */

       						if ((num == 0) || (num==1)){
       							num = 1;
       						}
       						else if ((num == 2) || (num==3)){
       							num = 2;
       						}
       						else if ((num == 4) || (num==5)){
       							num = 3;
       						}
       						else if ((num == 6) || (num==7)){
       							num = 4;
       						}
       						else if ((num == 8) || (num==9)){
       							num = 2;
       						}
       						else{
       							saida.println("Formato do número inválido");
       						}
       						/*Verifico qual a opção desejada pelo cliente e devolvo a resposta*/
       						if (strCliente[0].equalsIgnoreCase("CRYPT")){
           						saida.println(
           									Crypt(
           										strCliente[2],
           										num
           										)
           									);
           					}
           					else if(strCliente[0].equalsIgnoreCase("DESCRYPT")){
           						saida.println(
       									Descrypt(
       										strCliente[2],
       										num
       										)
       									);
           					}
           					else{
           						saida.println("Comando inválido, somente [Crypt] e [Descrypt]");
           					}
       					}
       					catch(Exception e)
       					{
       						saida.println("Erro ao converter a chave");
       					}
       				}
       			}
       		}
       		catch(Exception ex){
       		}
    	}
    	catch(IOException e){
    		System.out.println("IOException: " + e);
    	}
    }
}
/*
 * ============================================================
 * Lucas Felix de Sousa - 736627
 * Avaliação Parcial de Técnicas de Programação II - A
 * Universidade Cruzeiro do Sul
 * http://blog.computero.com.br
 * =============================================================
 *
 * Classe com implementação de Thread, comunicação client-server
 * Utilização de Criptografia, Socket e Thread
 *
 * =============================================================
 * */

import java.io.*;
import java.net.*;

public class ClientCrypt extends Thread{
	private Socket conexao;
  	//private static boolean done = false;

  	public ClientCrypt(Socket s) {
  		conexao = s;
 	}

  	public static void main(String args[]){
  		try{
  			/*indico a qual computador ele vai se conectar e a qual porta
  			 * lembrando que é recomendável utilizar portas maiores que 1000
  			 * pois as anteriores são reservadas ao Sistema Operacional
  			 */
  			Socket conexao = new Socket("localhost", 6666);

  			Thread t = new ClientCrypt(conexao);
   			//iniciando a Thread e chamando o método run()
  			t.start();
  		}
  		catch(IOException e){
  			System.out.println("IOException: " + e);
  		}
  	}

  	public void run(){
  		try{
  			//receber os dados do servidor
  			BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
  			//receber os dados do teclado
  			BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
  			//enviar dados para o servidor
  			PrintStream saida = new PrintStream(conexao.getOutputStream());

  			while (true)
  			{
  				/*Exemplo de utilização:
  				 * Criptografar:
  				 * crypt;7;http://computero.com.br
  				 * Descriptografar:
  				 * descrypt;7;vf2qsg2svixytqsg2kspf33>txxl
  				 */

  				System.out.println("Envie a mensagem para o servidor no seguinte formato: [OPCAO;NUM;MENSAGEM], ou FIM para sair");
	  			String str = teclado.readLine();

	  			//se for fim saio do loop
	  			if (str.equalsIgnoreCase("FIM"))
	  			{
	  				break;
	  			}
	  			else
	  			{
	  				//senão envio pro servidor e obtenho a resposta
	  				saida.println(str);
					System.out.println("Resposta: " + entrada.readLine() + "
");
	  			}
  			}
  		}
  		catch(IOException e){

  		}
  	}
}

Utilização no cliente:

Opção: Crypt ou Descrypt

Num: Números de 0 a 9

Texto: qualquer texto

Exemplo de utilização:

  • Criptografar:

crypt;7;http://computero.com.br

  • Descriptografar:

descrypt;7;vf2qsg2svixytqsg2kspf33>txxl
Os dois arquivos estão comentados, portanto, qualquer dúvida, já sabem… comentem!