none
Decriptar arquivo xml passando a senha do certificado RRS feed

  • 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.

    quinta-feira, 22 de janeiro de 2015 19:30

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
    segunda-feira, 26 de janeiro de 2015 11:25