title: How can I encrypt data in Delphi and in C# so that they are compatible?
body: <p>I'd like to encrypt some data on the client in my Delphi application in a way that is compatible with the encryption on my server.  On my server, I encrypt the data using this C# code:</p>
  
  <pre><code>public class AesCryptUtils
  {
  
      private static byte[] _salt = Encoding.ASCII.GetBytes("o6806642kbM7c5");
  
      /// &lt;summary&gt; 
      /// Encrypt the given string using AES.  The string can be decrypted using  
      /// DecryptStringAES().  The sharedSecret parameters must match. 
      /// &lt;/summary&gt; 
      /// &lt;param name="plainText"&gt;The text to encrypt.&lt;/param&gt; 
      /// &lt;param name="sharedSecret"&gt;A password used to generate a key for encryption.&lt;/param&gt; 
      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 
          AesManaged aesAlg = null;              // AesManaged 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 AesManaged object 
              // with the specified key and IV. 
              aesAlg = new AesManaged();
              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 AesManaged object. 
              if (aesAlg != null)
                  aesAlg.Clear();
          }
  
          // Return the encrypted bytes from the memory stream. 
          return outStr;
      }
  }
  </code></pre>
  
  <p><strong>How could this encryption algorithm be implemented in Delphi?</strong>  The resulting encrypted data must be the same given the same inputs.</p>