“Tipo de provedor inválido especificado” CryptographicException ao tentar carregar a chave privada do certificado

Estou tentando ler a chave privada de um certificado que foi compartilhado comigo por um provedor de serviços de terceiros, para que eu possa usá-lo para criptografar um pouco de XML antes de enviá-lo por eles. Estou fazendo isso de forma programática em C #, mas acho que esse é um problema de permissões ou configuração incorreta, portanto, vou me concentrar nos fatos que parecem ser mais relevantes:

Eu não acho que esse problema esteja relacionado ao código; meu código funciona em outros computadores e o problema afeta o código de exemplo da Microsoft.O certificado foi fornecido como um arquivo PFX e é apenas para fins de teste, por isso também inclui uma autoridade de certificação simulada.Usando o MMC.exe, posso importar o certificado para o armazenamento pessoal da máquina local, antes de conceder permissões na chave privada a todas as contas relevantes e arrastar e soltar a autoridade de certificação nas Autoridades de Certificação Raiz Confiáveis.Usando C #, posso carregar o certificado (identificado por sua impressão digital) e verificar se ele possui uma chave privada usandoX509Certificate2.HasPrivateKey. No entanto, tentar ler a chave causa um erro. No .NET, umCryptographicException é lançado com a mensagem "Tipo de provedor inválido especificado" ao tentar acessar a propriedadeX509Certificate2.PrivateKey. No Win32, chamando o métodoCryptAcquireCertificatePrivateKey retorna o equivalente HRESULT,NTE_BAD_PROV_TYPE.Essa é a mesma exceção que também ocorre ao usar dois exemplos de código da Microsoft para ler a chave privada do certificado.A instalação do mesmo certificado no armazenamento equivalente para o usuário atual, em vez da máquina local, permite que a chave privada seja carregada com êxito.Estou no Windows 8.1 com direitos de administrador local e tentei executar meu código nos modos normal e elevado. Os colegas no Windows 7 e Windows 8 conseguiram carregar a chave no armazenamento de máquinas local para o mesmo certificado.Consigo ler com êxito a chave privada do certificado de teste do IIS autoassinado, que está no mesmo local de armazenamento.Já estou direcionando o .NET 4.5 (esse erro foi relatado em algumas versões mais antigas da estrutura).Eu não acho que isso seja um problema com modelos de certificado, porque eu esperaria que isso afetasse igualmente a máquina local e os armazenamentos de usuários atuais?

Diferentemente de meus colegas, fiz várias tentativas anteriores de desinstalar e reinstalar o certificado de várias maneiras, inclusive via Gerenciador do IIS e também incluindo um certificado mais antigo do mesmo emissor. Não vejo vestígios de certificados antigos ou duplicados no MMC. No entanto, tenho muitos arquivos de chave privada de tamanho idêntico que, com base no tempo da última gravação, devem ter sido deixados para trás após minhas várias tentativas de instalação. Eles são encontrados nos seguintes locais, para a máquina local e os armazenamentos de usuários atuais, respectivamente:

c: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys

c: \ Users \\ AppData \ Roaming \ Microsoft \ Crypto \ RSA \ S-1-5-21- [restante do ID do usuário]

Portanto, alguém pode aconselhar se:

É uma boa idéia desinstalar o certificado usando o MMC, excluir todos os arquivos que parecem chaves privadas órfãs e reinstalar o certificado e tentar novamente?Existem outros arquivos que eu deveria tentar excluir manualmente?Há mais alguma coisa que eu deveria tentar?

UPDATE - Adicionado um exemplo de código mostrando uma tentativa de ler uma chave privada:

static void Main()
{
    // Exception occurs when trying to read the private key after loading certificate from here:
    X509Store store = new X509Store("MY", StoreLocation.LocalMachine);
    // Exception does not occur if certificate was installed to, and loaded from, here:
    //X509Store store = new X509Store("MY", StoreLocation.CurrentUser);

    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

    X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
    X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
    X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Test Certificate Select", "Select a certificate from the following list to get information on that certificate", X509SelectionFlag.MultiSelection);
    Console.WriteLine("Number of certificates: {0}{1}", scollection.Count, Environment.NewLine);

    foreach (X509Certificate2 x509 in scollection)
    {
        try
        {
            Console.WriteLine("Private Key: {0}", x509.HasPrivateKey ? x509.PrivateKey.ToXmlString(false) : "[N/A]");
            x509.Reset();
        }
        catch (CryptographicException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    store.Close();

    Console.ReadLine();
}