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!?!??!
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)
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???
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 :
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)
{
}
}
}
}
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]