Inquiridor
Decriptar arquivo xml passando a senha do certificado

Pergunta
-
Olá!
Preciso decriptar um arquivo xml, porem ja passando a senha do certificado.
consigo fazer ações parecidas, como assinar o arquivo sem que o driver do certificado solicite a senha.
segue:
SecureString senha = new SecureString(); foreach (char c in senhaCert.ToCharArray()) senha.AppendChar(c); RSACryptoServiceProvider rsaKeyBase = new RSACryptoServiceProvider(); try { rsaKeyBase = (RSACryptoServiceProvider)cert.PrivateKey; } catch (Exception) { return "E_acessar_chave_certificado"; } CspParameters cspParams = new CspParameters(); cspParams.ProviderName = rsaKeyBase.CspKeyContainerInfo.ProviderName; cspParams.ProviderType = rsaKeyBase.CspKeyContainerInfo.ProviderType; cspParams.KeyNumber = rsaKeyBase.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2; cspParams.KeyContainerName = rsaKeyBase.CspKeyContainerInfo.KeyContainerName; cspParams.KeyPassword = senha; cspParams.Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseDefaultKeyContainer; // Instancia a nova chave de assinatura RSA e salva no contêiner. try { rsaKey = new RSACryptoServiceProvider(cspParams); } catch (Exception) { return "E_SenhaCert_Incorreta"; } try { rsaKey = (RSACryptoServiceProvider)cert.PrivateKey; } catch (Exception) { return "E_acessar_chave_certificado"; } // Criando um documento Xml. XmlDocument xmlDoc = new XmlDocument(); // Carregando um arquivo Xml dentro do objeto XmlDocument. xmlDoc.PreserveWhitespace = true; xmlDoc.Load(fileName); // Check arguments. if (xmlDoc == null) return "E_nao_carregou_xml"; if (rsaKey == null) return "E_key_invalida"; // Instancia o SignedXml. SignedXml signedXml = new SignedXml(xmlDoc); // Adiciona a chave RSA no documento SignedXml. signedXml.SigningKey = rsaKey; // Cria a referencia que deve ser assinada. Reference reference = new Reference(); reference.Uri = ""; // Adiciona uma transformação envolvida com a referência. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env); // Adiciona a referencia no objeto SignedXml. signedXml.AddReference(reference); // Instancia o KeyInfo. KeyInfo keyInfo = new KeyInfo(); // Carrega o certificado dentro do objeto KeyInfoX509Data // e adiciona no objeto KeyInfo. keyInfo.AddClause(new KeyInfoX509Data(cert)); signedXml.KeyInfo = keyInfo; // Grava a assinatura. signedXml.ComputeSignature(); // Pega a representação do XML da assinatura e salva // no objeto XmlElement. XmlElement xmlDigitalSignature = signedXml.GetXml(); // Anexa o elemento no documento XML. xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true)); // Salvo o documento. // Salvo o documento XML. try { xmlDoc.Save(fileName); } catch { return "E_salvar_xml"; }
para decriptar utilizo os seguintes comandos:
// Instancia a class XmlDocument XmlDocument xmlDoc = new XmlDocument(); // Carrega o arquivo XML dentro do objeto XmlDocument. xmlDoc.PreserveWhitespace = true; try { xmlDoc.Load(fileName); } catch (Exception) { return "E_nao_carregou_xml"; } // Descriptografa o documento. if (xmlDoc == null) return "E_xml_invalido"; // Instancia a class EncryptedXml. EncryptedXml exml = new EncryptedXml(xmlDoc); try { exml.DecryptDocument(); } catch (Exception) { return "E_DecryptDocument"; } try { xmlDoc.Save(Path.GetDirectoryName(fileName) + "\\" + Path.GetFileNameWithoutExtension(fileName) + "_decrypted.xml"); } catch { return "E_salvar_xml"; }
queria decriptar sem que o driver do certificado solicite a senha.
Todas as Respostas
-
Arrumei um "jeito"....nao é o mais bonito, mas resolveu!
usando uma funcionalidade do driver do certificado, que quando se digita a senha do certificado, ele não pede mais a senha...eu assinei uma string qualquer antes de chamar a função para decriptar..ai como ele ja tem a senha, nao pede..
é uma POG, mas resolveu!
- Sugerido como Resposta Renato GroffeMVP segunda-feira, 26 de janeiro de 2015 11:31