简体   繁体   English

如何在Delphi和C#中加密数据以使它们兼容?

[英]How can I encrypt data in Delphi and in C# so that they are compatible?

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. 我想以一种与我服务器上的加密兼容的方式在我的Delphi应用程序中加密客户端上的一些数据。 On my server, I encrypt the data using this C# code: 在我的服务器上,我使用这个C#代码加密数据:

public class AesCryptUtils
{

    private static byte[] _salt = Encoding.ASCII.GetBytes("o6806642kbM7c5");

    /// <summary> 
    /// Encrypt the given string using AES.  The string can be decrypted using  
    /// DecryptStringAES().  The sharedSecret parameters must match. 
    /// </summary> 
    /// <param name="plainText">The text to encrypt.</param> 
    /// <param name="sharedSecret">A password used to generate a key for encryption.</param> 
    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;
    }
}

How could this encryption algorithm be implemented in Delphi? 如何在Delphi中实现这种加密算法? The resulting encrypted data must be the same given the same inputs. 给定相同的输入,得到的加密数据必须相同。

The related questions list for your question contains this link which mentions some AES implementation for Delphi. 您的问题的相关问题列表包含此链接 ,其中提到了Delphi的一些AES实现。 I'm sure you can find some more and you can always use something like OpenSSL or CryptoAPI but you may need to write Delphi bindings for them yourself. 我相信你可以找到更多,你总是可以使用像OpenSSL或CryptoAPI这样的东西,但你可能需要自己编写Delphi绑定。

Note that as you don't pass the key directly you will need to implement the key derivation too. 请注意,由于您未直接传递密钥,因此您还需要实现密钥派生。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM