2012-03-23 9 views
6

私はHTTPS経由でサーバーにデータをPOSTするC#Winformsアプリケーションを作成しています。ログインメカニズムがこのようなことになっているモジュラスと指数を与えることによるRSA暗号化

:私はサーバにユーザ名を送信

  1. 、それは私がこれらを使用してパスワードを暗号化するRSAモジュラスおよびRSA-指数

  2. で応答します私はRSACryptoServiceProviderクラスを試してみましたが、私はFIができないパラメータが与えられ、認証

のためにサーバにユーザ名+パスワードを送信サンプルや何かをで教えてください。与えられた法と指数を使って暗号化を行う方法は?

私は任意の値を指定せずに、そのデフォルトの暗号化パラメータをやっていると思い...誰もが、彼らは私にいくつかのヒントを与えることができ、この前に行っているので、場合

してください?ありがとう

更新日:氏Carsten Konig、。私はRSAParametersとRSA.ImportParametersでそれをやろうとしましたが、暗号例外を使って "不良データ"エラーを返します。私のコードは以下の通りです。

私も試しましたRSA.FromXmlString(mykey); (mykeyはモジュラスとexpを持つxml文字列を含んでいます)しかし、私はまた、暗号例外を使った "不良データ"エラーを受け取ります。またはいくつかのマイクロソフトのバグは、誰もがこれを簡単に行うためにいくつかの他のまともなライブラリを提案することができますか?

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

答えて

6

あなたはRSACryptoServiceProvider.Encrypt方法を使用することによってこれを行うことができます。また、RSACryptoServiceProvider.ImportParametersメソッドを使用し、RSAParameters構造体(これは指数、モジュラスなどを設定します)を渡す必要があります。

RSAParametersのリンクにあるドキュメントを見てください。これは、どの構造パラメータを渡す必要があるパラメータが非常によく文書化されています。

編集:ここストレート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); 
     } 
    } 
} 

のみキー/ IVは暗号化されることに注意してください - ない任意のバイト - これらのバイトの長さはあまりにも重要です!

許容される長さはMSDNに記載されており、OSによって異なります。

+0

やあ、カーステンのケーニッヒは、返事をありがとう..私はそれを試してみましたが、それは、暗号化の例外を除いて、「BAD DATA」エラーを返しますか?私は以下のコードを 'RSAParameters rsaparam = new RSAParameters(); rsaparam.Modulus = modbytes; rsaparam.Exponent = expbytes; RSACryptoServiceProvider RSA =新しいRSACryptoServiceProvider(); RSA.ImportParameters(rsaparam); byte [] encryptedData = RSA.Encrypt(dataToEncrypt、false); ' –

+0

私もRSA.FromXmlString(mykey)を試しました。 (mykeyはmodulusとexpを持つxml文字列を含んでいますが)暗号例外を含む "不良データ"エラーが発生します。またはいくつかのマイクロソフトのバグは、誰もがこれを簡単に行うためにいくつかの他のまともなライブラリを提案することができますか? –

+0

内部の例外には何かがあったのでしょうか?暗号化するデータの長さに一定の長さがあることがわかっていますか? – Carsten

0

私にとって非常に有用であった1つの追加ヒント:この行で

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

のPublicKeyはまた、あなたが「公開鍵から取得することができますバイトの直接的な、単純な、配列にすることができます"X509証明書のフィールド(直接)。

0

RSACryptoServiceProviderを使用している場合。ToXmlStringサーバーが送信するモジュラスと指数をエクスポートするには、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; 
    } 
関連する問題