如何使用 C# create/export 到 .PVK 文件?

How do I create/export to a .PVK file using C#?

我在 RSACryptoServiceProvider 对象中加载了一个 RSA 私钥。我需要将其导出到一个 .pvk 文件以便与 SQL 服务器一起使用。

有没有办法在 C# 中做到这一点?我看到可以使用 openssl...

这是我能找到的关于 pvk 文件格式的唯一文档:https://web.archive.org/web/20141117214716/http://www.drh-consultancy.demon.co.uk/pvk.html

如果您查看 RSACryptoServiceProvider.ExportCspBlob 的输出,您会发现它以与未加密 PVK 文件的偏移量 24 相同的字节序列开始。所以 PVK 文件只是带有 header:

的 CSP blob
using (var output = new BinaryWriter(File.Create("rsa.pvk")))
{
    output.Write(0xB0B5F11Eu);  // PVK magic number
    output.Write(0u);
    output.Write(1u);           // KEYTYPE_KEYX for RSA
    output.Write(0u);           // not encrypted
    output.Write(0u);           // encryption salt length

    var cspBlob = rsaCSP.ExportCspBlob(true);
    output.Write((uint)cspBlob.Length);
    output.Write(cspBlob);
}

我已验证 OpenSSL 会读取此内容

openssl rsa -in rsa.pvk -inform PVK

并将生成与直接从 RSACryptoServiceProvider 生成 PEM 私钥的 the code in this answer 相同的 PEM 私钥导出。

Mono 项目有一个 PVK 格式的开源实现,

https://github.com/mono/mono/blob/master/mcs/class/Mono.Security/Mono.Security.Authenticode/PrivateKey.cs

Note the Mono.Security NuGet package is not official.