2010-07-15 75 views
12

之间的互操作性,我使用的.NET类RSACryptoServiceProvider得到一个密钥对:现在的RSACryptoServiceProvider和OpenSSL

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

,我想在OpenSSH使用,但关键的格式看起来没什么的一致好评。 有谁知道如何将公钥和私钥转换为openSSH可以使用的文件?

谢谢!

+2

http://stackoverflow.com/questions/497428/how-do-i-import-an-rsa-public -key-from-net-into-openssl看起来应该起作用,不是吗? – 2011-06-06 14:58:41

回答

2

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

OpenSSL:它只能申请适合在单个区块内的 数据的小位。 数据被填充并签名。 反向被称为“验证”,并在那 的情况下,数据是“无符号”,然后 unpadded和原始数据是 返回。

[Windows]:可以签署任何数量的 数据。 Sign *方法首先将数据散列为 ,然后填充散列并且对 进行签名。 Verify *方法期望 三个输入:原始数据, 散列算法名称和签名 数据。原始数据被散列,并且与原始的 数据的散列相比,无符号/非填充的结果是 。

所以我建议你去与奇尔卡特RSA库。

+1

不,我认为OpenSSL可以签署任何数量的数据,也可以使用EVP_SignInit,零个或多个EVP_SignUpdate和一个EVP_SignFinal。在OpenSSL本机包装(如sourceforge上的openssl-net)上实现ICryptoTransform和其他.NET Crypto接口并不难。 – maxwellb 2011-09-08 19:06:46

8

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

我需要能够在Linux中使用openssl创建私钥和公钥,以便稍后可以将它们用于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/[email protected]' -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) 

如果您需要d公钥试试这个:

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

更多来.....