title: Rijndael 256 Encrypt and Decrypt in C# and ASP.net
body: <p>I am working on a Rijndael256 encrypt and decrypt method in C# and it appears that my encrypt method is "working", however; my decrypt method randomly returns an error about the IV or Data I want to be decrypted stating "Invalid length for a Base-64 char array or string." The decrypt will work once or twice and then error. I am guessing it has something to do with the randomly generated IV size or something simple, but any guidance would be great. </p>
  
  <pre><code>  private string encryptData(string data)
      {
  
          byte[] encKey = ASCIIEncoding.UTF8.GetBytes("pemgail9uzpgzl88");
  
          Rijndael aes = Rijndael.Create();
          aes.KeySize = 256;
          aes.BlockSize = 256;
          aes.Mode = CipherMode.CBC;
          aes.Padding = PaddingMode.PKCS7;
          aes.Key = encKey;
  
          ICryptoTransform crypto = aes.CreateEncryptor(aes.Key, aes.IV);
          byte[] txt = ASCIIEncoding.UTF8.GetBytes(data);
          byte[] cipherText = crypto.TransformFinalBlock(txt, 0, txt.Length);
  
  
          return Convert.ToBase64String(cipherText) + "&amp;iv=" + Convert.ToBase64String(aes.IV); 
      }                  
  </code></pre>
  
  <p>My decrypt method:</p>
  
  <pre><code>    private string decryptData(string encData, string encIV)
      {
  
          byte[] encKey = ASCIIEncoding.UTF8.GetBytes("pemgail9uzpgzl88");
          string returnValue = Convert.ToBase64String(encKey);
  
          byte[] myIv = Convert.FromBase64String(encIV);
  
          byte[] myMessage = ASCIIEncoding.UTF8.GetBytes(encData);
  
          Rijndael aes = Rijndael.Create();
          aes.KeySize = 256;
          aes.BlockSize = 256;
          aes.IV = myIv;
          aes.Mode = CipherMode.CBC;
          aes.Padding = PaddingMode.PKCS7;
          aes.Key = encKey;
  
          ICryptoTransform crypto = aes.CreateDecryptor(aes.Key, aes.IV);
          byte[] txt = Convert.FromBase64String(encData);
          byte[] cipherText = crypto.TransformFinalBlock(txt, 0, txt.Length);
  
          return Encoding.UTF8.GetString(cipherText);
      }
  </code></pre>
  
  <p>As a test I am encrypting the data, redirecting the test page to itself and then taking the values in the QueryStrings to use for the decrypt method.</p>
  
  <pre><code>    protected void Page_Load(object sender, EventArgs e)
      {
          if (Request.QueryString["data"] != null &amp;&amp; Request.QueryString["iv"] != null)
          {
              string test = decryptData(Request.QueryString["data"], Request.QueryString["iv"]);
              Response.Write(test);
          }
          else
          {
              string test = encryptData("BrassMonkey");
              Response.Redirect("Rijindael.aspx?data=" + test);
          }
  
      }
  </code></pre>