是否可以通过Microsoft \ Crypto \ RSA \ MachineKeys文件夹导入私钥?

时间:2019-06-01 23:54:59

标签: c# cryptography x509certificate2

我正在寻找与私钥文件夹进行交互的方法(本质上是找到一个私钥以尝试与公钥配对,因为公钥尚未与之配对)certutil -repairstore功能基本上就是我正在寻找-我相信能够使用代码迭代私钥将帮助我实现这一目标

仅尝试从这些文件中读取所有字节并将它们作为Cspblob导入RSACryptoProvider中是行不通的。给出“提供程序的错误版本”错误。

startInfo.FileName = "cmd.exe";

startInfo.Arguments = @"/C certutil -repairstore my " + selectedCertificate.Thumbprint;

startInfo.Verb = "runas";

这是我当前的变通方法命令行用法,但我不喜欢在可能的情况下使用命令行-这不是我可以使用或操作的对象,它具有与我要结束的功能相似的功能做。

1 个答案:

答案 0 :(得分:0)

下面是小的测试代码段。在偏移量0x28处,有一个容器名称可用于加载Key参数。我找不到有关私钥文件格式的任何文档,因此可能无法在所有情况下都起作用。

public static RSAParameters LoadParametersFromFile(string fileName)
{
    int provType = 1;
    string provName = "Microsoft Enhanced Cryptographic Provider v1.0"

    // Load key container name;
    StringBuilder containerName = new StringBuilder();
    using (var keyFile = File.OpenRead(fileName))
    {
        keyFile.Position = 0x28;
        int c;
        while ((c = keyFile.ReadByte()) != 0 && c !=-1) containerName.Append((char) c);
    }

    CspParameters csp = new CspParameters(provType, provName);
    csp.Flags = CspProviderFlags.UseMachineKeyStore; // set it accordingly
    csp.KeyContainerName = containerName.ToString();
    using (RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(csp))
    {
        RSAParameters loadedParams = rsaKey.ExportParameters(false);
        return loadedParams;
    }
}

测试电话:

var rsaParams =  LoadParametersFromFile(@"C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\0034dc1b91df7f7d75df774fa568bc73_ba648dc7-2ead-41db-8cde-e6f84e3fb1cc");

rsaParams.Modulus 将包含公钥。