【问题标题】:How to import PKCS#8 RSA privateKey (created by OpenSSL) in C#如何在 C# 中导入 PKCS#8 RSA privateKey(由 OpenSSL 创建)
【发布时间】:2009-11-12 13:49:28
【问题描述】:

我正在尝试找到一种方法来读取在 C# 中使用 OpenSSL PKCS#8 RSA 创建的 privateKey,而无需使用外部库。

有人知道我该怎么做吗?

【问题讨论】:

    标签: c# rsa private-key pkcs#8


    【解决方案1】:

    使用外部库的最简单方法是使用(免费)Chillkat Public / Private Key Component:使用它,可以使用just a few lines of code 导入密钥,如果你愿意为图书馆的其余部分支付 149 美元左右,这也将使处理一般加密概念变得容易得多。

    与常规的 Microsoft .NET Framework 不同,Mono 项目确实似乎有一个 PKCS8 implementationfull C# source 可用。如果您绝对不能依赖外部库,这可能适合作为起点,假设与 Mono 代码相关的 (LGPL 2.0) 许可证适用于您...

    最后,PKCS #8 format 并不太难解析,并且 RSA/DSA 密钥对对象与 PKCS #11 一致,并且一旦您弄清楚所有位的去向,就相对容易转换为 .NET X509Certificate - - 前段时间我实际上在 VB.NET 中做过这个,但不幸的是我无法共享该代码。

    【讨论】:

    • 我需要一些免费和开源的东西。不过感谢您的帮助。
    • 我确信它很容易做到,但我不想这样做。这就是我得到那个图书馆的原因。简单、开源且免费。
    【解决方案2】:

    从 .Net Core 3 开始:

    using System.Security.Cryptography;
    
    // ...
    
    // I had my PK in base64
    var pkBase64 = "MIIEvQI...";
    
    var rsa = RSA.Create(); 
    rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(pkBase64), out _);
    
    

    供参考:https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsa.importpkcs8privatekey?view=net-5.0

    【讨论】:

      【解决方案3】:

      感谢您的回答。

      我使用 OpenSSL whit 创建 RSA 密钥的脚本:

      (Linux 脚本)

      openssl genrsa -out ${NAME}_openssl.key 2048
      openssl pkcs8 -topk8 -in ${NAME}_openssl.key -nocrypt > ${NAME}.key
      openssl req -new -x509 -key ${NAME}.key -out ${NAME}.crt -outform DER
      

      在 C# 中,我们需要 XML 格式的 privateKey。我使用this 解析器来执行此操作。

      要解密我们需要使用的挑战:

        byte[] challange = server.getChallenge();
      
        RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
      
        rsaProvider.FromXmlString(Demo.Properties.Resources.XmlPrivateKey);
      
        byte[] plaintext = rsaProvider.Decrypt(challange, false);
      

      要加密我们需要使用的服务器证书:

        RSACryptoServiceProvider rsaProvider = x509.PublicKey.Key as RSACryptoServiceProvider;
      
        byte[] answer = RsaProvider.Encrypt(plaintext, false);
      

      感谢 JavaScience 咨询

      【讨论】:

      • 问题是如何导入 PKCS#8,而不是 kay 作为 XML 文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多