12

我使用 .NET 类RSACryptoServiceProvider来获取密钥对:

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
  File.WriteAllText ("PublicKeyOnly.xml", rsa.ToXmlString (false));
  File.WriteAllText ("PublicPrivate.xml", rsa.ToXmlString (true));
}

现在,我想将它与 openSSH 一起使用,但密钥格式看起来完全不同。有谁知道如何将公钥和私钥都转换为 openSSH 可以使用的文件?

谢谢!

4

2 回答 2

8

我真的需要实现 Openssl 与 RSACryptoServiceProvider 的互操作性,这样我才能实现软件许可证密钥系统(参考)。

我需要能够使用 openssl 在 Linux 中创建私钥和公钥,以便以后可以将它们用于 PHP Web 应用程序中的许可证管理。然而,也可以将它们用作 VB.Net 应用程序中的 RSA 签名许可系统的基础。

经过一周的搜索,我最终发现这是完全可能的,所以我想我会分享它。

在 Linux(或任何其他有用的操作系统)上启动并使用 openssl 创建私钥(private.pem)、公钥(public.pem)、证书(certificate.crt)和个人信息交换文件(certificate.pfx) )。不要担心 CN 和 emailAddress 字段,证书和 pfx 文件仅用作将公钥或私钥获取到 RSACryptoServiceProvider 对象的工具。

openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -pubout
openssl req -nodes -x509 -days 3650 -subj '/CN=www.example.com/emailAddress=info@example.com' -new -key private.pem -out certificate.crt
openssl pkcs12 -export -out certificate.pfx -inkey private.pem -in certificate.crt

现在将私钥获取到代码中:

Dim cert As New X509Certificate2("certificate.pfx", "", X509KeyStorageFlags.Exportable)
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PrivateKey, RSACryptoServiceProvider)

如果您需要私钥或公钥,请尝试以下操作:

msgbox(rsaProvider.ToXmlString(True))  'Private key in XML format
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format

要将公钥放入代码中:

Dim cert As New X509Certificate2("certificate.crt")
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PublicKey.Key, RSACryptoServiceProvider)

如果您需要公钥,请尝试以下操作:

msgbox(rsaProvider.ToXmlString(False))  'Public key in XML format

更多的来......

于 2012-05-28T13:46:37.643 回答
2

这篇关于使用OpenSSL 和 RSACryptoServiceProvider的博客文章指出这是可能的,但作者最终使用Chilkat RSA库最终在 C# 中与 OpenSSL 进行互操作。.NET 世界不支持 PEM 格式,因此您可以使用 JavaScience 中的这个名为OpenSSLKey.cs的库;但是,正如博客文章的作者提到的那样,他们因此遇到了问题(引用):

OpenSSL:只能对适合单个块的少量数据进行签名。数据被填充和签名。反过来称为“验证”,在这种情况下,数据是“无符号”的,然后未填充并返回原始数据。

[Windows]:可以签署任意数量的数据。Sign* 方法首先对数据进行哈希处理,然后对哈希进行填充和签名。Verify* 方法需要三个输入:原始数据、哈希算法名称和签名数据。对原始数据进行散列处理,将 unsigning/unpadding 的结果与原始数据的散列值进行比较。

所以我建议你使用 Chilkat RSA 库。

于 2011-07-06T20:53:56.900 回答