public void criptografarXML(XmlDocument xml, X509Certificate2 certificado) { X509Certificate2Util certificadoUtil = new X509Certificate2Util(); if (certificado != null) { // Gera a chave/iv para criptografar os valores byte[] key, iv; gerarChaveIvAes(out key, out iv); // Cria os elementos no xml xml.DocumentElement.Attributes.RemoveAll(); var xmlThumbprint = xml.CreateAttribute(XML_CertificateThumbprint); xmlThumbprint.InnerText = certificado.Thumbprint; xml.DocumentElement.Attributes.Append(xmlThumbprint); var xmlKey = xml.CreateAttribute(XML_Key); xmlKey.InnerText = Convert.ToBase64String(certificadoUtil.Criptografar(certificado, key)); xml.DocumentElement.Attributes.Append(xmlKey); var xmlIv = xml.CreateAttribute(XML_IV); xmlIv.InnerText = Convert.ToBase64String(certificadoUtil.Criptografar(certificado, iv)); xml.DocumentElement.Attributes.Append(xmlIv); // Criptografa o conteudo do XML xml.DocumentElement.InnerXml = Convert.ToBase64String(criptografarAes(xml.DocumentElement.InnerXml, key, iv)); } }
public static void descriptografarXML(XmlDocument xml, X509Certificate2 certificadoExterno, out X509Certificate2 certificadoUtilizado) { certificadoUtilizado = null; X509Certificate2Util certificadoUtil = new X509Certificate2Util(); if (xml.DocumentElement.Attributes[XML_CertificateThumbprint] != null) //if (xml.Tables[0].Columns[XML_CertificateThumbprint] != null) { var thumbprint = xml.DocumentElement.Attributes[XML_CertificateThumbprint].InnerText; var keyCrypted = Convert.FromBase64String(xml.DocumentElement.Attributes[XML_Key].InnerText); var ivCrypted = Convert.FromBase64String(xml.DocumentElement.Attributes[XML_IV].InnerText); if (certificadoExterno != null && thumbprint == certificadoExterno.Thumbprint) { certificadoUtilizado = certificadoExterno; } else { certificadoUtilizado = certificadoUtil.ObterCertificado(thumbprint); if (certificadoUtilizado == null) { throw new CertificadoNaoEncontradoException(thumbprint); } } var key = certificadoUtil.Descriptografar(certificadoUtilizado, keyCrypted); var iv = certificadoUtil.Descriptografar(certificadoUtilizado, ivCrypted); xml.DocumentElement.InnerXml = descriptografarAes(Convert.FromBase64String(xml.DocumentElement.InnerXml), key, iv); // Adiciona os atributos do documento foreach (XmlAttribute attribute in xml.DocumentElement.Attributes) { //TODO PH: REVER ESSE PONTO //xml.DataSet.ExtendedProperties[attribute.LocalName] = attribute.InnerText; } } }