Nfe - Rejeicao: Assinatura difere do calculado

Bom dia pessoal.
Estou implementando a emissão de NF-e no ERP de minha empresa.
Graças a muito material que encontrei no fórum consegui implementar quase tudo, já estou gerando o XML, assinando e enviando a Sefaz-MG.
Porém, ao consultar o retorno do lote sempre recebo a mensagem:
Rejeicao: Assinatura difere do calculado
codigo status: 297

Utilizando o validador da Sefax-RS, o resultado é:
PARSER XML: OK
TIPO DE MENSAGEM: Lote NF-e
SCHEMA: OK
ASSINATURA XML:
Validando NOTA #1 do Lote NF-e: Assinatura INVÁLIDA

Sendo que meu código não altera nem grava nada entre a assinatura e o envio pelo webservice.
Abaixo segue o xml e o código que faz a assinatura ( peguei aqui no guj ).
O meu certificado é da icp-brasil, comprei ele, é um A3 ( token ).
Estou perdido, não sei mais o que verificar. Se alguém puder me ajudar por favor.
Obrigado!

XML assinado:

<?xml version="1.0" encoding="UTF-8"?><enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" versao="1.10"><idLote>73</idLote><NFe><infNFe Id="NFe31100110441324000119550720000000070555253747" versao="1.10"><ide><cUF>31</cUF><cNF>055525374</cNF><natOp>0</natOp><indPag>1</indPag><mod>55</mod><serie>72</serie><nNF>7</nNF><dEmi>2010-01-22</dEmi><dSaiEnt>2010-01-22</dSaiEnt><tpNF>1</tpNF><cMunFG>3106200</cMunFG><tpImp>1</tpImp><tpEmis>1</tpEmis><cDV>7</cDV><tpAmb>2</tpAmb><finNFe>1</finNFe><procEmi>0</procEmi><verProc>0.1</verProc></ide><emit><CNPJ>10441324000119</CNPJ><xNome>Empresa de Teste</xNome><xFant>Empresa de Teste</xFant><enderEmit><xLgr>Sacramento</xLgr><nro>78</nro><xCpl>Ap 120</xCpl><xBairro>Centro</xBairro><cMun>3106200</cMun><xMun>Para de Minas</xMun><UF>MG</UF><CEP>35660001</CEP></enderEmit><IE>ISENTO</IE></emit><dest><CPF>63146860678</CPF><xNome>JOAO DA SILVA</xNome><enderDest><xLgr>R. Baturite</xLgr><nro>24</nro><xCpl>compl. do endereco</xCpl><xBairro>Centro</xBairro><cMun>3106200</cMun><xMun>BH</xMun><UF>MG</UF><CEP>30150011</CEP></enderDest><IE/></dest><det nItem="1"><prod><cProd>3</cProd><cEAN/><xProd>BOBINA</xProd><NCM>85113020</NCM><EXTIPI>01</EXTIPI><CFOP>5102</CFOP><uCom>UN</uCom><qCom>20.0000</qCom><vUnCom>15.0000</vUnCom><vProd>300.00</vProd><cEANTrib/><uTrib>UN</uTrib><qTrib>20.0000</qTrib><vUnTrib>15.0000</vUnTrib></prod><imposto><ICMS><ICMS00><orig>0</orig><CST>00</CST><modBC>1</modBC><vBC>300.00</vBC><pICMS>1.00</pICMS><vICMS>3.00</vICMS></ICMS00></ICMS><IPI><cEnq>999</cEnq><IPINT><CST>04</CST></IPINT></IPI><PIS><PISNT><CST>04</CST></PISNT></PIS><COFINS><COFINSNT><CST>04</CST></COFINSNT></COFINS></imposto></det><total><ICMSTot><vBC>300.00</vBC><vICMS>3.00</vICMS><vBCST>0.00</vBCST><vST>0.00</vST><vProd>500.00</vProd><vFrete>0.00</vFrete><vSeg>0.00</vSeg><vDesc>0.00</vDesc><vII>0.00</vII><vIPI>3.00</vIPI><vPIS>1.00</vPIS><vCOFINS>1.00</vCOFINS><vOutro>0.00</vOutro><vNF>500.00</vNF></ICMSTot><ISSQNtot><vServ>200.00</vServ><vBC>200.00</vBC><vISS>6.90</vISS><vPIS>1.00</vPIS><vCOFINS>1.00</vCOFINS></ISSQNtot></total><transp><modFrete>0</modFrete><transporta><CNPJ>00000000000000</CNPJ><xNome>COMETA</xNome><xEnder>Silva Jardim 100, Floresta</xEnder><xMun>Belo Horizonte</xMun></transporta></transp></infNFe><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="#NFe31100110441324000119550720000000070555253747"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>8RlUcLI7gaTjHQrZBIhHjWptRH4=</DigestValue></Reference></SignedInfo><SignatureValue>Jc0N/xERBi1lIWzbziOqXAUUE7c/FYQjP9KHbyAtDix1avrt6Y/Eyl3E3kJspV+mZ3hid9GfplNY
BZtztXpUfnJLrfJ+4VCScTnfuSoTUNwHwDoJ/jdP5tuPmllW2/eDYnhGvQSQPWBG5fl8f+VuZ4Ea
uUb39P9MBssNViWqKyY=</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIGnTCCBYWgAwIBAgIQZJdRKfL4bfK1w766LHWKlzANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQG
EwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2VjcmV0YXJpYSBkYSBSZWNlaXRh
IEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRswGQYDVQQDExJBQyBQUk9ERU1HRSBSRkIgRzIwHhcN
MDkxMjE2MDAwMDAwWhcNMTIxMjE0MjM1OTU5WjCB7TELMAkGA1UEBhMCQlIxEzARBgNVBAoUCklD
UC1CcmFzaWwxCzAJBgNVBAgTAk1HMRcwFQYDVQQHFA5CRUxPIEhPUklaT05URTE2MDQGA1UECxQt
U2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRYwFAYDVQQLFA1S
RkIgZS1DTlBKIEEzMSUwIwYDVQQLFBxBdXRlbnRpY2FkbyBwb3IgUFJPREVNR0UgUkZCMSwwKgYD
VQQDEyNSVU1PIFRFQ05PTE9HSUEgTFREQToxMDQ0MTMyNDAwMDExOTCBnzANBgkqhkiG9w0BAQEF
AAOBjQAwgYkCgYEAqBIkFcOB4rMl3eeSYYDTQfYFW0DKN2DpmNMYk5jjIvJQ8zvXScquQpQm7DQD
9b/G4fvNwi5d+kQ9i3zKC4tTc61F0pOUx4QVeX9U+vk66cD+d+8oNP+js46HqWSMbWKSnuCeRGmy
cijdpjzeR6ac0bE8iNCod2kTjN79JAjxBu8CAwEAAaOCAzAwggMsMIHJBgNVHREEgcEwgb6gPQYF
YEwBAwSgNAQyMjYxMTE5NzA3ODU1OTUxMDY3MjAwMDAwMDAwMDAwMDAwMDAwTUc0OTgyNjU0U1NQ
TUegIgYFYEwBAwKgGQQXV0lMTElBTiBXQUdORVIgREEgU0lMVkGgGQYFYEwBAwOgEAQOMTA0NDEz
MjQwMDAxMTmgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgSV0ZWNub2NvbkB0ZWNub2NvbmNvbnRh
YmlsaWRhZGUuY29tLmJyMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU90djZwdXKrbmaKhv51fZICw5
brQwDgYDVR0PAQH/BAQDAgXgMIIBDQYDVR0fBIIBBDCCAQAwVqBUoFKGUGh0dHA6Ly9pY3AtYnJh
c2lsLmNlcnRpc2lnbi5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDUFJPREVNR0VSRkJHMi9MYXRl
c3RDUkwuY3JsMFWgU6BRhk9odHRwOi8vaWNwLWJyYXNpbC5vdXRyYWxjci5jb20uYnIvcmVwb3Np
dG9yaW8vbGNyL0FDUFJPREVNR0VSRkJHMi9MYXRlc3RDUkwuY3JsME+gTaBLhklodHRwOi8vcmVw
b3NpdG9yaW8uaWNwYnJhc2lsLmdvdi5ici9sY3IvUkZCL0FDUFJPREVNR0VSRkJHMi9MYXRlc3RD
UkwuY3JsMFUGA1UdIAROMEwwSgYGYEwBAgMUMEAwPgYIKwYBBQUHAgEWMmh0dHA6Ly9pY3AtYnJh
c2lsLmNlcnRpc2lnbi5jb20uYnIvcmVwb3NpdG9yaW8vZHBjMB0GA1UdJQQWMBQGCCsGAQUFBwME
BggrBgEFBQcDAjCBmgYIKwYBBQUHAQEEgY0wgYowKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLmNl
cnRpc2lnbi5jb20uYnIwXgYIKwYBBQUHMAKGUmh0dHA6Ly9pY3AtYnJhc2lsLmNlcnRpc2lnbi5j
b20uYnIvcmVwb3NpdG9yaW8vY2VydGlmaWNhZG9zL0FDX1BST0RFTUdFX1JGQl9HMi5wN2MwDQYJ
KoZIhvcNAQEFBQADggEBAKiTXlu2MOHM8S4WjoEzMlRQAnA3AyOqYLwsh6rHqnZpNL/iznj1hoi4
UThsj2qMdBH5YFvOtZvSDxkPD0e3ljq6ehjsNePTYKI0RXnzYnZc189fOQNcqrmPqXacOqfx7FTZ
dRqMVDhlvlZjizBP+E5OMR6jHcIyEuUCgu+Xqvn6Mp27MahCisxCj8mZHLzabPy9kNApwHoN9s1h
qEq+Dr2xOHflvrTTzNx2Hf5gmzSP6e+8BGFX1BsZXtfLJhVbpfHYDOETs/veX5kKn3u+zCbNUL0+
K5Zyly/CZZXAoXCNNYvJtSGGXck0ql7jKqSSmjEc5D0TWYmGPdFi2/spGQs=</X509Certificate></X509Data></KeyInfo></Signature></NFe></enviNFe>

