olá… estou finalizando um chat com assinatura digital, porem ele está dando um erro, ele está gerando as chaves ( publica e privata ) todas as vezes em que o servidor e o cliente sao inicializados… sendo assim a mensagem q o cliente tenta enviar nao é autenticada… alguem poderia me ajudar??
essa é a parte do Cliente (cortei as partes irrelevantes ao problema)
...
private void sendData( String message )
{
try
{
// Gera chaves pública e privada
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
SecureRandom secRan = new SecureRandom();
keyGen.initialize(512, secRan);
KeyPair keyP = keyGen.generateKeyPair();
// PublicKey pubKey = keyP.getPublic();
PrivateKey priKey = keyP.getPrivate();
//Obtem algoritmo para geração da assinatura
Signature sign = Signature.getInstance("DSA");
sign.initSign(priKey);
//Gerar assinatura
sign.update(message.getBytes());
byte[] assinaturaByte = sign.sign();
String assinatura = CriptoUtils.byteArrayToHexString(assinaturaByte);
// envia a mensagem e a assinatura
output.writeObject( "CLIENTE>>> " + message + "|" + assinatura );
output.flush();
saidaArea.append( "CLIENTE>>> " + message );
// envia a mensagem e a assinatura
...
a parte do servidor eh essa:
try
{
message = ( String ) input.readObject();
System.out.println(message);
// descobre a posicao do caracter | na string
pos = message.indexOf("|");
// pega a assinatura que estah apos o |
ass = message.substring (pos + 1);
// pega a mensagem q estah antes do |
msg = message.substring (0,pos);
// chama validaAssinatura passando a message original como parametro
//validaAssinatura( message );
//Gerar assinatura
//Obtém chave pública
ObjectInputStream oin = new ObjectInputStream(new FileInputStream("pubkey.ser"));
PublicKey pubKey = (PublicKey)oin.readObject();
oin.close();
Signature clientSig = Signature.getInstance("DSA");
clientSig.initVerify(pubKey);
//Captura assinatura
byte[] assinatura1 = CriptoUtils.hexStringToByteArray(ass);
clientSig.update(msg.getBytes());
if (clientSig.verify(assinatura1))
{
//Mensagem assinada corretamente
statusLabel.setText( "Assinatura OK" );
saidaArea.append( msg );
saidaArea.setCaretPosition(saidaArea.getText().length() );
}
else
{
//Mensagem não pode ser validada
statusLabel.setText( "Assinatura Inválida" );
}
}
ficaria muito grato se alguem pudesse me ajudar… estou a um bom tempo nessa implementação…
[]'s
Octavio Bordin
