title: Two Way AES Encryption
body: <p>I'm using a class that I found here for AES encryption/decryption. It does work correctly for me, but when I encrypt a string using the EncryptToString method, the encryption contains only numbers. I was expecting it to contain numbers, letters, and symbols. Do you know why it would only contain numbers? Thanks  </p>
  
  <p>This is the code I'm referring to:</p>
  
  <pre><code> public class AESEncryption
  {
      // These can be anything I desire but must be less than or equal to 255
      private byte[] Key = { 222, 237, 16, 14, 28, 26, 85, 45, 114, 184, 27, 192, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 105, 29, 24, 26, 17, 218, 131, 236, 53, 209 };
      private byte[] Vector = { 146, 64, 101, 111, 23, 32, 113, 119, 231, 121, 211, 11, 99, 32, 104, 156 };
  
  
      private ICryptoTransform EncryptorTransform, DecryptorTransform;
      private System.Text.UTF8Encoding UTFEncoder;
  
      public AESEncryption()
      {
          //This is our encryption method 
          RijndaelManaged rm = new RijndaelManaged();
  
          //Create an encryptor and a decryptor using our encryption method, key, and vector. 
          EncryptorTransform = rm.CreateEncryptor(this.Key, this.Vector);
          DecryptorTransform = rm.CreateDecryptor(this.Key, this.Vector);
  
          //Used to translate bytes to text and vice versa 
          UTFEncoder = new System.Text.UTF8Encoding();
      }
  
      /// -------------- Two Utility Methods (not used but may be useful) ----------- 
      /// Generates an encryption key. 
      static public byte[] GenerateEncryptionKey()
      {
          //Generate a Key. 
          RijndaelManaged rm = new RijndaelManaged();
          rm.GenerateKey();
          return rm.Key;
      }
  
      /// Generates a unique encryption vector 
      static public byte[] GenerateEncryptionVector()
      {
          //Generate a Vector 
          RijndaelManaged rm = new RijndaelManaged();
          rm.GenerateIV();
          return rm.IV;
      }
  
  
      /// ----------- The commonly used methods ------------------------------     
      /// Encrypt some text and return a string suitable for passing in a URL. 
      public string EncryptToString(string TextValue)
      {
          return ByteArrToString(Encrypt(TextValue));
      }
  
      /// Encrypt some text and return an encrypted byte array. 
      public byte[] Encrypt(string TextValue)
      {
          //Translates our text value into a byte array. 
          Byte[] bytes = UTFEncoder.GetBytes(TextValue);
  
          //Used to stream the data in and out of the CryptoStream. 
          MemoryStream memoryStream = new MemoryStream();
  
          /* 
           * We will have to write the unencrypted bytes to the stream, 
           * then read the encrypted result back from the stream. 
           */
          #region Write the decrypted value to the encryption stream
          CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write);
          cs.Write(bytes, 0, bytes.Length);
          cs.FlushFinalBlock();
          #endregion
  
          #region Read encrypted value back out of the stream
          memoryStream.Position = 0;
          byte[] encrypted = new byte[memoryStream.Length];
          memoryStream.Read(encrypted, 0, encrypted.Length);
          #endregion
  
          //Clean up. 
          cs.Close();
          memoryStream.Close();
  
          return encrypted;
      }
  
      /// The other side: Decryption methods 
      public string DecryptString(string EncryptedString)
      {
          return Decrypt(StrToByteArray(EncryptedString));
      }
  
      /// Decryption when working with byte arrays.     
      public string Decrypt(byte[] EncryptedValue)
      {
          #region Write the encrypted value to the decryption stream
          MemoryStream encryptedStream = new MemoryStream();
          CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write);
          decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length);
          decryptStream.FlushFinalBlock();
          #endregion
  
          #region Read the decrypted value from the stream.
          encryptedStream.Position = 0;
          Byte[] decryptedBytes = new Byte[encryptedStream.Length];
          encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length);
          encryptedStream.Close();
          #endregion
          return UTFEncoder.GetString(decryptedBytes);
      }
  
      /// Convert a string to a byte array.  NOTE: Normally we'd create a Byte Array from a string using an ASCII encoding (like so). 
      //      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
      //      return encoding.GetBytes(str); 
      // However, this results in character values that cannot be passed in a URL.  So, instead, I just 
      // lay out all of the byte values in a long string of numbers (three per - must pad numbers less than 100). 
      public byte[] StrToByteArray(string str)
      {
          if (str.Length == 0)
              throw new Exception("Invalid string value in StrToByteArray");
  
          byte val;
          byte[] byteArr = new byte[str.Length / 3];
          int i = 0;
          int j = 0;
          do
          {
              val = byte.Parse(str.Substring(i, 3));
              byteArr[j++] = val;
              i += 3;
          }
          while (i &lt; str.Length);
          return byteArr;
      }
  
      // Same comment as above.  Normally the conversion would use an ASCII encoding in the other direction: 
      //      System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 
      //      return enc.GetString(byteArr);     
      public string ByteArrToString(byte[] byteArr)
      {
          byte val;
          string tempStr = "";
          for (int i = 0; i &lt;= byteArr.GetUpperBound(0); i++)
          {
              val = byteArr[i];
              if (val &lt; (byte)10)
                  tempStr += "00" + val.ToString();
              else if (val &lt; (byte)100)
                  tempStr += "0" + val.ToString();
              else
                  tempStr += val.ToString();
          }
          return tempStr;
      }
  }
  </code></pre>