2010-07-15 73 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 

更多來.....