/// <summary>
        /// Obtiene la cadena original del cfdi
        /// </summary>
        /// <param name="rutaArchivoCadenaOriginal"></param>
        /// <param name="xml"></param>
        /// <returns>Cadena Original</returns>
        private static string obtenerCadenaOriginal(string rutaArchivoCadenaOriginal, XDocument xml)
        {
            try
            {
                string cadenaOriginal = null;

                XElement xComprobante = xml.Root;
                HelpersXml.removerAtributosVacios(xComprobante, true);

                string  xmlTemporal = Path.GetTempFileName();
                dynamic nuevoXml    = Path.GetTempFileName();

                xComprobante.Save(xmlTemporal);

                dynamic Xsl = new System.Xml.Xsl.XslCompiledTransform();
                Xsl.Load(rutaArchivoCadenaOriginal);
                Xsl.Transform(xmlTemporal, nuevoXml);
                Xsl = null;

                dynamic StreamReader = new StreamReader(nuevoXml);
                cadenaOriginal = StreamReader.ReadToEnd();
                StreamReader.Close();

                File.Delete(nuevoXml);
                File.Delete(xmlTemporal);

                StreamReader.Dispose();

                return(cadenaOriginal);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Obtiene la informnacion del certificado, lo desencripta y aplica digestion SHA-256 para generar el sello.
        /// </summary>
        /// <param name="cfdi"></param>
        /// <param name="xml"></param>
        private static void firmarXml(Cfdi cfdi, ref XDocument xml)
        {
            try
            {
                obtenerCertificado(cfdi.rutaArchivoCer, ref xml);
                string cadenaOriginal  = obtenerCadenaOriginal(cfdi.rutaXsltCadenaOriginal, xml);
                string algoritmoHash   = "SHA-256";
                string xmlLlavePrivada = string.Empty;
                string sellobase64     = string.Empty;

                Rsa               rsa          = new Rsa();
                Rsa               rsa2         = new Rsa();
                Cert              certificado  = new Cert();
                PrivateKey        llavePrivada = new PrivateKey();
                Chilkat.PublicKey llavePublica;

                if (llavePrivada.LoadPkcs8EncryptedFile(cfdi.rutaArchivoKey, cfdi.secretArchivoKey) == false)
                {
                    return;
                }

                xmlLlavePrivada = llavePrivada.GetXml();

                if (rsa.UnlockComponent(Constantes.CHILKAT_UNLOCK_CODE) == false)
                {
                    //Debug.Write(rsa.LastErrorText);
                    return;
                }

                if (rsa.ImportPrivateKey(xmlLlavePrivada) == false)
                {
                    //Debug.Write(rsa.LastErrorText);
                    return;
                }

                rsa.Charset      = "utf-8";
                rsa.EncodingMode = "base64";
                rsa.LittleEndian = false;

                if (certificado.LoadFromFile(cfdi.rutaArchivoCer) == false)
                {
                    return;
                }

                sellobase64 = rsa.SignStringENC(cadenaOriginal, algoritmoHash);

                xml.Root.SetAttributeValue("Sello", sellobase64);

                XElement xComprobante = xml.Root;
                xComprobante = HelpersXml.removerAtributosVacios(xml.Root, true);

                llavePublica = certificado.ExportPublicKey();

                if (rsa2.ImportPublicKey(llavePublica.GetXml()) == false)
                {
                    return;
                }

                rsa2.Charset      = "utf-8";
                rsa.EncodingMode  = "base64";
                rsa2.LittleEndian = false;

                if (rsa2.VerifyStringENC(cadenaOriginal, algoritmoHash, sellobase64) == false)
                {
                    return;
                }

                certificado.Dispose();

                cfdi.cadenaOriginal = cadenaOriginal;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }