RSACryptoServiceProvider和openSSL之间的互操作性

时间:2010-07-15 21:42:45

标签: c# openssl rsacryptoserviceprovider

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

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

现在,我想在openSSH中使用它,但键格式看起来并不相同。 有谁知道如何将公钥和私钥转换为openSSH可以使用的文件?

谢谢!

2 个答案:

答案 0 :(得分:8)

我真的需要与RSACryptoServiceProvider实现Openssl互操作性,以便我可以实现软件许可证密钥系统(Ref)。

我需要能够使用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

更多来......

答案 1 :(得分:2)

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

  

OpenSSL:只能签署一小部分   适合单个块的数据。   数据被填充并签名。该   反向称为“验证”,并在其中   情况下数据是“无符号的”然后   unpadded和原始数据是   返回。

     

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

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