2012-03-23 34 views
6

Tôi đang tạo ứng dụng C# Winforms POSTs dữ liệu tới máy chủ qua HTTPS.Mã hóa RSA bằng cách cung cấp mô-đun và số mũ

Cơ chế đăng nhập được coi là như thế này:

  1. tôi gửi tên người dùng đến máy chủ, nó phản ứng với rsa-mô đun và rsa-mũ

  2. tôi mã hóa mật khẩu sử dụng các các thông số đã cho và gửi tên người dùng + mật khẩu đến máy chủ để xác thực

Tôi đã thử lớp RSACryptoServiceProvider, nhưng tôi không thể nd mẫu hoặc bất cứ điều gì nói trên làm thế nào chúng ta có thể làm việc mã hóa bằng cách sử dụng một mô-đun nhất định và số mũ?.

Tôi nghĩ rằng nếu không có quy định cụ thể bất kỳ giá trị, nó làm thông số mã hóa mặc định ..

Vì vậy, nếu ai đã làm điều này trước đây, họ có thể cho tôi một số gợi ý xin vui lòng? cảm ơn

CẬP NHẬT: theo đề xuất của ông Carsten Konig,. Tôi đã cố gắng làm điều đó với RSAParameters và RSA.ImportParameters, nhưng nó trả về lỗi "BAD DATA" với ngoại lệ mã hóa. Mã của tôi được đưa ra dưới đây.

Tôi cũng đã thử RSA.FromXmlString(mykey); (trong đó mykey chứa chuỗi xml có modulus và exp) nhưng tôi cũng nhận được một lỗi "BAD DATA" với ngoại lệ mã hóa ... bất kỳ ý tưởng nào? hoặc nếu một số lỗi microsoft của nó, bất cứ ai có thể đề nghị một số thư viện phong nha khác để làm điều này một cách dễ dàng?

RSAParameters rsaparam = new RSAParameters(); 
rsaparam.Modulus = modbytes; 
rsaparam.Exponent = expbytes; 
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider() ; 
RSA.ImportParameters(rsaparam); 
byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false) 

Trả lời

6

Bạn có thể thực hiện việc này bằng cách sử dụng phương thức RSACryptoServiceProvider.Encrypt. Bạn cũng sẽ cần sử dụng phương thức RSACryptoServiceProvider.ImportParameters và chuyển nó qua cấu trúc RSAParameters (đây là nơi bạn đặt số mũ, mô-đun, v.v.).

Vui lòng xem tài liệu trong liên kết cho các RSAParameters - nó được ghi lại rất rõ thông số nào bạn phải chuyển cho trường cấu trúc - sẽ không có vấn đề gì nếu bạn là thuật toán.

EDIT: đây là ví dụ trực tiếp từ MSDN-site:

class RSACSPSample 
{ 

    static void Main() 
    { 
     try 
     {  //initialze the byte arrays to the public key information. 
      byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56, 
            74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222, 
            207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175, 
            108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194, 
            240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139, 
            168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171, 
            38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93, 
            106,99,179,68,175,211,164,116,64,148,226,254,172,147}; 

      byte[] Exponent = {1,0,1}; 

      //Values to store encrypted symmetric keys. 
      byte[] EncryptedSymmetricKey; 
      byte[] EncryptedSymmetricIV; 

      //Create a new instance of RSACryptoServiceProvider. 
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 

      //Create a new instance of RSAParameters. 
      RSAParameters RSAKeyInfo = new RSAParameters(); 

      //Set RSAKeyInfo to the public key values. 
      RSAKeyInfo.Modulus = PublicKey; 
      RSAKeyInfo.Exponent = Exponent; 

      //Import key parameters into RSA. 
      RSA.ImportParameters(RSAKeyInfo); 

      //Create a new instance of the RijndaelManaged class. 
      RijndaelManaged RM = new RijndaelManaged(); 

      //Encrypt the symmetric key and IV. 
      EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false); 
      EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false); 

      Console.WriteLine("RijndaelManaged Key and IV have been encrypted with RSACryptoServiceProvider."); 

     } 
     //Catch and display a CryptographicException 
     //to the console. 
     catch(CryptographicException e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

Xin lưu ý rằng chỉ có chìa khóa/iv bị mã hóa - byte không tùy ý - chiều dài của những byte là quan trọng quá!

Độ dài cho phép được mô tả trong MSDN tùy thuộc vào hệ điều hành!

+0

hi, carsten konig, cảm ơn bạn đã trả lời .. tôi đã thử, nhưng nó trả về lỗi "BAD DATA" với ngoại lệ mật mã .. bất kỳ ý tưởng nào, tôi có thể làm gì sai? tôi đã thêm mã bên dưới 'RSAParameters rsaparam = new RSAParameters(); rsaparam.Modulus = modbytes; rsaparam.Exponent = expbytes; RSACryptoServiceProvider RSA = RSACryptoServiceProvider mới(); RSA.ImportParameters (rsaparam); byte [] encryptedData = RSA.Encrypt (dataToEncrypt, false); ' –

+0

tôi cũng đã thử RSA.FromXmlString (mykey); (nơi mykey có chứa một chuỗi xml với modulus và exp) nhưng trong đó tôi cũng nhận được một "BAD DATA" errror với ngoại lệ mật mã ... bất kỳ ý tưởng ai? hoặc nếu một số lỗi microsoft của nó, bất cứ ai có thể đề nghị một số thư viện phong nha khác để làm điều này một cách dễ dàng? –

+0

thật khó để nói - có điều gì đó trong ngoại lệ bên trong không? Có lẽ bạn có sai lầm quan trọng thứ mười ... suy nghĩ về nó - bạn biết rằng chiều dài của dữ liệu để mã hóa phải có một chiều dài nhất định? – Carsten

0

Một gợi ý bổ sung mà là rất hữu ích cho tôi:

Trong dòng này,

//Set RSAKeyInfo to the public key values. 
SAKeyInfo.Modulus = PublicKey; 

PublicKey cũng có thể là một trực tiếp, đơn giản, mảng byte mà bạn có thể nhận được từ các "Khóa công cộng "trường của Chứng chỉ X509 (trực tiếp).

0

Nếu bạn đang sử dụng RSACryptoServiceProvider.ToXmlString để xuất mô-đun và số mũ mà máy chủ gửi, bạn cần sử dụng Convert.FromBase64String.

public RSAParameters SetPublicKey(string modulus, string exponent) 
    { 
     RSAParameters result = new RSAParameters(); 
     result.Modulus = Convert.FromBase64String(modulus); 
     result.Exponent = Convert.FromBase64String(exponent); 

     return result; 
    } 
Các vấn đề liên quan