Problema na gravaçao de chaves . Assinatura Digital

1 resposta
O

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

1 Resposta

dudaskank

Creio que o problema esteja que, quando você gera a assinatura, você usa a mensagem como parâmetro para gerar a chave, e quando você vai verificar, você usa a string "CLIENTE >>> " e a mensagem, onde você deveria usar apenas a mensagem.

Acho que é isso…

:slight_smile:

Criado 17 de novembro de 2003
Ultima resposta 18 de nov. de 2003
Respostas 1
Participantes 2