2012-05-14 23 views
0

ウェブアプリケーションで保護されたデータの暗号化と復号化に「AesManaged」を使用しています。私のシナリオでは、ユーザーログイン時に "Email + CurrentDate"に基づいてトークンを作成し、ユーザーに暗号化された形式で送信します(暗号化はAESManagedクラスを使用して行われます) Show Report "を選択すると、ユーザー/クライアント・アプリケーションは要求とともにその暗号化トークンも送信します。サーバ側では、トークンを復号化し、解読されたトークンに基づいて条件論理を実行した後、与えられたユーザがこの方法にアクセスできるか否か(一種の許可チェック)を決定する。AESManaged(C#)を回避する方法 "解読するデータの長さは無効です。"

ユーザーがサーバーから取得した正しい暗号化された文字列を提供しているか、同じ長さであるが、ユーザーが暗号化された文字列内の文字を置き換えると、基本フローで正常に動作しています。

しかし、ユーザーが(たとえば)54文字の文字列を取得してもサーバーに7文字しか送信しない場合、問題が発生します。次の例外が発生します。

ユーザーが無効なデータを提供しても、この例外は回避したいと考えています。だから、基本的には文字列を解読しなければなりません。それが無効なトークンであれば、私はそのリソースへのアクセスを制限できます。どうすればこれを達成できますか?あなたの答えは高く評価されます。

例外の詳細:例外が発生

特定のコードブロック。

// Create the streams used for decryption. 
       using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
       { 
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
        { 
         using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
         { 
          plaintext = srDecrypt.ReadToEnd(); 
         } 
        } 
       } 

例外:「復号するデータの長さが無効です。」

例外の詳細:

ターゲットサイト:{バイト[] TransformFinalBlock(バイト[]、Int32、Int32)をオーバーライドします}

宣言型:{NAME = "RijndaelManagedTransform" フルネーム=「System.Security .Cryptography.RijndaelManagedTransform "}

名: TransformFinalBlock

注:私は暗号化と復号の両方の方法で同じ鍵とivを提供しています。

コード:

public string EncryptAuthenticationTokenAes(string plainText, byte[] Key, byte[] IV) 
     { 


      byte[] encrypted; 
      // Create an AesManaged object 
      // with the specified key and IV. 
      using (AesManaged aesAlg = new AesManaged()) 
      { 
       aesAlg.Key = Key; 
       aesAlg.IV = IV; 


       // Create a decrytor to perform the stream transform. 
       ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 

       // Create the streams used for encryption. 
       using (MemoryStream msEncrypt = new MemoryStream()) 
       { 
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
        { 
         using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
         { 

          //Write all data to the stream. 
          swEncrypt.Write(plainText); 
         } 
         encrypted = msEncrypt.ToArray(); 
        } 
       } 
      } 
      // Return the encrypted bytes from the memory stream. 
      return Convert.ToBase64String(encrypted); 

     } 

     public string DecryptPasswordAes(string encryptedString, byte[] Key, byte[] IV) 
     { 
      // becuase it is base64, if mod4>0 then it is consider as invalid token 
      int mod4 = encryptedString.Length % 4; 
      if (mod4 > 0) 
      { 
       return string.Empty; 
      } 
      byte[] cipherText = Convert.FromBase64String(encryptedString); 
      // Declare the string used to hold 
      // the decrypted text. 
      string plaintext = null; 

      // Create an AesManaged object 
      // with the specified key and IV. 
      using (AesManaged aesAlg = new AesManaged()) 
      { 
       aesAlg.Key = Key; 
       aesAlg.IV = IV; 

       // Create a decrytor to perform the stream transform. 
       ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 

       // Create the streams used for decryption. 
       using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
       { 
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
        { 
         using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
         { 
          plaintext = srDecrypt.ReadToEnd(); 
         } 
        } 
       } 

      } 

      return plaintext; 
     } 

答えて

0

は暗号化された文字列の長さを保存して、長さが同じであるかどうかを確認、この

  // Create the streams used for decryption. 
      using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
      { 
       using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
        { 
         if (encryptedString.Length != aesAlg.BlockSize) 
         { 
          // Handle invalid token here. 
         } 
         plaintext = srDecrypt.ReadToEnd(); 
        } 
       } 
      } 
1

それは、これらの7つの文字を取り、それらに任意の意味の変換を実行するための方法がないことを言っています - それはがそれらを使用して暗号解読のいずれかの種類を実行することはできません。

復号化を試みる前に長さチェックを実行するか、例外をキャッチしてください。どちらの場合も、あなたの「無効なトークンが受信されました」という論理を下ります。

0

を試してみてください。そうであれば、解読方法を呼び出すために進む。