Sockets e criptografia

ai galera…estou tentando fzer um socket usando dados criptografados(utilizo o bouncy castle! soh q tah dando erro da hora d decriptografar e naum to sabendo resolver! alguem ai ajuda???
vo dxa os codigos cliente e servidor ok!?!??!

//class cliente

import java.io.;
import java.net.
;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import java.security.Security;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Cliente {

private static byte[] encrypt(byte[] inpBytes, PublicKey key, String xform) throws Exception {
    Cipher cipher = Cipher.getInstance(xform);
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(inpBytes);
  }
  private static byte[] decrypt(byte[] inpBytes, PrivateKey key, String xform) throws Exception{
    Cipher cipher = Cipher.getInstance(xform);
    cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher.doFinal(inpBytes);
  }
  
public static void main(String args[]) throws Exception
{
	Security.addProvider(new BouncyCastleProvider());
    String xform = "RSA/NONE/PKCS1Padding";
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
    kpg.initialize(512); 
    KeyPair kp = kpg.generateKeyPair();
    PublicKey pubk = kp.getPublic();
    PrivateKey prvk = kp.getPrivate();
	Socket cliente = null;
	
	try
	{
	    cliente = new Socket("127.0.0.1",7000);
	    
	    //envia dados para o servidor
	    DataOutputStream output = new DataOutputStream(cliente.getOutputStream());
	    byte[] sentBytes = "oi".getBytes();
	    byte[] encBytes = encrypt(sentBytes, pubk, xform);
		output.writeInt(encBytes.length);
		System.out.println("Enviado size: " + encBytes.length);
	    output.write(encBytes);
	    System.out.println("Enviado bytes: " + new String(encBytes));
	    
	    //recebe dados do servidor
	    DataInputStream entrada = new DataInputStream(cliente.getInputStream());
	    int size = entrada.readInt();
	    byte[] recvBytes = new byte[size];
	    entrada.read(recvBytes);
	    System.out.println( "Recebido do servidor: " + new String(recvBytes) );
	   
	}
	catch(IOException e)
    {
    	System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
    
    }
	finally
	{
		try
		{
			cliente.close();
		}
		catch(IOException e){}
	}
}

}

//class servidor

import java.io.;
import java.net.
;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import java.security.Security;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Servidor {

     private static byte[] encrypt(byte[] inpBytes, PublicKey key, String xform) throws Exception {
	    Cipher cipher = Cipher.getInstance(xform);
	    cipher.init(Cipher.ENCRYPT_MODE, key);
	    return cipher.doFinal(inpBytes);
	  
	  private static byte[] decrypt(byte[] inpBytes, PrivateKey key, String xform) throws Exception{
	    Cipher cipher = Cipher.getInstance(xform);
	    cipher.init(Cipher.DECRYPT_MODE, key);
	    return cipher.doFinal(inpBytes);
	  }

public static void main(String args[]) throws Exception
{
	Security.addProvider(new BouncyCastleProvider());
    String xform = "RSA/NONE/PKCS1Padding";
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
    kpg.initialize(512); 
    KeyPair kp = kpg.generateKeyPair();
    PublicKey pubk = kp.getPublic();
    PrivateKey prvk = kp.getPrivate();
	ServerSocket server = null;
	Socket cliente = null;

	try
	{
		server = new ServerSocket(7000);
		System.out.println("Aguardando um cliente conectar...");
	    cliente = server.accept();
		System.out.println("Conexão efetuada");
		System.out.println("");
				   

	    //recebe dados do cliente
		DataInputStream entrada = new DataInputStream(cliente.getInputStream());
	    int size = entrada.readInt();
		System.out.println("Recebido size: " + size);
	    byte[] recvBytes = new byte[size];
	    entrada.read(recvBytes);
	    System.out.println("Recebido bytes: " + new String(recvBytes));
		byte[] decBytes = decrypt(recvBytes, prvk, xform);
	    entrada.read(decBytes);
	    System.out.println("Recebido bytes: " + new String(decBytes));
		System.out.println(new String( decBytes));
		

	    //envia dados ao cliente
		DataOutputStream output = new DataOutputStream(cliente.getOutputStream());
	    byte[] sentBytes = ("reply: " + new String(recvBytes)).getBytes();
	    output.writeInt(sentBytes.length);
	    output.write(sentBytes);
	    
	    cliente.close();
	}
		
	catch(IOException e)
		{
      		System.out.println("Algum problema ocorreu para criar ou receber o socket.");
        }
	
		finally
		{
			try
			{
				server.close();
			}
				catch(IOException e)
				{
				}
		}
}

}

vlw

Use SSL, não invente seu método de criptografia via sockets.

O Java tem uma API completa para usar sockets com SSL; nem é preciso usar o BouncyCastle.

no caso preciso usar o bouncy castle…pois to trabalhando num projeto q exige issu! estou começando a brincar com ele soh q naum estou consegindo resolver o problema de decriptografar a mensagem! tem alguma ideia???

o erro eh esse:

Exception in thread “main” javax.crypto.BadPaddingException: unknown block type
at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(DashoA12275)
at Servidor.decrypt(Servidor.java:22)
at Servidor.main(Servidor.java:53)

vlw

Vou repetir a dica que lhe passei: para comunicação segura, use SSL e não se fala mais nisso. Estude SSL e veja como é fácil e seguro usar.

por mim eu usava…soh q trabalho no Laboratorio Nacional de Computaçao Cientifica(LNCC). e po…to comecando a estudar java e criptografia agora pra poder desenvolver um projeto em telemedicina. Os meus coordenadores querem q eu estude boucy castle e tente montar esse programa. Por mim eu usava SSL, soh q po…preciso resolver essa parada! tem cmo ajudar naum???

vlw

Já que você está no LNCC, procure estudar um pouco sobre SSL e pegue o fonte da implementação SSL do JSSE. Você vai ver que há muitos detalhes que devem ser levados em conta para ter uma implementação segura de criptografia usando sockets.

Para isso, você pode baixar os fontes do JDK, arquivo :

http://java.sun.com/j2se/jrl_download.html, siga o link “Download (JRL Source)”
e a seguir baixe o arquivo:

jdk_sec-1_5_0-src-scsl.zip

Lá está a implementação do SSL, que você pode estudar e poder entender como é que usa direito a parte do JCE. O BouncyCastle é só um provedor JCE, portanto o que você vai aprender se aplica também ao BouncyCastle.

Pelo o que eu entendi do seu codigo, voce esta gerando um par de chaves no cliente e outro no servidor? Nao vai dar certo o encrypt e o decrypt usando pares de chaves diferentes. Voce vai ter que ter o mesmo par de chaves no cliente e no servidor. Use Keystore para isto.

[quote=msamartini]ai galera…estou tentando fzer um socket usando dados criptografados(utilizo o bouncy castle! soh q tah dando erro da hora d decriptografar e naum to sabendo resolver! alguem ai ajuda???
vo dxa os codigos cliente e servidor ok!?!??!

//class cliente

import java.io.*;
import java.net.*;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import java.security.Security;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Cliente {

	private static byte[] encrypt(byte[] inpBytes, PublicKey key, String xform) throws Exception {
	    Cipher cipher = Cipher.getInstance(xform);
	    cipher.init(Cipher.ENCRYPT_MODE, key);
	    return cipher.doFinal(inpBytes);
	  }
	  private static byte[] decrypt(byte[] inpBytes, PrivateKey key, String xform) throws Exception{
	    Cipher cipher = Cipher.getInstance(xform);
	    cipher.init(Cipher.DECRYPT_MODE, key);
	    return cipher.doFinal(inpBytes);
	  }
	  
	public static void main(String args[]) throws Exception
	{
		Security.addProvider(new BouncyCastleProvider());
	    String xform = "RSA/NONE/PKCS1Padding";
	    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
	    kpg.initialize(512); 
	    KeyPair kp = kpg.generateKeyPair();
	    PublicKey pubk = kp.getPublic();
	    PrivateKey prvk = kp.getPrivate();
		Socket cliente = null;
		
		try
		{
		    cliente = new Socket("127.0.0.1",7000);
		    
		    //envia dados para o servidor
		    DataOutputStream output = new DataOutputStream(cliente.getOutputStream());
		    byte[] sentBytes = "oi".getBytes();
		    byte[] encBytes = encrypt(sentBytes, pubk, xform);
			output.writeInt(encBytes.length);
			System.out.println("Enviado size: " + encBytes.length);
		    output.write(encBytes);
		    System.out.println("Enviado bytes: " + new String(encBytes));
		    
		    //recebe dados do servidor
		    DataInputStream entrada = new DataInputStream(cliente.getInputStream());
		    int size = entrada.readInt();
		    byte[] recvBytes = new byte[size];
		    entrada.read(recvBytes);
		    System.out.println( "Recebido do servidor: " + new String(recvBytes) );
		   
		}
		catch(IOException e)
        {
        	System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
        
        }
		finally
		{
			try
			{
				cliente.close();
			}
			catch(IOException e){}
		}
	}
}
//class servidor

import java.io.*;
import java.net.*;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import java.security.Security;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Servidor {
	 
	     private static byte[] encrypt(byte[] inpBytes, PublicKey key, String xform) throws Exception {
		    Cipher cipher = Cipher.getInstance(xform);
		    cipher.init(Cipher.ENCRYPT_MODE, key);
		    return cipher.doFinal(inpBytes);
		  
		  private static byte[] decrypt(byte[] inpBytes, PrivateKey key, String xform) throws Exception{
		    Cipher cipher = Cipher.getInstance(xform);
		    cipher.init(Cipher.DECRYPT_MODE, key);
		    return cipher.doFinal(inpBytes);
		  }
	
    public static void main(String args[]) throws Exception
	{
    	Security.addProvider(new BouncyCastleProvider());
        String xform = "RSA/NONE/PKCS1Padding";
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
        kpg.initialize(512); 
        KeyPair kp = kpg.generateKeyPair();
        PublicKey pubk = kp.getPublic();
        PrivateKey prvk = kp.getPrivate();
		ServerSocket server = null;
		Socket cliente = null;
	
		try
		{
			server = new ServerSocket(7000);
			System.out.println("Aguardando um cliente conectar...");
		    cliente = server.accept();
			System.out.println("Conexão efetuada");
			System.out.println("");
					   

		    //recebe dados do cliente
			DataInputStream entrada = new DataInputStream(cliente.getInputStream());
		    int size = entrada.readInt();
			System.out.println("Recebido size: " + size);
		    byte[] recvBytes = new byte[size];
		    entrada.read(recvBytes);
		    System.out.println("Recebido bytes: " + new String(recvBytes));
			byte[] decBytes = decrypt(recvBytes, prvk, xform);
		    entrada.read(decBytes);
		    System.out.println("Recebido bytes: " + new String(decBytes));
			System.out.println(new String( decBytes));
			

		    //envia dados ao cliente
			DataOutputStream output = new DataOutputStream(cliente.getOutputStream());
		    byte[] sentBytes = ("reply: " + new String(recvBytes)).getBytes();
		    output.writeInt(sentBytes.length);
		    output.write(sentBytes);
		    
		    cliente.close();
		}
			
		catch(IOException e)
			{
	      		System.out.println("Algum problema ocorreu para criar ou receber o socket.");
	        }
		
			finally
			{
				try
				{
					server.close();
				}
					catch(IOException e)
					{
					}
			}
	}
}

vlw[/quote]

cmo eh q faço issu?!?!?

pod m ajudar?!?!?!

vlw

[quote=msamartini]cmo eh q faço issu?!?!?

pod m ajudar?!?!?!

vlw[/quote]

Para gerar as chaves em uma keystore use o comando keytool que vem no JDK: http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html. Procure por -genkey.

Isto vai gerar uma arquivo contendo a sua chave privada e um certificado auto-assinado com a sua chave publica. Use a classe Keystore para carregar o arquivo no seu codigo para pegar as chaves.:

//codigo do cliente

// Nao sei se o BC tem uma keystore propria. JKS é o default do provider JCE da Sun. Tem que ser o mesmo que você passou no keytool
KeyStore ks = KeyStore.getInstance("JKS", "BC"); 

// fileIS é o InputStream do arquivo de keystore
// senha_da_keystore é a senha da keystore
ks.load(fileIS, "senha_da_keystore".toCharArray());

// alias é o alias da chave que foi gerado no comando keytool
Certificate cert = ks.getCertificate("alias");
PublicKey publicKey = cert.getPublicKey();
//codigo do servidor

// Nao sei se o BC tem uma keystore propria. JKS é o default do provider JCE da Sun. Tem que ser o mesmo que você passou no keytool
KeyStore ks = KeyStore.getInstance("JKS", "BC"); 

// fileIS é o InputStream do arquivo de keystore
// senha_da_keystore é a senha da keystore
ks.load(fileIS, "senha_da_keystore".toCharArray());

// alias é o alias da chave que foi gerado no comando keytool
// senha_da_chave é a senha da chave gerada (pode ser a mesma da keystore)
Key privateKey = ks.getKey("alias", "senha_da_chave".toCharArray());

Fiz o codigo rapidinho, mas acho que é isto mesmo.

[edit]Mudei um negocinho no codigo que tinha esquecido (toCharArray) [/edit]

vo tenta aki entaum…

qlquer coisa t pertubo mais um pokinhu!!!

vlw amigão!

=D