2016-09-13 18 views
2

この古いC#コードに遭遇しましたが、.NET Framework 4.5で同じことをするためにもっとエレガントでコンパクトなものがあるのか​​どうか疑問に思っていました。結果の文字。'='文字を使用せずに暗号化されたキーを作成する

ありがとうございました。

EDIT:さらに40という数字が出て、なぜ長いテキストを処理する必要がないのですか?

public static string BuildAutoLoginUrl(string username) 
    { 
     // build a plain text string as username#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     if (username.Length < 40) 
     { 
      //cycle to avoid '=' character at the end of the encrypted string 
      int len = username.Length; 

      do 
      { 
       if (len == username.Length) 
       { 
        username += "#"; 
       } 
       username += "A"; 
       len++; 

      } while (len < 41); 
     } 

     return @"http://www.domain.com/Account/AutoLogin?key=" + EncryptStringAES(username, sharedKey); 
    } 

    public static string EncryptStringAES(string plainText, string sharedSecret) 
    { 
     if (string.IsNullOrEmpty(plainText)) 
      throw new ArgumentNullException("plainText"); 
     if (string.IsNullOrEmpty(sharedSecret)) 
      throw new ArgumentNullException("sharedSecret"); 

     string outStr = null; // Encrypted string to return 
     RijndaelManaged aesAlg = null; // RijndaelManaged object used to encrypt the data. 

     try 
     { 
      // generate the key from the shared secret and the salt 
      Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt); 

      // Create a RijndaelManaged object 
      // with the specified key and IV. 
      aesAlg = new RijndaelManaged(); 
      aesAlg.Key = key.GetBytes(aesAlg.KeySize/8); 
      aesAlg.IV = key.GetBytes(aesAlg.BlockSize/8); 

      // 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); 
        } 
       } 
       outStr = Convert.ToBase64String(msEncrypt.ToArray()); 
      } 
     } 
     finally 
     { 
      // Clear the RijndaelManaged object. 
      if (aesAlg != null) 
       aesAlg.Clear(); 
     } 

     // Return the encrypted bytes from the memory stream. 
     return outStr; 
    } 

ありがとうございます。

+2

なぜあなたは= '出力に'避けるために必要があるのですか? –

+0

等号を削除しないでください。それらをURLにエンコードします。 https://msdn.microsoft.com/en-us/library/zttxte6w(v=vs.110).aspx – Rob

+0

これは、暗号化されたデータを正しいバイト数にするためのパディングです。 – Crowcoder

答えて

2

等号は、その一部がBase64でエンコードされた文字列であるためです。暗号化処理の結果、すべての項目が読み込み可能なテキストとして表現できるわけではないバイト配列になるため、Base64でエンコードされます。 Base64以外のものとしてエンコードしようとするといいかもしれませんが、Base32などを使用すると、結果として得られる文字列がずっと長くなることがあります。

関連する問題