首页 > 解决方案 > 如何使用 AES 在 C# 中对称加密和解密某些数据?

问题描述

我正在尝试使用 AES 加密和解密一些数据。但我只会得到乱码输出。我究竟做错了什么?

static void Test()
{
    byte[] myFileBytes; // Will contain encrypted data. First the IV, then the ciphertext.
    var myPassword = "helloworld";
    var dataToEncrypt = "this is a test";

    // STEP 1: Encrypt some data:

    byte[] key;

    using (var sha256 = SHA256.Create())
        key = sha256.ComputeHash(Encoding.UTF8.GetBytes(myPassword));

    using (var myFileStream = new MemoryStream())
    using (var aes = System.Security.Cryptography.Aes.Create())
    {
        aes.Key = key;
        myFileStream.Write(aes.IV); // Use the default created by AES, which is presumably non-pseudo random

        using (var cryptoStream = new CryptoStream(myFileStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
        {
            cryptoStream.Write(Encoding.UTF8.GetBytes(dataToEncrypt));
            cryptoStream.Flush();

            myFileBytes = myFileStream.ToArray(); // We are done!

        } // Disposing CryptoStream disposes the underlying MemoryStream
    }

    // STEP 2: Decrypt it to verify that it works

    using (var aes = System.Security.Cryptography.Aes.Create())
    {
        using (var myFileStream = new MemoryStream(myFileBytes))
        {
            var iv = new byte[aes.IV.Length];

            myFileStream.Read(iv, 0, iv.Length);

            using (var cryptoStream = new CryptoStream(myFileStream, aes.CreateEncryptor(key, iv), CryptoStreamMode.Read))
            using (var copyStream = new MemoryStream())
            {
                cryptoStream.CopyTo(copyStream);

                var decrypted = Encoding.UTF8.GetString(copyStream.ToArray());

                Debug.Assert(dataToEncrypt == decrypted); // Fails!
            }
        }
    }
}

标签: c#encryption.net-coreaesencryption-symmetric

解决方案


我会看一下文档中的示例并与您的代码进行比较。

尤其是在解密时,您正在使用aes.CreateEncryptor(key, iv). 应该是aes.CreateDecryptor(key, iv)

文档中的示例还在调用时输入了密钥和 IV CreateEncryptor,但我不确定是否需要这样做。

您可能不应该使用 sha256 从密码生成密钥。正确的方法是密钥派生算法。例如Rfc2898DeriveBytes


推荐阅读