2010-07-15 26 views
12

Tôi đã sử dụng các lớp .NET RSACryptoServiceProvider để có được một cặp khóa:Khả năng cộng tác giữa RSACryptoServiceProvider và OpenSSL

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

Bây giờ, tôi muốn sử dụng điều này với OpenSSH, nhưng định dạng chìa khóa trông không có gì giống nhau. Có ai biết cách chuyển đổi cả khóa công cộng và khóa riêng thành các tệp mà openSSH có thể sử dụng không?

Cảm ơn!

+2

http://stackoverflow.com/questions/497428/how-do-i-import-an-rsa-public -key-from-net-into-openssl có vẻ như nó sẽ hoạt động, phải không? –

Trả lời

2

Bài đăng trên blog này về sử dụng OpenSSL and RSACryptoServiceProvider nói rằng điều đó là có thể, nhưng tác giả đã kết thúc bằng cách sử dụng Thư viện Chilkat RSA để cuối cùng tương thích với OpenSSL từ bên trong C#. Định dạng PEM không được hỗ trợ trong thế giới .NET để bạn có thể sử dụng thư viện này từ JavaScience được gọi là OpenSSLKey.cs; tuy nhiên, như tác giả của bài viết trên blog đề cập đến họ đã có vấn đề do này (quoted):

OpenSSL: Chỉ có thể ký bit nhỏ của dữ liệu phù hợp trong một khối duy nhất. Dữ liệu được đệm và ký. Số lùi được gọi là "xác minh" và trong trường hợp đó trường hợp dữ liệu là "chưa ký" và sau đó chưa được đệm và dữ liệu gốc được trả về .

[Windows]: Có thể ký bất kỳ số lượng dữ liệu nào. Phương thức Sign * đầu tiên băm dữ liệu và sau đó băm được đệm và đã được ký. Các phương thức Verify * mong đợi ba đầu vào: dữ liệu gốc, một tên thuật toán băm và dữ liệu chữ ký . Dữ liệu gốc được băm và kết quả của việc hủy/bỏ ghim là so với số băm của dữ liệu ban đầu .

Vì vậy, tôi khuyên bạn nên đi với thư viện RSA của Chilkat.

+1

Không, tôi nghĩ OpenSSL có thể ký bất kỳ lượng dữ liệu nào, ngoài ra bạn cũng sử dụng kết hợp EVP_SignInit, 0 hoặc EVP_SignUpdate và EVP_SignFinal. Nó không quá khó để thực hiện ICryptoTransform và các giao diện .NET Crypto khác trên một trình bao bọc gốc OpenSSL như openssl-net trên sourceforge. – maxwellb

8

Tôi thực sự cần thiết để đạt được khả năng tương tác Openssl với RSACryptoServiceProvider, để tôi có thể triển khai hệ thống khóa cấp phép phần mềm (Ref).

Tôi cần thiết để có thể tạo khóa riêng và khóa công khai trong Linux bằng openssl để sau này chúng có thể được sử dụng để quản lý giấy phép trong ứng dụng web PHP. Tuy nhiên, cũng sử dụng chúng như là cơ sở của một hệ thống giấy phép chữ ký RSA trong một ứng dụng VB.Net.

Sau một tuần tìm kiếm, cuối cùng tôi phát hiện ra rằng điều này là hoàn toàn có thể, vì vậy tôi nghĩ tôi sẽ chia sẻ nó.

Bắt đầu trên Linux (hoặc bất kỳ hệ điều hành hữu ích nào khác) và sử dụng openssl để tạo khóa riêng (private.pem), khóa công cộng (public.pem), chứng chỉ (certificate.crt) và Tệp Trao đổi thông tin cá nhân (certificate.pfx). Đừng lo lắng về các trường CN và emailAddress, các chứng chỉ và các tệp pfx chỉ được sử dụng như một phương tiện để lấy khóa công cộng hoặc khóa riêng vào đối tượng 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 

Bây giờ để có được khóa bí mật vào mã:

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

Nếu bạn cần khóa riêng hoặc khóa công khai thử điều này:

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

Để có được khóa công khai vào mã:

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

Nếu bạn nee d khóa công khai thử điều này:

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

More tới .....

Các vấn đề liên quan