4

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

有人知道我该怎么做吗?

4

3 回答 3

2

使用外部库执行此操作的最简单方法是使用(免费) Chillkat 公钥/私钥组件:使用它,只需几行代码即可导入密钥,如果您愿意支付 149 美元或者对于图书馆的其余部分,它也将使处理一般加密概念变得更加容易。

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

最后,PKCS #8 格式并不太难解析,RSA/DSA 密钥对对象符合PKCS #11,并且一旦你弄清楚所有位的去向,就相对容易转换为 .NET X509Certificate - 我实际上不久前在 VB.NET 中做到了这一点,但不幸的是我无法共享该代码。

于 2009-11-13T12:00:12.037 回答
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

于 2021-09-06T08:15:14.843 回答
1

感谢您的回答。

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

(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。我使用这个解析器来做到这一点。

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

  byte[] challange = server.getChallenge();

  RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();

  rsaProvider.FromXmlString(Demo.Properties.Resources.XmlPrivateKey);

  byte[] plaintext = rsaProvider.Decrypt(challange, false);

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

  RSACryptoServiceProvider rsaProvider = x509.PublicKey.Key as RSACryptoServiceProvider;

  byte[] answer = RsaProvider.Encrypt(plaintext, false);

感谢 JavaScience 咨询

于 2009-11-13T15:41:28.903 回答