2012-03-23 16 views
6

Sto creando un'applicazione C# Winforms che invia i dati POST a un server su HTTPS.Codifica RSA fornendo modulo ed esponente

Il meccanismo di login dovrebbe essere simile a questo:

  1. mando il nome utente al server, risponde con rsa-modulo e rsa-esponente

  2. ho crittografare la password utilizzando questi determinati parametri e inviare nome utente + password al server per l'autenticazione

ho provato la classe RSACryptoServiceProvider, ma non riesco a fi nd campioni o qualcosa di simile su come possiamo fare la crittografia usando un modulo e un esponente?.

Penso che senza specificare alcun valore, il suo fare parametri di cifratura di default ..

Quindi, se qualcuno ha fatto prima, mi possono dare qualche suggerimento per favore? grazie

UPDATE: secondo il suggerimento di Carsten Konig,. Ho provato a farlo con RSAParameters e RSA.ImportParameters, ma restituisce un errore "BAD DATA" con eccezione crittografica. Il mio codice è riportato di seguito.

Ho anche provato RSA.FromXmlString(mykey); (dove mykey contiene una stringa xml con modulo ed exp) ma ho anche un errore "BAD DATA" con eccezione crittografica ... qualche idea a qualcuno? o se ha qualche bug microsoft, qualcuno può suggerire qualche altra libreria decente per farlo facilmente?

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

risposta

6

È possibile eseguire questa operazione utilizzando il metodo RSACryptoServiceProvider.Encrypt. Sarà inoltre necessario utilizzare il metodo RSACryptoServiceProvider.ImportParameters e passarlo a una struttura RSAParameters (è qui che si imposta esponente, modulo, ecc.).

Si prega di dare un'occhiata alla documentazione nel link per gli RSAParametri - è molto ben documentato quale parametro si deve passare per quale campo di struttura - non dovrebbe essere un problema se si ora l'algoritmo.

EDIT: qui è l'esempio direttamente dal 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); 
     } 
    } 
} 

prega di notare che solo la chiave/IV viene crittografato - byte non arbitrari - la lunghezza di questi byte è troppo importante!

La lunghezza consentita è descritta in MSDN e dipende dal sistema operativo!

+0

hi, Carsten Konig, grazie per la risposta .. Ho provato, ma restituisce un errore "dati non validi" con l'eccezione di crittografia .. qualsiasi idea, che cosa posso fare male? ho aggiunto il codice qui sotto 'RSAParameters rsaparam = new RSAParameters(); rsaparam.Modulus = modbytes; rsaparam.Exponent = expbytes; RSACryptoServiceProvider RSA = nuovo RSACryptoServiceProvider(); RSA.ImportParameters (rsaparam); byte [] encryptedData = RSA.Encrypt (dataToEncrypt, false); ' –

+0

ho anche provato RSA.FromXmlString (mykey); (dove mykey contiene una stringa xml con modulo ed exp) ma anche in questo ho un errore "BAD DATA" con eccezione crittografica ... qualche idea a qualcuno? o se ha qualche bug microsoft, qualcuno può suggerire qualche altra libreria decente per farlo facilmente? –

+0

è difficile dirlo - c'era qualcosa nell'eccezione interna? Forse hai sbagliato la chiave-chiave ... pensandoci - sai che la lunghezza dei dati da crittografare deve avere una certa lunghezza? – Carsten

0

Un suggerimento ulteriore che è stato molto utile per me:

In questa linea,

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

PublicKey può anche essere una diretta, semplice, array di byte che si può ottenere dal "Public Key "campo di un certificato X509 (direttamente).

0

Se si utilizza RSACryptoServiceProvider.ToXmlString per esportare il modulo e l'esponente inviati dal server, è necessario utilizzare 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; 
    } 
Problemi correlati