Necesito verificar la firma electronica de un XML

pgonza
18 de Abril del 2005
Tengo un XML el cual me entrega la información de la llave publica para firmar un archivo, la información del XML la coloco en el programa para verifica la firma pero no me funciona.
Lo que necesito es verificar la firma de dicho documento, yo probé generándome las llaves publica y privada con “KeyPairGenerator”, firmando el archivo y funciono correctamente pero lo que necesito es que la firma se verifique con la llave publica que me proporciona el XML por favor agradecería si me pueden ayudar.
Atte: Patricio González

import java.math.BigInteger;
import java.util.*;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyFactorySpi;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;

import java.security.spec.DSAParameterSpec;
import java.security.spec.DSAPrivateKeySpec;
import java.security.spec.DSAPublicKeySpec;
import java.security.spec.InvalidParameterSpecException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPrivateCrtKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.io.*;
import java.security.*;
import java.security.spec.*;
import sun.misc.*;
import java.net.*;

class GenFirma3 {

public static void main(String[] args) {

/* Generate a RSA signature */



String mod="xaU64WV8j6hPl4esqbUrzA3klTavr5jEFITkiGZe99G9c/igMnTwOTfi8Y7tbr1LTHm0rcoKYg37m5hOnResRw==";
String exp="Aw==";
String datos="<DA><RE>96820900-0</RE><RS>ATCOM TELECOMUNICACIONES SOCIEDAD ANONIM</RS><TD>33</TD><RNG><D>1</D><H>10</H></RNG><FA>2005-01-11</FA><RSAPK><M>xaU64WV8j6hPl4esqbUrzA3klTavr5jEFITkiGZe99G9c/igMnTwOTfi8Y7tbr1LTHm0rcoKYg37m5hOnResRw==</M><E>Aw==</E></RSAPK><IDK>100</IDK></DA>";
String firma="Q2I8WwHX4wAfw5efSL/T6yiWceHCDBFXfGBCU+lwQctYVghaNQaAkzgsPJydAf1u9Eob1jRrnJ8VEgLnWX1VnQ==";
try{

byte[] bmod = mod.getBytes("UTF8");
byte[] bexp = exp.getBytes("UTF8");


//Pasar el Modulo y el Exponente a BigInteger
BigInteger modulo = new BigInteger(bmod);
BigInteger exponente = new BigInteger(bexp);
//Generar la llave Publica
RSAPublicKeySpec keySpec = new RSAPublicKeySpec( modulo, exponente );
KeyFactory keyFac = KeyFactory.getInstance( "RSA");
PublicKey pub = ( PublicKey ) keyFac.generatePublic( keySpec );


System.out.println("BYTE LLAVE = "+pub);
byte[] bf = firma.getBytes("UTF-8");

System.out.println("BYTE FIRMA = "+bf);
/* Save the public key in a file */
byte[] data1 =datos.getBytes("UTF-8");
System.out.println("BYTE DATA = "+data1);
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(pub);

/* Save the public key in a file */
sig.update(data1);

boolean verifies = sig.verify(bf);
if(verifies==true)
{
System.out.println("LA FIRMA ES VALIDA");
}else
{
System.out.println("LA FIRMA NO ES VALIDA. POSIBLE IMPOSTOR");
}
} catch (Exception e) {
System.err.println("Caught exception " + e.toString());
}
}
}