【问题标题】:How do I create/export to a .PVK file using C#?如何使用 C# 创建/导出到 .PVK 文件?
【发布时间】:2018-08-08 15:46:58
【问题描述】:

我在 RSACryptoServiceProvider 对象中加载了一个 RSA 私钥。我需要将其导出到 .pvk 文件以用于 SQL Server。

有没有办法在 c# 中做到这一点?我发现可以使用 openssl ...https://stackoverflow.com/a/51207929/5924962

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

【问题讨论】:

  • Google 搜索“rsacryptoserviceprovider 导出密钥”将我带到msdn.microsoft.com/en-us/library/…
  • 当然可以,但我需要专门的 .pvk 文件格式。这是一种专有的微软格式。

标签: c# .net rsa makecert


【解决方案1】:

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

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

注意Mono.Security NuGet 包不是官方的。

【讨论】:

    【解决方案2】:

    如果您查看RSACryptoServiceProvider.ExportCspBlob 的输出,您会发现它以与未加密 PVK 文件的偏移量 24 相同的字节序列开头。所以一个 PVK 文件就是一个带有标题的 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
    

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

    【讨论】:

    • 当然我没有马上看到这个。我基于the OpenSSL source 编写了大部分 PVK 导出器,然后想知道是否可以使用 ExportCspBlob 来验证我的输出。呸。
    • @LexLi 这很简洁,可能值得自己回答?它增加了我的版本没有的密码保护,并且也支持大端系统。 (不过我的肯定更简单。)它确实支持了我的发现,即文件的核心是 CAPI blob:实际的密钥导出在 CryptoConvert.ToCapiPrivateKeyBlob
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多