【发布时间】:2009-11-12 13:49:28
【问题描述】:
我正在尝试找到一种方法来读取在 C# 中使用 OpenSSL PKCS#8 RSA 创建的 privateKey,而无需使用外部库。
有人知道我该怎么做吗?
【问题讨论】:
标签: c# rsa private-key pkcs#8
我正在尝试找到一种方法来读取在 C# 中使用 OpenSSL PKCS#8 RSA 创建的 privateKey,而无需使用外部库。
有人知道我该怎么做吗?
【问题讨论】:
标签: c# rsa private-key pkcs#8
使用外部库的最简单方法是使用(免费)Chillkat Public / Private Key Component:使用它,可以使用just a few lines of code 导入密钥,如果你愿意为图书馆的其余部分支付 149 美元左右,这也将使处理一般加密概念变得容易得多。
与常规的 Microsoft .NET Framework 不同,Mono 项目确实似乎有一个 PKCS8 implementation,full C# source 可用。如果您绝对不能依赖外部库,这可能适合作为起点,假设与 Mono 代码相关的 (LGPL 2.0) 许可证适用于您...
最后,PKCS #8 format 并不太难解析,并且 RSA/DSA 密钥对对象与 PKCS #11 一致,并且一旦您弄清楚所有位的去向,就相对容易转换为 .NET X509Certificate - - 前段时间我实际上在 VB.NET 中做过这个,但不幸的是我无法共享该代码。
【讨论】:
从 .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 _);
【讨论】:
感谢您的回答。
我使用 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 咨询
【讨论】: