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>xaU64WV8j6hPl4esqbUrzA3klTavr5jEFITki GZe99G9c/igMnTwOTfi8Y7tbr1LTHm0rcoKYg37m5hOnResRw==</M><E>Aw==</E></RSAPK><IDK>100</IDK></DA>";
String firma="Q2I8WwHX4wAfw5efSL/T6yiWceHCDBFXfGBCU+lwQctYVghaNQaAkzgsPJydAf1u9Eob1 jRrnJ8VEgLnWX1VnQ==";
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());
}
}
}