Código que faz a assinatura:

    @SuppressWarnings({ "unchecked", "restriction" })
    public static String assinarEnviNFe(String xml, String certificado, String keyStorePass, boolean token, String id) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        //DocumentBuilder builder = factory.newDocumentBuilder();
        // Document docs = builder.parse(new File(
        // "c:/xml/430802017886010001735500000000010000030371-nfe.xml"));
        Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));

        // Create a DOM XMLSignatureFactory that will be used to
        // generate the enveloped signature.
        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

        // Create a Reference to the enveloped document (in this case,
        // you are signing the whole document, so a URI of "" signifies
        // that, and also specify the SHA1 digest algorithm and
        // the ENVELOPED Transform.
        ArrayList transformList = new ArrayList();
        TransformParameterSpec tps = null;
        Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,
                tps);
        Transform c14NTransform = fac.newTransform(
                "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);

        transformList.add(envelopedTransform);
        transformList.add(c14NTransform);

        // Load the KeyStore and get the signing key and certificate.
        KeyStore ks=null;
        if(token){
        	Provider p = new sun.security.pkcs11.SunPKCS11(certificado);
        	Security.addProvider(p);
        	ks = KeyStore.getInstance("PKCS11");
        	ks.load(null, keyStorePass.toCharArray());
        }else{
        	ks = KeyStore.getInstance("JKS");
        	ks.load(new FileInputStream(certificado), keyStorePass.toCharArray());
        }
        
        KeyStore.PrivateKeyEntry keyEntry =
            (KeyStore.PrivateKeyEntry) ks.getEntry
            (ks.aliases().nextElement(), new KeyStore.PasswordProtection(keyStorePass.toCharArray()));
        X509Certificate cert = (X509Certificate) keyEntry.getCertificate();	

        // Create the KeyInfo containing the X509Data.
        KeyInfoFactory kif = fac.getKeyInfoFactory();
        List<Serializable> x509Content = new ArrayList<Serializable>();
        //x509Content.add(cert.getSubjectX500Principal().getName());
        x509Content.add(cert);
        X509Data xd = kif.newX509Data(x509Content);
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

        for (int i = 0; i < doc.getDocumentElement().getElementsByTagName("NFe").getLength(); i++) {
            assinarNFE(fac, transformList, keyEntry.getPrivateKey(), ki, doc, i);
        }
        // Output the resulting document.
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));
        
        return os.toString();  
    }
    
    @SuppressWarnings("unchecked")
	private static void assinarNFE(XMLSignatureFactory fac,
            ArrayList transformList, PrivateKey privateKey, KeyInfo ki,
            Document doc, int i) throws Exception {

        // Obtem elemento do documento a ser assinado, será criado uma
        // REFERENCE para o mesmo
        NodeList elements = doc.getElementsByTagName("infNFe");
        Element el = (Element) elements.item(i);
        String id = el.getAttribute("Id");

        // doc.getDocumentElement().removeAttribute("xmlns:ns2");
        // ((Element)
        // doc.getDocumentElement().getElementsByTagName("NFe").item(0))
        // .setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");

        // Create a DOM XMLSignatureFactory that will be used to
        // generate the enveloped signature.

        Reference ref = fac.newReference("#" + id, fac.newDigestMethod(
                DigestMethod.SHA1, null), transformList, null, null);

        // Create the SignedInfo.
        SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(
                CanonicalizationMethod.INCLUSIVE,
                (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
                Collections.singletonList(ref));

        // Create the XMLSignature, but don't sign it yet.
        XMLSignature signature = fac.newXMLSignature(si, ki);

        // Marshal, generate, and sign the enveloped signature.
        // Create a DOMSignContext and specify the RSA PrivateKey and
        // location of the resulting XMLSignature's parent element.
        DOMSignContext dsc = new DOMSignContext(privateKey, doc.getDocumentElement().getElementsByTagName("NFe").item(i));
        signature.sign(dsc);

    }