【问题标题】:Interoperability between RSACryptoServiceProvider and openSSLRSACryptoServiceProvider 和 openSSL 之间的互操作性
【发布时间】:2011-03-16 16:13:55
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

标签: c# openssl rsacryptoserviceprovider


【解决方案1】:

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

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

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

在 Linux(或任何其他有用的操作系统)上启动并使用 openssl 创建私钥 (private.pem)、公钥 (public.pem)、证书 (certificate.crt) 和个人信息交换文件 (证书.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

还有更多......

【讨论】:

    【解决方案2】:

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

    OpenSSL:只能签署一小部分 适合单个块的数据。 数据被填充和签名。这 reverse 被称为“验证”,并且在那个 如果数据是“无符号”,然后 未填充,原始数据为 返回。

    [Windows]:可以签署任意数量的 数据。 Sign* 方法首先对 数据,然后填充哈希并 签。验证 * 方法期望 三个输入:原始数据,a 哈希算法名称和签名 数据。原始数据经过哈希处理 取消签名/取消填充的结果是 与原始的哈希相比 数据。

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

    【讨论】:

    • 不,我认为 OpenSSL 可以签署任何数量的数据,而且..您使用 EVP_SignInit、零个或多个 EVP_SignUpdate 和 EVP_SignFinal 的组合。在 OpenSSL 原生包装器(例如 sourceforge 上的 openssl-net)之上实现 ICryptoTransform 和其他 .NET Crypto 接口并不难。
    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2021-05-06
    相关资源
    最近更新 更多